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