1package buffers
2
3import (
4 "errors"
5 "testing"
6)
7
8func committed(t *testing.T, p *Pool) *Buffer {
9 t.Helper()
10 b, e := p.Begin()
11 if e != nil {
12 t.Fatal(e)
13 }
14 acquire, e := p.Acquire(b)
15 if e != nil {
16 t.Fatal(e)
17 }
18 release, e := p.Commit(b)
19 if e != nil || release <= acquire {
20 t.Fatalf("points %d %d %v", acquire, release, e)
21 }
22 if e = p.Own(b); e != nil {
23 t.Fatal(e)
24 }
25 return b
26}
27func TestLatestReleasePoint(t *testing.T) {
28 p, e := New(1)
29 if e != nil {
30 t.Fatal(e)
31 }
32 b := committed(t, p)
33 old := b.ReleasePoint
34 if e = p.Release(b); e != nil {
35 t.Fatal(e)
36 }
37 if _, e = p.Begin(); !errors.Is(e, ErrNoBuffer) {
38 t.Fatalf("wl release authorized reuse: %v", e)
39 }
40 if e = p.Signal(b, old+1); !errors.Is(e, ErrTransition) {
41 t.Fatalf("future point: %v", e)
42 }
43 if e = p.Reuse(b, true); !errors.Is(e, ErrTransition) {
44 t.Fatalf("premature reuse: %v", e)
45 }
46 if e = p.Signal(b, old); e != nil {
47 t.Fatal(e)
48 }
49 if e = p.Reuse(b, false); !errors.Is(e, ErrTransition) {
50 t.Fatalf("missing GPU wait: %v", e)
51 }
52 if e = p.Reuse(b, true); e != nil {
53 t.Fatal(e)
54 }
55 b = committed(t, p)
56 if b.ReleasePoint <= old {
57 t.Fatal("release point not advanced")
58 }
59 if e = p.Signal(b, old); !errors.Is(e, ErrTransition) {
60 t.Fatalf("old point accepted: %v", e)
61 }
62 if _, e = p.Begin(); !errors.Is(e, ErrNoBuffer) {
63 t.Fatalf("old point allowed reuse: %v", e)
64 }
65 if e = p.Signal(b, b.ReleasePoint); e != nil {
66 t.Fatal(e)
67 }
68 // A late wl_buffer.release is diagnostic and cannot re-lock a signaled image.
69 if e = p.Release(b); e != nil {
70 t.Fatal(e)
71 }
72 if e = p.Reuse(b, true); e != nil {
73 t.Fatal(e)
74 }
75}
76func TestThreeBuffersOutOfOrderAndResize(t *testing.T) {
77 p, e := New(3)
78 if e != nil {
79 t.Fatal(e)
80 }
81 a, b, c := committed(t, p), committed(t, p), committed(t, p)
82 if _, e = p.Begin(); !errors.Is(e, ErrNoBuffer) {
83 t.Fatal(e)
84 }
85 if e = p.Signal(c, c.ReleasePoint); e != nil {
86 t.Fatal(e)
87 }
88 if e = p.Reuse(c, true); e != nil {
89 t.Fatal(e)
90 }
91 if got, e := p.Begin(); e != nil || got != c {
92 t.Fatalf("out-of-order point: %v %v", got, e)
93 }
94 if e = p.Resize(3); e != nil {
95 t.Fatal(e)
96 }
97 if e = p.Signal(b, b.ReleasePoint); e != nil {
98 t.Fatal(e)
99 }
100 if !p.Retirable(b) || p.Retirable(a) || p.Retirable(c) {
101 t.Fatal("retired generation ownership")
102 }
103 if e = p.Reuse(b, true); !errors.Is(e, ErrTransition) {
104 t.Fatalf("reused retired: %v", e)
105 }
106 for range 3 {
107 got, e := p.Begin()
108 if e != nil || got.Generation != 2 {
109 t.Fatalf("new generation: %v %v", got, e)
110 }
111 }
112 if _, e = p.Begin(); !errors.Is(e, ErrNoBuffer) {
113 t.Fatal(e)
114 }
115 if e = p.Remove(a); !errors.Is(e, ErrTransition) {
116 t.Fatal(e)
117 }
118 if e = p.Remove(b); e != nil {
119 t.Fatal(e)
120 }
121}
122func TestInvalidTransitions(t *testing.T) {
123 p, _ := New(1)
124 b := p.Buffers[0]
125 if _, e := p.Commit(b); !errors.Is(e, ErrTransition) {
126 t.Fatal(e)
127 }
128 if e := p.Signal(b, 0); !errors.Is(e, ErrTransition) {
129 t.Fatal(e)
130 }
131 if e := p.Release(&Buffer{}); !errors.Is(e, ErrTransition) {
132 t.Fatal(e)
133 }
134 b = committed(t, p)
135 if e := p.Signal(b, b.ReleasePoint); e != nil {
136 t.Fatal(e)
137 }
138 if e := p.Signal(b, b.ReleasePoint); !errors.Is(e, ErrTransition) {
139 t.Fatal(e)
140 }
141}