1#version 450 core
2
3#extension GL_KHR_memory_scope_semantics : enable
4#extension GL_EXT_shader_atomic_float: enable
5#pragma use_vulkan_memory_model
6
7layout(local_size_x = 16, local_size_y = 16) in;
8
9layout(binding = 0) buffer Buffer
10{
11    float dataf;
12    double datad;
13} buf;
14
15shared float  atomf;
16shared double atomd;
17
18layout(binding = 0, r32f) volatile coherent uniform image1D        fimage1D;
19layout(binding = 1, r32f) volatile coherent uniform image1DArray   fimage1DArray;
20layout(binding = 2, r32f) volatile coherent uniform image2D        fimage2D;
21layout(binding = 3, r32f) volatile coherent uniform image2DArray   fimage2DArray;
22layout(binding = 4, r32f) volatile coherent uniform image2DRect    fimage2DRect;
23layout(binding = 5, r32f) volatile coherent uniform imageCube      fimageCube;
24layout(binding = 6, r32f) volatile coherent uniform imageCubeArray fimageCubeArray;
25layout(binding = 9, r32f) volatile coherent uniform image3D        fimage3D;
26
27void main()
28{
29    //atomicAdd
30    float resultf = 0;
31    resultf = atomicAdd(atomf, 3.0);
32    resultf = atomicAdd(atomf, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
33    resultf = atomicAdd(buf.dataf, 3.0);
34    resultf = atomicAdd(buf.dataf, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
35
36    double resultd = 0;
37    resultd = atomicAdd(atomd, 3.0);
38    resultd = atomicAdd(atomd, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
39    resultd = atomicAdd(buf.datad, 3.0);
40    resultd = atomicAdd(buf.datad, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed);
41
42    //atomicExchange
43    resultf = atomicExchange(buf.dataf, resultf);
44    buf.dataf += resultf;
45    resultf = atomicExchange(buf.dataf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
46    buf.dataf += resultf;
47    resultf = atomicExchange(atomf, resultf);
48    buf.dataf += resultf;
49    resultf = atomicExchange(atomf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
50    buf.dataf += resultf;
51
52    resultd = atomicExchange(buf.datad, resultd);
53    buf.datad += resultd;
54    resultd = atomicExchange(buf.datad, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
55    buf.datad += resultd;
56    resultd = atomicExchange(atomd, resultd);
57    buf.datad += resultd;
58    resultd = atomicExchange(atomd, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
59    buf.datad += resultd;
60
61    //atomic load/store
62    resultf = atomicLoad(buf.dataf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
63    atomicStore(buf.dataf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
64    buf.dataf += resultf;
65
66    resultf = atomicLoad(atomf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
67    atomicStore(atomf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
68    buf.dataf += resultf;
69
70    resultd = atomicLoad(buf.datad, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
71    atomicStore(buf.datad, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
72    buf.datad += resultd;
73
74    resultd = atomicLoad(atomd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
75    atomicStore(atomd, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed);
76    buf.datad += resultd;
77
78    // image atomics on 1D:
79    atomf = imageAtomicAdd(fimage1D, int(0), 2.0);
80    buf.dataf += atomf;
81    atomf = imageAtomicAdd(fimage1D, int(1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
82    buf.dataf += atomf;
83
84    atomf = imageAtomicExchange(fimage1D, int(1), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
85    buf.dataf += atomf;
86
87    atomf = imageAtomicLoad(fimage1D, int(1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
88    buf.dataf += atomf;
89
90    imageAtomicStore(fimage1D, int(2), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
91    buf.dataf += atomf;
92
93    // image atomics on 1D Array:
94    atomf = imageAtomicAdd(fimage1DArray, ivec2(0,0), 2.0);
95    buf.dataf += atomf;
96    atomf = imageAtomicAdd(fimage1DArray, ivec2(1,1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
97    buf.dataf += atomf;
98
99    atomf = imageAtomicExchange(fimage1DArray, ivec2(1,0), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
100    buf.dataf += atomf;
101
102    atomf = imageAtomicLoad(fimage1DArray, ivec2(1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
103    buf.dataf += atomf;
104
105    imageAtomicStore(fimage1DArray, ivec2(2,2), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
106    buf.dataf += atomf;
107
108    // image atomics on 2D:
109    atomf = imageAtomicAdd(fimage2D, ivec2(0,0), 2.0);
110    buf.dataf += atomf;
111    atomf = imageAtomicAdd(fimage2D, ivec2(1,1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
112    buf.dataf += atomf;
113
114    atomf = imageAtomicExchange(fimage2D, ivec2(1,0), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
115    buf.dataf += atomf;
116
117    atomf = imageAtomicLoad(fimage2D, ivec2(1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
118    buf.dataf += atomf;
119
120    imageAtomicStore(fimage2D, ivec2(2,2), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
121    buf.dataf += atomf;
122
123    // image atomics on 2D Rect:
124    atomf = imageAtomicAdd(fimage2DRect, ivec2(0,0), 2.0);
125    buf.dataf += atomf;
126    atomf = imageAtomicAdd(fimage2DRect, ivec2(1,1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
127    buf.dataf += atomf;
128
129    atomf = imageAtomicExchange(fimage2DRect, ivec2(1,0), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
130    buf.dataf += atomf;
131
132    atomf = imageAtomicLoad(fimage2DRect, ivec2(1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
133    buf.dataf += atomf;
134
135    imageAtomicStore(fimage2DRect, ivec2(2,2), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
136    buf.dataf += atomf;
137
138    // image atomics on 2D Array:
139    atomf = imageAtomicAdd(fimage2DArray, ivec3(0,0,0), 2.0);
140    buf.dataf += atomf;
141    atomf = imageAtomicAdd(fimage2DArray, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
142    buf.dataf += atomf;
143
144    atomf = imageAtomicExchange(fimage2DArray, ivec3(1,0,1), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
145    buf.dataf += atomf;
146
147    atomf = imageAtomicLoad(fimage2DArray, ivec3(1,1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
148    buf.dataf += atomf;
149
150    imageAtomicStore(fimage2DArray, ivec3(2,2,0), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
151    buf.dataf += atomf;
152
153    // image atomics on Cube:
154    atomf = imageAtomicAdd(fimageCube, ivec3(0,0,0), 2.0);
155    buf.dataf += atomf;
156    atomf = imageAtomicAdd(fimageCube, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
157    buf.dataf += atomf;
158
159    atomf = imageAtomicExchange(fimageCube, ivec3(1,0,0), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
160    buf.dataf += atomf;
161
162    atomf = imageAtomicLoad(fimageCube, ivec3(1,1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
163    buf.dataf += atomf;
164
165    imageAtomicStore(fimageCube, ivec3(2,2,1), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
166    buf.dataf += atomf;
167
168    // image atomics on Cube Array:
169    atomf = imageAtomicAdd(fimageCubeArray, ivec3(0,0,0), 2.0);
170    buf.dataf += atomf;
171    atomf = imageAtomicAdd(fimageCubeArray, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
172    buf.dataf += atomf;
173
174    atomf = imageAtomicExchange(fimageCubeArray, ivec3(1,0,1), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
175    buf.dataf += atomf;
176
177    atomf = imageAtomicLoad(fimageCubeArray, ivec3(1,1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
178    buf.dataf += atomf;
179
180    imageAtomicStore(fimageCubeArray, ivec3(2,2,0), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
181    buf.dataf += atomf;
182
183    // image atomics on 3D:
184    atomf = imageAtomicAdd(fimage3D, ivec3(0,0,0), 2.0);
185    buf.dataf += atomf;
186    atomf = imageAtomicAdd(fimage3D, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed);
187    buf.dataf += atomf;
188
189    atomf = imageAtomicExchange(fimage3D, ivec3(1,0,1), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
190    buf.dataf += atomf;
191
192    atomf = imageAtomicLoad(fimage3D, ivec3(1,1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
193    buf.dataf += atomf;
194
195    imageAtomicStore(fimage3D, ivec3(2,2,0), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelaxed);
196    buf.dataf += atomf;
197}