Files
sanspie 5eb1832907
ci-platforms / darwin amd64 smoke (push) Skipped
ci / build (amd64, linux, ubuntu-24.04) (push) Failing after 15m28s
ci / release (push) Skipped
ci-platforms / windows amd64 smoke (push) Skipped
ci-platforms / darwin arm64 smoke (push) Skipped
ci / checks (push) Successful in 7m47s
Complete Stage 12 for v0.12.0
2026-11-05 11:46:53 +03:00

67 lines
2.3 KiB
Go

package material
import (
"encoding/binary"
"math"
"testing"
"aego/render/shader"
)
func TestStd140PackingZeroPaddingAndIntegerWidths(t *testing.T) {
sh := &Shader{Variants: []Variant{{Mask: 0}}, Schema: NewSchema([]shader.Param{
{Name: "Two", Kind: shader.KindVec2, Offset: 0, Default: [4]float32{1, 2}},
{Name: "Enabled", Kind: shader.KindBool, Offset: 8, Default: [4]float32{1}},
{Name: "Four", Kind: shader.KindVec4, Offset: 16, Default: [4]float32{3, 4, 5, 6}},
{Name: "Counter", Kind: shader.KindInt, Offset: 32, IntDefault: math.MaxInt32},
}, 48, 0)}
m, ok := New("packing", sh, 0, shader.BlendPremultiplied)
if !ok || len(m.data) != 48 {
t.Fatal("material block has the wrong size")
}
word := func(at int) uint32 { return binary.LittleEndian.Uint32(m.data[at:]) }
for at, want := range map[int]uint32{0: math.Float32bits(1), 4: math.Float32bits(2), 8: 1, 16: math.Float32bits(3), 20: math.Float32bits(4), 24: math.Float32bits(5), 28: math.Float32bits(6), 32: math.MaxInt32} {
if got := word(at); got != want {
t.Fatalf("word at %d = %#x, expected %#x", at, got, want)
}
}
checkPadding := func() {
t.Helper()
for _, span := range [][2]int{{12, 16}, {36, 48}} {
for i := span[0]; i < span[1]; i++ {
if m.data[i] != 0 {
t.Fatalf("nonzero std140 padding at %d", i)
}
}
}
}
checkPadding()
if !m.SetInt("Counter", math.MinInt32) || !m.Set("Enabled", [4]float32{0}) {
t.Fatal("typed scalar assignment failed")
}
if word(32) != 0x80000000 || word(8) != 0 {
t.Fatal("int/bool did not occupy exactly one 32-bit word")
}
checkPadding()
}
func TestStd140Vec3WriteDoesNotOverwriteFollowingScalar(t *testing.T) {
sh := &Shader{Variants: []Variant{{Mask: 0}}, Schema: NewSchema([]shader.Param{
{Name: "Head", Kind: shader.KindFloat, Offset: 0, Default: [4]float32{1}},
{Name: "Three", Kind: shader.KindVec3, Offset: 16},
{Name: "Tail", Kind: shader.KindFloat, Offset: 28, Default: [4]float32{0.25}},
}, 32, 0)}
m, _ := New("vec3", sh, 0, shader.BlendPremultiplied)
if !m.Set("Three", [4]float32{4, 5, 6, 999}) {
t.Fatal("vec3 assignment failed")
}
if got, _ := m.Get("Tail"); got[0] != 0.25 {
t.Fatalf("vec3 padding overwrote tail: %v", got)
}
for i := 4; i < 16; i++ {
if m.data[i] != 0 {
t.Fatalf("nonzero alignment padding at %d", i)
}
}
}