1[require]
2GL >= 3.3
3GLSL >= 3.30
4GL_ARB_shader_storage_buffer_object
5GL_ARB_shader_atomic_counters
6
7[vertex shader passthrough]
8
9[fragment shader]
10#version 330
11#extension GL_ARB_shader_storage_buffer_object: require
12#extension GL_ARB_shader_atomic_counters: require
13
14layout(binding = 0, std430) buffer bufblock {
15	int array[64];
16	int value;
17};
18
19layout(binding = 0) uniform atomic_uint fail;
20
21out vec4 color;
22
23void main()
24{
25	int x = int(gl_FragCoord.x);
26	int y = int(gl_FragCoord.y);
27	int local_index = y * array.length() + x;
28	int v;
29
30	/* For value, every instance should get 2147483647. */
31	v = atomicMax(value, local_index);
32	if (v != 2147483647)
33		atomicCounterIncrement(fail);
34
35	if (value != 2147483647)
36		atomicCounterIncrement(fail);
37
38	if (local_index < array.length()) {
39		int first_expected = (local_index + 1) * -4;
40		int second_expected = local_index * 4;
41
42		/* The per-instance value should give the old value on the
43		 * first step.  This is expected to be the negative byte
44		 * offset of the next array element.
45		 */
46		v = atomicMax(array[local_index], second_expected);
47		if (v != first_expected)
48			atomicCounterIncrement(fail);
49
50		/* The per-instance value should give the new value on the
51		 * second step.  This is expected to be the byte offset of the
52		 * current array element.
53		 */
54		v = atomicExchange(array[local_index], first_expected);
55		if (v != second_expected)
56			atomicCounterIncrement(fail);
57
58		color = vec4(0.0, 1.0, 0.0, 1.0);
59	} else {
60		color = vec4(0.0, 0.0, 1.0, 1.0);
61	}
62}
63
64[test]
65atomic counters 1
66
67ssbo 0 260
68ssbo 0 subdata int 0 -4
69ssbo 0 subdata int 4 -8
70ssbo 0 subdata int 8 -12
71ssbo 0 subdata int 12 -16
72ssbo 0 subdata int 16 -20
73ssbo 0 subdata int 20 -24
74ssbo 0 subdata int 24 -28
75ssbo 0 subdata int 28 -32
76ssbo 0 subdata int 32 -36
77ssbo 0 subdata int 36 -40
78ssbo 0 subdata int 40 -44
79ssbo 0 subdata int 44 -48
80ssbo 0 subdata int 48 -52
81ssbo 0 subdata int 52 -56
82ssbo 0 subdata int 56 -60
83ssbo 0 subdata int 60 -64
84ssbo 0 subdata int 64 -68
85ssbo 0 subdata int 68 -72
86ssbo 0 subdata int 72 -76
87ssbo 0 subdata int 76 -80
88ssbo 0 subdata int 80 -84
89ssbo 0 subdata int 84 -88
90ssbo 0 subdata int 88 -92
91ssbo 0 subdata int 92 -96
92ssbo 0 subdata int 96 -100
93ssbo 0 subdata int 100 -104
94ssbo 0 subdata int 104 -108
95ssbo 0 subdata int 108 -112
96ssbo 0 subdata int 112 -116
97ssbo 0 subdata int 116 -120
98ssbo 0 subdata int 120 -124
99ssbo 0 subdata int 124 -128
100ssbo 0 subdata int 128 -132
101ssbo 0 subdata int 132 -136
102ssbo 0 subdata int 136 -140
103ssbo 0 subdata int 140 -144
104ssbo 0 subdata int 144 -148
105ssbo 0 subdata int 148 -152
106ssbo 0 subdata int 152 -156
107ssbo 0 subdata int 156 -160
108ssbo 0 subdata int 160 -164
109ssbo 0 subdata int 164 -168
110ssbo 0 subdata int 168 -172
111ssbo 0 subdata int 172 -176
112ssbo 0 subdata int 176 -180
113ssbo 0 subdata int 180 -184
114ssbo 0 subdata int 184 -188
115ssbo 0 subdata int 188 -192
116ssbo 0 subdata int 192 -196
117ssbo 0 subdata int 196 -200
118ssbo 0 subdata int 200 -204
119ssbo 0 subdata int 204 -208
120ssbo 0 subdata int 208 -212
121ssbo 0 subdata int 212 -216
122ssbo 0 subdata int 216 -220
123ssbo 0 subdata int 220 -224
124ssbo 0 subdata int 224 -228
125ssbo 0 subdata int 228 -232
126ssbo 0 subdata int 232 -236
127ssbo 0 subdata int 236 -240
128ssbo 0 subdata int 240 -244
129ssbo 0 subdata int 244 -248
130ssbo 0 subdata int 248 -252
131ssbo 0 subdata int 252 -256
132ssbo 0 subdata int 256 2147483647
133
134clear color 0.5 0.5 0.5 0.5
135clear
136
137draw rect -1 -1 2 2
138
139probe atomic counter 0 == 0
140