ARB_ubo/referenced-by-shader: pass if shader compiler moves UBOs between shaders
[piglit.git] / tests / spec / arb_compute_shader / execution / shared-atomicAdd-int.shader_test
blobd6e3ad9c544fcddacf12e11824086d9312a5e255
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 = atomicAdd(value, 4);
35         uint i = uint(f) / 4u;
36         uint bit = i % 32u;
37         uint m = 1u << bit;
39         if (i < 32u) {
40                 /* If the bit was already set, the test fails. */
41                 uint r = atomicOr(mask, m);
42                 if ((r & m) != 0u)
43                         atomicCounterIncrement(fail);
45                 /* Once all 32 bits are set, the test passes. */
46                 if ((r | m) == 0xffffffffu)
47                         atomicCounterIncrement(pass);
48         } else {
49                 atomicCounterIncrement(fail);
50         }
53 [test]
54 atomic counters 2
55 compute 2 3 4
56 probe atomic counter 0 == 24
57 probe atomic counter 1 == 0