1package vulkan
2
3import (
4 "image/color"
5 "testing"
6
7 "github.com/bnema/neferwl/internal/ports"
8)
9
10// Frames drawn into exported targets reach their dmabufs: another renderer
11// importing a target (as KMS scans it out) sees the frame, and readback
12// reads the target drawn last.
13func TestExportTargets(t *testing.T) {
14 r, err := New(64, 32)
15 if err != nil {
16 t.Skipf("Vulkan unavailable: %v", err)
17 }
18 defer r.Close()
19 bufs, err := r.ExportTargets(2, nil)
20 if err != nil {
21 t.Skipf("no exportable targets: %v", err)
22 }
23 defer func() {
24 for _, b := range bufs {
25 b.Planes[0].File.Close()
26 }
27 }()
28 if len(bufs) != 2 || bufs[0].Width != 64 || bufs[0].Format != fourccXRGB || bufs[0].Planes[0].Stride < 64*4 {
29 t.Fatalf("targets %+v", bufs)
30 }
31 colors := []string{"#ff0000", "#0000ff"}
32 for i, c := range colors {
33 r.UseTarget(i)
34 if err := render(r, ports.Scene{Background: c}, nil); err != nil {
35 t.Fatal(err)
36 }
37 }
38 if got := r.Pixels().At(3, 3); got != (color.RGBA{0, 0, 255, 255}) {
39 t.Fatalf("readback of the last target %v", got)
40 }
41 // Import target 0 as a client buffer, like the display would.
42 viewer, err := New(64, 32)
43 if err != nil {
44 t.Fatal(err)
45 }
46 defer viewer.Close()
47 b := bufs[0]
48 b.ID = 1
49 importable := false
50 for _, f := range viewer.DMABuf().Formats {
51 importable = importable || f.Format == b.Format && f.Modifier == b.Modifier
52 }
53 if !importable {
54 t.Skipf("modifier %#x not importable", b.Modifier)
55 }
56 scene := ports.Scene{Background: "#000000", Windows: []ports.SceneWindow{{ID: 1, Rect: ports.Rect{W: 64, H: 32}}}}
57 contents := map[ports.WindowID]ports.SurfaceContent{1: {ID: 1, Width: 64, Height: 32, Opaque: true, DMABuf: &b}}
58 if err := render(viewer, scene, contents); err != nil {
59 t.Fatal(err)
60 }
61 if got := viewer.Pixels().At(10, 10); got != (color.RGBA{255, 0, 0, 255}) {
62 t.Fatalf("target 0 as seen by the display %v", got)
63 }
64}