91 lines
2.5 KiB
Go
91 lines
2.5 KiB
Go
package generator
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"mxl-pattern-generator/kernels"
|
|
)
|
|
|
|
func TestWGPUSMPTEPattern(t *testing.T) {
|
|
const width, height = 1920, 1080
|
|
shader, err := kernels.Read("static/smpteBars.wgsl")
|
|
if err != nil {
|
|
t.Fatalf("read shader: %v", err)
|
|
}
|
|
g, err := NewWGPUGenerator(width, height, string(shader))
|
|
if err != nil {
|
|
t.Fatalf("init: %v", err)
|
|
}
|
|
defer g.Close()
|
|
|
|
buf := make([]byte, width*height*8/3)
|
|
if err := g.GenerateFrame(buf, 0); err != nil {
|
|
t.Fatalf("GenerateFrame: %v", err)
|
|
}
|
|
if err := g.GenerateFrame(buf, 1); err != nil {
|
|
t.Fatalf("GenerateFrame 2: %v", err)
|
|
}
|
|
|
|
tests := []struct {
|
|
name string
|
|
x, y int
|
|
wantY, wantCb, wantCr uint32
|
|
}{
|
|
{"top left gray flank", 100, 100, 414, 512, 512},
|
|
{"top white bar", 300, 100, 721, 512, 512},
|
|
{"top green bar", 960, 100, 534, 253, 207},
|
|
{"top right gray flank", 1800, 100, 414, 512, 512},
|
|
{"section 2 cyan flank", 100, 650, 754, 615, 64},
|
|
{"section 2 minus I", 300, 650, 244, 612, 395},
|
|
{"section 2 white", 600, 650, 721, 512, 512},
|
|
{"section 2 blue flank", 1800, 650, 127, 960, 471},
|
|
{"section 3 yellow flank", 100, 750, 877, 64, 553},
|
|
{"section 3 plus Q", 300, 750, 141, 697, 606},
|
|
{"section 3 red flank", 1800, 750, 250, 409, 960},
|
|
{"bottom gray flank", 100, 900, 195, 512, 512},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
y, cb, cr := sampleV210(buf, width, tt.x, tt.y)
|
|
if y != tt.wantY || cb != tt.wantCb || cr != tt.wantCr {
|
|
t.Fatalf("pixel (%d,%d): got %d/%d/%d, want %d/%d/%d",
|
|
tt.x, tt.y, y, cb, cr, tt.wantY, tt.wantCb, tt.wantCr)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestWGPUGeneratorUsesPaddedV210Rows(t *testing.T) {
|
|
const width, height = 100, 2
|
|
shader, err := kernels.Read("static/ebu75.wgsl")
|
|
if err != nil {
|
|
t.Fatalf("read shader: %v", err)
|
|
}
|
|
g, err := NewWGPUGenerator(width, height, string(shader))
|
|
if err != nil {
|
|
t.Fatalf("init: %v", err)
|
|
}
|
|
defer g.Close()
|
|
|
|
buf := make([]byte, V210FrameSize(width, height))
|
|
for i := range buf {
|
|
buf[i] = 0xff
|
|
}
|
|
if err := g.GenerateFrame(buf, 0); err != nil {
|
|
t.Fatalf("GenerateFrame: %v", err)
|
|
}
|
|
|
|
for y := 0; y < height; y++ {
|
|
gotY, gotCb, gotCr := sampleV210(buf, width, 0, y)
|
|
if gotY != 721 || gotCb != 512 || gotCr != 512 {
|
|
t.Fatalf("row %d first pixel = %d/%d/%d, want 721/512/512", y, gotY, gotCb, gotCr)
|
|
}
|
|
padding := buf[y*V210LineSize(width)+V210ActiveLineSize(width) : (y+1)*V210LineSize(width)]
|
|
for i, b := range padding {
|
|
if b != 0 {
|
|
t.Fatalf("row %d padding byte %d = %#x, want 0", y, i, b)
|
|
}
|
|
}
|
|
}
|
|
}
|