1#version 450 core
2
3#extension GL_ARB_gpu_shader_int64: enable
4#extension GL_EXT_shader_image_int64: enable
5#extension GL_KHR_memory_scope_semantics: enable
6#extension GL_ARB_sparse_texture2: enable
7
8layout(binding = 0, r64i)  uniform i64image1D i1D;
9layout(binding = 1, r64ui) uniform u64image2D u2D;
10layout(binding = 2, r64i)  uniform i64image3D i3D;
11layout(binding = 3, r64ui) uniform u64imageCube uCube;
12layout(binding = 4, r64i)  uniform i64imageBuffer iBuf;
13layout(binding = 5, r64ui) uniform u64image1DArray u1DArray;
14layout(binding = 6, r64i)  uniform i64image2DArray i2DArray;
15layout(binding = 7, r64ui) uniform u64imageCubeArray uCubeArray;
16layout(binding = 8, r64i)  uniform i64image2DRect i2DRect;
17layout(binding = 9, r64ui) uniform u64image2DMS u2DMS;
18layout(binding = 10, r64i) uniform i64image2DMSArray i2DMSArray;
19
20layout(binding = 11) buffer Buf
21{
22    int64_t i64;
23    uint64_t u64;
24    i64vec4 i64v4;
25    u64vec4 u64v4;
26    ivec4 i32v4;
27};
28
29void main()
30{
31    i64 = imageAtomicAdd(i1D, i32v4.x, i64);
32    i64 = imageAtomicMin(i3D, i32v4.xyz, i64);
33    i64 = imageAtomicMax(iBuf, i32v4.x, i64);
34    i64 = imageAtomicAnd(i2DArray, i32v4.xyz, i64);
35    i64 = imageAtomicOr(i2DRect, i32v4.xy, i64);
36    i64 = imageAtomicXor(i2DMSArray, i32v4.xyz, i32v4.w, i64);
37    i64 = imageAtomicExchange(i1D, i32v4.x, i64);
38    i64 = imageAtomicCompSwap(i3D, i32v4.xyz, i64, i64 + 1);
39
40    i64 = imageAtomicAdd(i1D, i32v4.x, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
41    i64 = imageAtomicMin(i3D, i32v4.xyz, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
42    i64 = imageAtomicMax(iBuf, i32v4.x, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
43    i64 = imageAtomicAnd(i2DArray, i32v4.xyz, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
44    i64 = imageAtomicOr(i2DRect, i32v4.xy, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
45    i64 = imageAtomicXor(i2DMSArray, i32v4.xyz, i32v4.w, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
46    i64 = imageAtomicExchange(i1D, i32v4.x, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
47    i64 = imageAtomicCompSwap(i3D, i32v4.xyz, i64, i64 + 1, gl_ScopeDevice,
48            gl_StorageSemanticsImage, gl_SemanticsRelaxed, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
49    i64 = imageAtomicLoad(iBuf, i32v4.x, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
50    imageAtomicStore(i2DArray, i32v4.xyz, i64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
51
52    u64 = imageAtomicAdd(u2D, i32v4.xy, u64);
53    u64 = imageAtomicMin(uCube, i32v4.xyz, u64);
54    u64 = imageAtomicMax(u1DArray, i32v4.xy, u64);
55    u64 = imageAtomicAnd(uCubeArray, i32v4.xyz, u64);
56    u64 = imageAtomicOr(u2DMS, i32v4.xy, i32v4.z, u64);
57    u64 = imageAtomicXor(u2D, i32v4.xy, u64);
58    u64 = imageAtomicExchange(uCube, i32v4.xyz, u64);
59    u64 = imageAtomicCompSwap(u1DArray, i32v4.xy, u64, u64 + 1);
60
61    u64 = imageAtomicAdd(u2D, i32v4.xy, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
62    u64 = imageAtomicMin(uCube, i32v4.xyz, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
63    u64 = imageAtomicMax(u1DArray, i32v4.xy, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
64    u64 = imageAtomicAnd(uCubeArray, i32v4.xyz, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
65    u64 = imageAtomicOr(u2DMS, i32v4.xy, i32v4.z, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
66    u64 = imageAtomicXor(u2D, i32v4.xy, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
67    u64 = imageAtomicExchange(uCube, i32v4.xyz, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
68    u64 = imageAtomicCompSwap(u1DArray, i32v4.xy, u64, u64 + 1, gl_ScopeDevice,
69            gl_StorageSemanticsImage, gl_SemanticsRelaxed, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
70    u64 = imageAtomicLoad(uCubeArray, i32v4.xyz, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
71    imageAtomicStore(u2DMS, i32v4.xy, i32v4.z, u64, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
72
73    i64v4 += imageLoad(i1D, i32v4.x);
74    i64v4 += imageLoad(i3D, i32v4.xyz);
75    i64v4 += imageLoad(iBuf, i32v4.x);
76    i64v4 += imageLoad(i2DArray, i32v4.xyz);
77    i64v4 += imageLoad(i2DRect, i32v4.xy);
78    i64v4 += imageLoad(i2DMSArray, i32v4.xyz, i32v4.w);
79
80    imageStore(u2D, i32v4.xy, u64v4);
81    imageStore(uCube, i32v4.xyz, u64v4);
82    imageStore(u1DArray, i32v4.xy, u64v4);
83    imageStore(uCubeArray, i32v4.xyz, u64v4);
84    imageStore(u2DMS, i32v4.xy, i32v4.z, u64v4);
85
86    sparseImageLoadARB(i3D, i32v4.xyz, i64v4);
87    sparseImageLoadARB(i2DArray, i32v4.xyz, i64v4);
88    sparseImageLoadARB(i2DRect, i32v4.xy, i64v4);
89    sparseImageLoadARB(u2D, i32v4.xy, u64v4);
90    sparseImageLoadARB(uCube, i32v4.xyz, u64v4);
91    sparseImageLoadARB(uCubeArray, i32v4.xyz, u64v4);
92}