1package wayland
2
3import (
4 "math"
5 "testing"
6 "time"
7
8 "github.com/bnema/go-wayland-bindings/server/singlepixelbuffer"
9 "github.com/bnema/go-wayland-bindings/server/wayland"
10 "github.com/bnema/neferwl/internal/ports"
11)
12
13// A single-pixel buffer reaches the renderer as a 1x1 solid color, opaque
14// only when its alpha is full.
15func TestSinglePixelBuffer(t *testing.T) {
16 s, events, contents, dir := dmabufServer(t, ports.DMABufSupport{})
17 c := protocolClient(t, s, dir)
18 g, ok := c.Registry().FindGlobal("wp_single_pixel_buffer_manager_v1")
19 if !ok || g.Version != 1 {
20 t.Fatalf("global %+v", g)
21 }
22 mgr, err := bindWireID(c, g.Name, g.Interface, 1)
23 if err != nil {
24 t.Fatal(err)
25 }
26 w, surf, _ := surfaceMapper(t, c, events)()
27 solid := func(alpha uint32, red uint32) ports.SurfaceContent {
28 t.Helper()
29 buf := c.AllocateID()
30 registerProtocol(t, c, buf)
31 requestProtocol(t, c, mgr, singlepixelbuffer.WpSinglePixelBufferManagerV1RequestCreateU32RgbaBuffer, buf, red, uint32(0), uint32(0), alpha)
32 requestProtocol(t, c, surf, wayland.SurfaceRequestAttach, buf, int32(0), int32(0))
33 requestProtocol(t, c, surf, wayland.SurfaceRequestCommit)
34 if err := c.Roundtrip(); err != nil {
35 t.Fatal(err)
36 }
37 timeout := time.After(2 * time.Second)
38 for {
39 select {
40 case got := <-contents:
41 if got.ID == w.ID && got.Solid != nil {
42 return got
43 }
44 case <-timeout:
45 t.Fatal("no solid content")
46 }
47 }
48 }
49 got := solid(math.MaxUint32, 0)
50 if got.Width != 1 || got.Height != 1 || !got.Opaque || *got.Solid != (ports.SolidColor{A: 1}) {
51 t.Fatalf("opaque black = %+v solid %+v", got, got.Solid)
52 }
53 got = solid(math.MaxUint32/2, math.MaxUint32/2)
54 if got.Width != 1 || got.Height != 1 || got.Opaque {
55 t.Fatalf("translucent = %+v", got)
56 }
57 if want := float32(0.5); got.Solid.R != want || got.Solid.A != want || got.Solid.G != 0 || got.Solid.B != 0 {
58 t.Fatalf("translucent color = %+v", got.Solid)
59 }
60}