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 140 141
|
[require]
GL >= 3.3
GLSL >= 3.30
GL_ARB_shader_storage_buffer_object
GL_ARB_shader_atomic_counters
GL_INTEL_shader_atomic_float_minmax
[vertex shader passthrough]
[fragment shader]
#version 330
#extension GL_ARB_shader_storage_buffer_object: require
#extension GL_ARB_shader_atomic_counters: require
#extension GL_INTEL_shader_atomic_float_minmax: require
layout(binding = 0, std430) buffer bufblock {
float array[64];
float value;
};
layout(binding = 0) uniform atomic_uint fail;
out vec4 color;
void main()
{
int x = int(gl_FragCoord.x);
int y = int(gl_FragCoord.y);
int local_index = y * array.length() + x;
float v;
/* For value, every instance should get 5. */
v = atomicMin(value, 7 + local_index);
if (v != 5)
atomicCounterIncrement(fail);
if (value != 5)
atomicCounterIncrement(fail);
if (local_index < int(array.length())) {
float first_expected = local_index * 4;
float second_expected = -first_expected;
/* The per-instance value should give the old value on the
* first step. This is expected to be the byte offset of the
* current 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 negative 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 float 0 0
ssbo 0 subdata float 4 4
ssbo 0 subdata float 8 8
ssbo 0 subdata float 12 12
ssbo 0 subdata float 16 16
ssbo 0 subdata float 20 20
ssbo 0 subdata float 24 24
ssbo 0 subdata float 28 28
ssbo 0 subdata float 32 32
ssbo 0 subdata float 36 36
ssbo 0 subdata float 40 40
ssbo 0 subdata float 44 44
ssbo 0 subdata float 48 48
ssbo 0 subdata float 52 52
ssbo 0 subdata float 56 56
ssbo 0 subdata float 60 60
ssbo 0 subdata float 64 64
ssbo 0 subdata float 68 68
ssbo 0 subdata float 72 72
ssbo 0 subdata float 76 76
ssbo 0 subdata float 80 80
ssbo 0 subdata float 84 84
ssbo 0 subdata float 88 88
ssbo 0 subdata float 92 92
ssbo 0 subdata float 96 96
ssbo 0 subdata float 100 100
ssbo 0 subdata float 104 104
ssbo 0 subdata float 108 108
ssbo 0 subdata float 112 112
ssbo 0 subdata float 116 116
ssbo 0 subdata float 120 120
ssbo 0 subdata float 124 124
ssbo 0 subdata float 128 128
ssbo 0 subdata float 132 132
ssbo 0 subdata float 136 136
ssbo 0 subdata float 140 140
ssbo 0 subdata float 144 144
ssbo 0 subdata float 148 148
ssbo 0 subdata float 152 152
ssbo 0 subdata float 156 156
ssbo 0 subdata float 160 160
ssbo 0 subdata float 164 164
ssbo 0 subdata float 168 168
ssbo 0 subdata float 172 172
ssbo 0 subdata float 176 176
ssbo 0 subdata float 180 180
ssbo 0 subdata float 184 184
ssbo 0 subdata float 188 188
ssbo 0 subdata float 192 192
ssbo 0 subdata float 196 196
ssbo 0 subdata float 200 200
ssbo 0 subdata float 204 204
ssbo 0 subdata float 208 208
ssbo 0 subdata float 212 212
ssbo 0 subdata float 216 216
ssbo 0 subdata float 220 220
ssbo 0 subdata float 224 224
ssbo 0 subdata float 228 228
ssbo 0 subdata float 232 232
ssbo 0 subdata float 236 236
ssbo 0 subdata float 240 240
ssbo 0 subdata float 244 244
ssbo 0 subdata float 248 248
ssbo 0 subdata float 252 252
ssbo 0 subdata float 256 5
clear color 0.5 0.5 0.5 0.5
clear
draw rect -1 -1 2 2
probe atomic counter 0 == 0
|