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