Files
aego/tests/golden/material_test.go
sanspie 132ddeff70
ci / checks (push) Successful in 8m39s
ci / build (amd64, linux, ubuntu-24.04) (push) Successful in 12m19s
ci-platforms / darwin amd64 smoke (push) Skipped
ci-platforms / windows amd64 smoke (push) Skipped
ci-platforms / darwin arm64 smoke (push) Skipped
ci / release (push) Successful in 8m54s
Stage 12a1: shader ABI, shader import and material runtime (D367, D368, D380, D381, D393)
Shader ABI 1: ub0 frame (16 B), ub1 view (112 B), ub2 material, ub3 mesh
draw; tex0 main, tex1 reserved, tex2-tex7 user; @instance lanes in
vertex slot 1 at locations 4-7, 64 bytes a sprite. The engine sprite,
sprite3d, debug and mesh shaders move to it, and engine includes
sprite, color, noise and lighting ship under engine/res/shaders/include.

.aeshader files import into an AESH artifact with every variant in both
GLSL dialects and a line map; errors are SHD001-SHD009 mapped back to the
source file and line, also for driver compile logs. A failed reimport
keeps the last good shader. .aemat materials (MAT001-MAT004) reference a
shader and textures and are reimported when their shader changes. The
material cache in render/material binds a material with no allocations,
retires replaced shaders, moves materials to a reimported shader in
place (D393) and re-uploads every material after a WebGL context
restore. make ci requires glslangValidator (D367).

web-bench, baseline retaken on nodea in both GPU modes, the same numbers
in swiftshader and hardware, Chromium and Firefox:
- the frame UBO is uploaded once a frame: buffer uploads 2 -> 3 a frame;
- the view UBO is 112 bytes instead of 64: buffer KB 0.372 -> 0.434
  a frame (+16 B frame, +48 B view);
- fewer SetUniformBuffer calls a batch: the sprite pass no longer binds
  the view per batch, frame and view are bound once per view; the GL
  state cache already deduped that bind, so WebGL calls go 50.49 ->
  52.49 a frame with the two new frame-UBO calls, draws 3.31 unchanged;
- buffer KB from lanes is unchanged: the demo has no @instance material.
Frame time and Go bytes in the engine frame (357 -> 342) do not regress.

wasm size, gzip: playground 6.46 -> 6.50 MB, try 6.98 -> 7.01 MB, web
runtime 6.05 -> 6.07 MB (total 27.27 -> 27.46, 29.54 -> 29.67,
25.56 -> 25.65 MB).
2026-10-28 01:23:11 +03:00

45 lines
1.2 KiB
Go

//go:build aego_golden
package golden
import (
"testing"
"aego/app/playground"
"aego/core/mathx"
"aego/gpu"
"aego/render"
"aego/render/sprite"
"aego/render/texture"
)
// materialCases draw the playground's bench material, which reads aego_time and a parameter, at the bench's pinned time; web-smoke draws it on WebGL2.
func materialCases(t *testing.T, r *render.Renderer) []testCase {
t.Helper()
m, err := playground.BenchMaterial()
if err != nil {
t.Fatal(err)
}
white, err := r.Textures().Upload(texture.Solid(8, 8, mathx.Color{R: 1, G: 1, B: 1, A: 1}), texture.UploadOptions{})
if err != nil {
t.Fatal(err)
}
solid := texture.Whole(white, 8, 8)
clock := playground.BenchClock
caseClocks["material_time"] = &clock
return []testCase{{"material_time", 2, func(r *render.Renderer, tgt gpu.TextureHandle) {
f := r.View(targetView(tgt, mathx.Color{R: 0.07, G: 0.08, B: 0.1, A: 1}))
for i := 0; i < 16; i++ {
f.Sprite(sprite.Draw{
Region: solid,
Position: mathx.Vec2{X: float32(i%4)*1.5 - 2.25, Y: float32(i/4)*1.5 - 2.25},
Size: mathx.Vec2{X: 1.2, Y: 1.2},
Origin: mathx.Vec2{X: 0.5, Y: 0.5},
Tint: mathx.Color{R: 1, G: 1 - float32(i)/16, B: float32(i) / 16, A: 1},
Material: m,
})
}
f.End()
}}}
}