ext_gpu_shader4: add compiler tests for everything
[piglit.git] / tests / spec / arb_compute_shader / execution / shared-atomicCompSwap-int.shader_test
blobb5b691cf4cefefe8c795d3cc15681da4aa60b2c1
1 [require]
2 GL >= 3.3
3 GLSL >= 3.30
4 GL_ARB_compute_shader
5 GL_ARB_shader_atomic_counters
7 [compute shader]
8 #version 330
9 #extension GL_ARB_compute_shader: require
10 #extension GL_ARB_shader_atomic_counters: require
12 layout(local_size_x = 32) in;
14 shared int value;
15 shared uint mask;
17 layout(binding = 0) uniform atomic_uint pass;
18 layout(binding = 0) uniform atomic_uint fail;
20 void main()
22         if (gl_LocalInvocationIndex == 0u) {
23                 value = 0;
24                 mask = 0u;
25         }
27         barrier();
29         /* Each local invocation should see a unique value.  Each value
30          * observed is tracked in "mask."  The test automatically fails if a
31          * duplicate value is observed.  The test passes once all 32 possible
32          * values have been observed.
33          */
34         int f = value;
35         int a;
37         /* This is an open-coded atomicAdd. */
38         do {
39                 a = f;
40         } while ((f = atomicCompSwap(value, f, f + 4)) != a);
42         uint i = uint(f) / 4u;
43         uint bit = i % 32u;
44         uint m = 1u << bit;
46         if (i < 32u) {
47                 /* If the bit was already set, the test fails. */
48                 uint r = atomicOr(mask, m);
49                 if ((r & m) != 0u)
50                         atomicCounterIncrement(fail);
52                 /* Once all 32 bits are set, the test passes. */
53                 if ((r | m) == 0xffffffffu)
54                         atomicCounterIncrement(pass);
55         } else {
56                 atomicCounterIncrement(fail);
57         }
60 [test]
61 atomic counters 2
62 compute 2 3 4
63 probe atomic counter 0 == 24
64 probe atomic counter 1 == 0