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