1package vulkan
2
3import (
4 "image/color"
5 "testing"
6
7 "github.com/bnema/neferwl/internal/ports"
8)
9
10// Every wl_output.transform draws the buffer through its inverse: each
11// surface pixel shows the buffer pixel ToBuffer names, pixel exact at 1:1,
12// with and without a viewport crop.
13func TestRendererBufferTransform(t *testing.T) {
14 r, err := New(8, 8)
15 if err != nil {
16 t.Skipf("Vulkan unavailable: %v", err)
17 }
18 defer r.Close()
19 // 3×2 buffer, one colour per pixel.
20 colours := [2][3]color.RGBA{
21 {{255, 0, 0, 255}, {0, 255, 0, 255}, {0, 0, 255, 255}},
22 {{255, 255, 0, 255}, {0, 255, 255, 255}, {255, 0, 255, 255}},
23 }
24 var px []byte
25 for y := range 2 {
26 for x := range 3 {
27 c := colours[y][x]
28 px = append(px, c.B, c.G, c.R, 255)
29 }
30 }
31 for _, crop := range []bool{false, true} {
32 for tr := ports.BufferTransform(0); tr < 8; tr++ {
33 c := shmContent(t, 3, 2, 12, px)
34 // Crop: the buffer's right 2×2 pixels.
35 bx0, bw, bh := 0, 3, 2
36 if crop {
37 c.Source = [4]float32{1, 0, 2, 2}
38 bx0, bw = 1, 2
39 }
40 sw, sh := bw, bh
41 if tr.Rotated() {
42 sw, sh = bh, bw
43 }
44 c.Transform, c.LogicalW, c.LogicalH = tr, sw, sh
45 scene := ports.Scene{Background: "#000000", Windows: []ports.SceneWindow{{ID: 1, Rect: ports.Rect{W: sw, H: sh}}}}
46 if err := render(r, scene, map[ports.WindowID]ports.SurfaceContent{1: *c}); err != nil {
47 t.Fatal(err)
48 }
49 for y := range sh {
50 for x := range sw {
51 bx, by := tr.ToBuffer(float64(x)+0.5, float64(y)+0.5, float64(sw), float64(sh))
52 want := colours[int(by)][bx0+int(bx)]
53 if got := readPixels(t, r).RGBAAt(x, y); !near(got, want, 2) {
54 t.Errorf("crop=%v transform %d: surface (%d,%d) = %v, want %v", crop, tr, x, y, got, want)
55 }
56 }
57 }
58 }
59 }
60}