1#version 450
2
3#extension GL_NV_shader_subgroup_partitioned: enable
4#extension GL_EXT_shader_subgroup_extended_types_int8: enable
5#extension GL_EXT_shader_subgroup_extended_types_int16: enable
6#extension GL_EXT_shader_subgroup_extended_types_int64: enable
7#extension GL_EXT_shader_subgroup_extended_types_float16: enable
8
9layout (local_size_x = 8) in;
10
11layout(binding = 0) buffer Buffers
12{
13    i8vec4 i8;
14    u8vec4 u8;
15    i16vec4 i16;
16    u16vec4 u16;
17    i64vec4 i64;
18    u64vec4 u64;
19    f16vec4 f16;
20} data[4];
21
22void main()
23{
24    uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;
25
26    uvec4 ballot;
27    ballot = subgroupPartitionNV(data[0].i8.x);
28    ballot = subgroupPartitionNV(data[1].i8.xy);
29    ballot = subgroupPartitionNV(data[2].i8.xyz);
30    ballot = subgroupPartitionNV(data[3].i8);
31
32    ballot = subgroupPartitionNV(data[0].u8.x);
33    ballot = subgroupPartitionNV(data[1].u8.xy);
34    ballot = subgroupPartitionNV(data[2].u8.xyz);
35    ballot = subgroupPartitionNV(data[3].u8);
36
37    ballot = subgroupPartitionNV(data[0].i16.x);
38    ballot = subgroupPartitionNV(data[1].i16.xy);
39    ballot = subgroupPartitionNV(data[2].i16.xyz);
40    ballot = subgroupPartitionNV(data[3].i16);
41
42    ballot = subgroupPartitionNV(data[0].u16.x);
43    ballot = subgroupPartitionNV(data[1].u16.xy);
44    ballot = subgroupPartitionNV(data[2].u16.xyz);
45    ballot = subgroupPartitionNV(data[3].u16);
46
47    ballot = subgroupPartitionNV(data[0].i64.x);
48    ballot = subgroupPartitionNV(data[1].i64.xy);
49    ballot = subgroupPartitionNV(data[2].i64.xyz);
50    ballot = subgroupPartitionNV(data[3].i64);
51
52    ballot = subgroupPartitionNV(data[0].u64.x);
53    ballot = subgroupPartitionNV(data[1].u64.xy);
54    ballot = subgroupPartitionNV(data[2].u64.xyz);
55    ballot = subgroupPartitionNV(data[3].u64);
56
57    ballot = subgroupPartitionNV(data[0].f16.x);
58    ballot = subgroupPartitionNV(data[1].f16.xy);
59    ballot = subgroupPartitionNV(data[2].f16.xyz);
60    ballot = subgroupPartitionNV(data[3].f16);
61
62    data[invocation].i8.x   = subgroupPartitionedAddNV(data[0].i8.x, ballot);
63    data[invocation].i8.xy  = subgroupPartitionedAddNV(data[1].i8.xy, ballot);
64    data[invocation].i8.xyz = subgroupPartitionedAddNV(data[2].i8.xyz, ballot);
65    data[invocation].i8     = subgroupPartitionedAddNV(data[3].i8, ballot);
66
67    data[invocation].i8.x   = subgroupPartitionedMulNV(data[0].i8.x, ballot);
68    data[invocation].i8.xy  = subgroupPartitionedMulNV(data[1].i8.xy, ballot);
69    data[invocation].i8.xyz = subgroupPartitionedMulNV(data[2].i8.xyz, ballot);
70    data[invocation].i8     = subgroupPartitionedMulNV(data[3].i8, ballot);
71
72    data[invocation].i8.x   = subgroupPartitionedMinNV(data[0].i8.x, ballot);
73    data[invocation].i8.xy  = subgroupPartitionedMinNV(data[1].i8.xy, ballot);
74    data[invocation].i8.xyz = subgroupPartitionedMinNV(data[2].i8.xyz, ballot);
75    data[invocation].i8     = subgroupPartitionedMinNV(data[3].i8, ballot);
76
77    data[invocation].i8.x   = subgroupPartitionedMaxNV(data[0].i8.x, ballot);
78    data[invocation].i8.xy  = subgroupPartitionedMaxNV(data[1].i8.xy, ballot);
79    data[invocation].i8.xyz = subgroupPartitionedMaxNV(data[2].i8.xyz, ballot);
80    data[invocation].i8     = subgroupPartitionedMaxNV(data[3].i8, ballot);
81
82    data[invocation].i8.x   = subgroupPartitionedAndNV(data[0].i8.x, ballot);
83    data[invocation].i8.xy  = subgroupPartitionedAndNV(data[1].i8.xy, ballot);
84    data[invocation].i8.xyz = subgroupPartitionedAndNV(data[2].i8.xyz, ballot);
85    data[invocation].i8     = subgroupPartitionedAndNV(data[3].i8, ballot);
86
87    data[invocation].i8.x   = subgroupPartitionedOrNV(data[0].i8.x, ballot);
88    data[invocation].i8.xy  = subgroupPartitionedOrNV(data[1].i8.xy, ballot);
89    data[invocation].i8.xyz = subgroupPartitionedOrNV(data[2].i8.xyz, ballot);
90    data[invocation].i8     = subgroupPartitionedOrNV(data[3].i8, ballot);
91
92    data[invocation].i8.x   = subgroupPartitionedXorNV(data[0].i8.x, ballot);
93    data[invocation].i8.xy  = subgroupPartitionedXorNV(data[1].i8.xy, ballot);
94    data[invocation].i8.xyz = subgroupPartitionedXorNV(data[2].i8.xyz, ballot);
95    data[invocation].i8     = subgroupPartitionedXorNV(data[3].i8, ballot);
96
97    data[invocation].u8.x   = subgroupPartitionedAddNV(data[0].u8.x, ballot);
98    data[invocation].u8.xy  = subgroupPartitionedAddNV(data[1].u8.xy, ballot);
99    data[invocation].u8.xyz = subgroupPartitionedAddNV(data[2].u8.xyz, ballot);
100    data[invocation].u8     = subgroupPartitionedAddNV(data[3].u8, ballot);
101
102    data[invocation].u8.x   = subgroupPartitionedMulNV(data[0].u8.x, ballot);
103    data[invocation].u8.xy  = subgroupPartitionedMulNV(data[1].u8.xy, ballot);
104    data[invocation].u8.xyz = subgroupPartitionedMulNV(data[2].u8.xyz, ballot);
105    data[invocation].u8     = subgroupPartitionedMulNV(data[3].u8, ballot);
106
107    data[invocation].u8.x   = subgroupPartitionedMinNV(data[0].u8.x, ballot);
108    data[invocation].u8.xy  = subgroupPartitionedMinNV(data[1].u8.xy, ballot);
109    data[invocation].u8.xyz = subgroupPartitionedMinNV(data[2].u8.xyz, ballot);
110    data[invocation].u8     = subgroupPartitionedMinNV(data[3].u8, ballot);
111
112    data[invocation].u8.x   = subgroupPartitionedMaxNV(data[0].u8.x, ballot);
113    data[invocation].u8.xy  = subgroupPartitionedMaxNV(data[1].u8.xy, ballot);
114    data[invocation].u8.xyz = subgroupPartitionedMaxNV(data[2].u8.xyz, ballot);
115    data[invocation].u8     = subgroupPartitionedMaxNV(data[3].u8, ballot);
116
117    data[invocation].u8.x   = subgroupPartitionedAndNV(data[0].u8.x, ballot);
118    data[invocation].u8.xy  = subgroupPartitionedAndNV(data[1].u8.xy, ballot);
119    data[invocation].u8.xyz = subgroupPartitionedAndNV(data[2].u8.xyz, ballot);
120    data[invocation].u8     = subgroupPartitionedAndNV(data[3].u8, ballot);
121
122    data[invocation].u8.x   = subgroupPartitionedOrNV(data[0].u8.x, ballot);
123    data[invocation].u8.xy  = subgroupPartitionedOrNV(data[1].u8.xy, ballot);
124    data[invocation].u8.xyz = subgroupPartitionedOrNV(data[2].u8.xyz, ballot);
125    data[invocation].u8     = subgroupPartitionedOrNV(data[3].u8, ballot);
126
127    data[invocation].u8.x   = subgroupPartitionedXorNV(data[0].u8.x, ballot);
128    data[invocation].u8.xy  = subgroupPartitionedXorNV(data[1].u8.xy, ballot);
129    data[invocation].u8.xyz = subgroupPartitionedXorNV(data[2].u8.xyz, ballot);
130    data[invocation].u8     = subgroupPartitionedXorNV(data[3].u8, ballot);
131
132    data[invocation].i16.x   = subgroupPartitionedAddNV(data[0].i16.x, ballot);
133    data[invocation].i16.xy  = subgroupPartitionedAddNV(data[1].i16.xy, ballot);
134    data[invocation].i16.xyz = subgroupPartitionedAddNV(data[2].i16.xyz, ballot);
135    data[invocation].i16     = subgroupPartitionedAddNV(data[3].i16, ballot);
136
137    data[invocation].i16.x   = subgroupPartitionedMulNV(data[0].i16.x, ballot);
138    data[invocation].i16.xy  = subgroupPartitionedMulNV(data[1].i16.xy, ballot);
139    data[invocation].i16.xyz = subgroupPartitionedMulNV(data[2].i16.xyz, ballot);
140    data[invocation].i16     = subgroupPartitionedMulNV(data[3].i16, ballot);
141
142    data[invocation].i16.x   = subgroupPartitionedMinNV(data[0].i16.x, ballot);
143    data[invocation].i16.xy  = subgroupPartitionedMinNV(data[1].i16.xy, ballot);
144    data[invocation].i16.xyz = subgroupPartitionedMinNV(data[2].i16.xyz, ballot);
145    data[invocation].i16     = subgroupPartitionedMinNV(data[3].i16, ballot);
146
147    data[invocation].i16.x   = subgroupPartitionedMaxNV(data[0].i16.x, ballot);
148    data[invocation].i16.xy  = subgroupPartitionedMaxNV(data[1].i16.xy, ballot);
149    data[invocation].i16.xyz = subgroupPartitionedMaxNV(data[2].i16.xyz, ballot);
150    data[invocation].i16     = subgroupPartitionedMaxNV(data[3].i16, ballot);
151
152    data[invocation].i16.x   = subgroupPartitionedAndNV(data[0].i16.x, ballot);
153    data[invocation].i16.xy  = subgroupPartitionedAndNV(data[1].i16.xy, ballot);
154    data[invocation].i16.xyz = subgroupPartitionedAndNV(data[2].i16.xyz, ballot);
155    data[invocation].i16     = subgroupPartitionedAndNV(data[3].i16, ballot);
156
157    data[invocation].i16.x   = subgroupPartitionedOrNV(data[0].i16.x, ballot);
158    data[invocation].i16.xy  = subgroupPartitionedOrNV(data[1].i16.xy, ballot);
159    data[invocation].i16.xyz = subgroupPartitionedOrNV(data[2].i16.xyz, ballot);
160    data[invocation].i16     = subgroupPartitionedOrNV(data[3].i16, ballot);
161
162    data[invocation].i16.x   = subgroupPartitionedXorNV(data[0].i16.x, ballot);
163    data[invocation].i16.xy  = subgroupPartitionedXorNV(data[1].i16.xy, ballot);
164    data[invocation].i16.xyz = subgroupPartitionedXorNV(data[2].i16.xyz, ballot);
165    data[invocation].i16     = subgroupPartitionedXorNV(data[3].i16, ballot);
166
167    data[invocation].u16.x   = subgroupPartitionedAddNV(data[0].u16.x, ballot);
168    data[invocation].u16.xy  = subgroupPartitionedAddNV(data[1].u16.xy, ballot);
169    data[invocation].u16.xyz = subgroupPartitionedAddNV(data[2].u16.xyz, ballot);
170    data[invocation].u16     = subgroupPartitionedAddNV(data[3].u16, ballot);
171
172    data[invocation].u16.x   = subgroupPartitionedMulNV(data[0].u16.x, ballot);
173    data[invocation].u16.xy  = subgroupPartitionedMulNV(data[1].u16.xy, ballot);
174    data[invocation].u16.xyz = subgroupPartitionedMulNV(data[2].u16.xyz, ballot);
175    data[invocation].u16     = subgroupPartitionedMulNV(data[3].u16, ballot);
176
177    data[invocation].u16.x   = subgroupPartitionedMinNV(data[0].u16.x, ballot);
178    data[invocation].u16.xy  = subgroupPartitionedMinNV(data[1].u16.xy, ballot);
179    data[invocation].u16.xyz = subgroupPartitionedMinNV(data[2].u16.xyz, ballot);
180    data[invocation].u16     = subgroupPartitionedMinNV(data[3].u16, ballot);
181
182    data[invocation].u16.x   = subgroupPartitionedMaxNV(data[0].u16.x, ballot);
183    data[invocation].u16.xy  = subgroupPartitionedMaxNV(data[1].u16.xy, ballot);
184    data[invocation].u16.xyz = subgroupPartitionedMaxNV(data[2].u16.xyz, ballot);
185    data[invocation].u16     = subgroupPartitionedMaxNV(data[3].u16, ballot);
186
187    data[invocation].u16.x   = subgroupPartitionedAndNV(data[0].u16.x, ballot);
188    data[invocation].u16.xy  = subgroupPartitionedAndNV(data[1].u16.xy, ballot);
189    data[invocation].u16.xyz = subgroupPartitionedAndNV(data[2].u16.xyz, ballot);
190    data[invocation].u16     = subgroupPartitionedAndNV(data[3].u16, ballot);
191
192    data[invocation].u16.x   = subgroupPartitionedOrNV(data[0].u16.x, ballot);
193    data[invocation].u16.xy  = subgroupPartitionedOrNV(data[1].u16.xy, ballot);
194    data[invocation].u16.xyz = subgroupPartitionedOrNV(data[2].u16.xyz, ballot);
195    data[invocation].u16     = subgroupPartitionedOrNV(data[3].u16, ballot);
196
197    data[invocation].u16.x   = subgroupPartitionedXorNV(data[0].u16.x, ballot);
198    data[invocation].u16.xy  = subgroupPartitionedXorNV(data[1].u16.xy, ballot);
199    data[invocation].u16.xyz = subgroupPartitionedXorNV(data[2].u16.xyz, ballot);
200    data[invocation].u16     = subgroupPartitionedXorNV(data[3].u16, ballot);
201
202    data[invocation].i64.x   = subgroupPartitionedAddNV(data[0].i64.x, ballot);
203    data[invocation].i64.xy  = subgroupPartitionedAddNV(data[1].i64.xy, ballot);
204    data[invocation].i64.xyz = subgroupPartitionedAddNV(data[2].i64.xyz, ballot);
205    data[invocation].i64     = subgroupPartitionedAddNV(data[3].i64, ballot);
206
207    data[invocation].i64.x   = subgroupPartitionedMulNV(data[0].i64.x, ballot);
208    data[invocation].i64.xy  = subgroupPartitionedMulNV(data[1].i64.xy, ballot);
209    data[invocation].i64.xyz = subgroupPartitionedMulNV(data[2].i64.xyz, ballot);
210    data[invocation].i64     = subgroupPartitionedMulNV(data[3].i64, ballot);
211
212    data[invocation].i64.x   = subgroupPartitionedMinNV(data[0].i64.x, ballot);
213    data[invocation].i64.xy  = subgroupPartitionedMinNV(data[1].i64.xy, ballot);
214    data[invocation].i64.xyz = subgroupPartitionedMinNV(data[2].i64.xyz, ballot);
215    data[invocation].i64     = subgroupPartitionedMinNV(data[3].i64, ballot);
216
217    data[invocation].i64.x   = subgroupPartitionedMaxNV(data[0].i64.x, ballot);
218    data[invocation].i64.xy  = subgroupPartitionedMaxNV(data[1].i64.xy, ballot);
219    data[invocation].i64.xyz = subgroupPartitionedMaxNV(data[2].i64.xyz, ballot);
220    data[invocation].i64     = subgroupPartitionedMaxNV(data[3].i64, ballot);
221
222    data[invocation].i64.x   = subgroupPartitionedAndNV(data[0].i64.x, ballot);
223    data[invocation].i64.xy  = subgroupPartitionedAndNV(data[1].i64.xy, ballot);
224    data[invocation].i64.xyz = subgroupPartitionedAndNV(data[2].i64.xyz, ballot);
225    data[invocation].i64     = subgroupPartitionedAndNV(data[3].i64, ballot);
226
227    data[invocation].i64.x   = subgroupPartitionedOrNV(data[0].i64.x, ballot);
228    data[invocation].i64.xy  = subgroupPartitionedOrNV(data[1].i64.xy, ballot);
229    data[invocation].i64.xyz = subgroupPartitionedOrNV(data[2].i64.xyz, ballot);
230    data[invocation].i64     = subgroupPartitionedOrNV(data[3].i64, ballot);
231
232    data[invocation].i64.x   = subgroupPartitionedXorNV(data[0].i64.x, ballot);
233    data[invocation].i64.xy  = subgroupPartitionedXorNV(data[1].i64.xy, ballot);
234    data[invocation].i64.xyz = subgroupPartitionedXorNV(data[2].i64.xyz, ballot);
235    data[invocation].i64     = subgroupPartitionedXorNV(data[3].i64, ballot);
236
237    data[invocation].u64.x   = subgroupPartitionedAddNV(data[0].u64.x, ballot);
238    data[invocation].u64.xy  = subgroupPartitionedAddNV(data[1].u64.xy, ballot);
239    data[invocation].u64.xyz = subgroupPartitionedAddNV(data[2].u64.xyz, ballot);
240    data[invocation].u64     = subgroupPartitionedAddNV(data[3].u64, ballot);
241
242    data[invocation].u64.x   = subgroupPartitionedMulNV(data[0].u64.x, ballot);
243    data[invocation].u64.xy  = subgroupPartitionedMulNV(data[1].u64.xy, ballot);
244    data[invocation].u64.xyz = subgroupPartitionedMulNV(data[2].u64.xyz, ballot);
245    data[invocation].u64     = subgroupPartitionedMulNV(data[3].u64, ballot);
246
247    data[invocation].u64.x   = subgroupPartitionedMinNV(data[0].u64.x, ballot);
248    data[invocation].u64.xy  = subgroupPartitionedMinNV(data[1].u64.xy, ballot);
249    data[invocation].u64.xyz = subgroupPartitionedMinNV(data[2].u64.xyz, ballot);
250    data[invocation].u64     = subgroupPartitionedMinNV(data[3].u64, ballot);
251
252    data[invocation].u64.x   = subgroupPartitionedMaxNV(data[0].u64.x, ballot);
253    data[invocation].u64.xy  = subgroupPartitionedMaxNV(data[1].u64.xy, ballot);
254    data[invocation].u64.xyz = subgroupPartitionedMaxNV(data[2].u64.xyz, ballot);
255    data[invocation].u64     = subgroupPartitionedMaxNV(data[3].u64, ballot);
256
257    data[invocation].u64.x   = subgroupPartitionedAndNV(data[0].u64.x, ballot);
258    data[invocation].u64.xy  = subgroupPartitionedAndNV(data[1].u64.xy, ballot);
259    data[invocation].u64.xyz = subgroupPartitionedAndNV(data[2].u64.xyz, ballot);
260    data[invocation].u64     = subgroupPartitionedAndNV(data[3].u64, ballot);
261
262    data[invocation].u64.x   = subgroupPartitionedOrNV(data[0].u64.x, ballot);
263    data[invocation].u64.xy  = subgroupPartitionedOrNV(data[1].u64.xy, ballot);
264    data[invocation].u64.xyz = subgroupPartitionedOrNV(data[2].u64.xyz, ballot);
265    data[invocation].u64     = subgroupPartitionedOrNV(data[3].u64, ballot);
266
267    data[invocation].u64.x   = subgroupPartitionedXorNV(data[0].u64.x, ballot);
268    data[invocation].u64.xy  = subgroupPartitionedXorNV(data[1].u64.xy, ballot);
269    data[invocation].u64.xyz = subgroupPartitionedXorNV(data[2].u64.xyz, ballot);
270    data[invocation].u64     = subgroupPartitionedXorNV(data[3].u64, ballot);
271
272    data[invocation].f16.x   = subgroupPartitionedAddNV(data[0].f16.x, ballot);
273    data[invocation].f16.xy  = subgroupPartitionedAddNV(data[1].f16.xy, ballot);
274    data[invocation].f16.xyz = subgroupPartitionedAddNV(data[2].f16.xyz, ballot);
275    data[invocation].f16     = subgroupPartitionedAddNV(data[3].f16, ballot);
276
277    data[invocation].f16.x   = subgroupPartitionedMulNV(data[0].f16.x, ballot);
278    data[invocation].f16.xy  = subgroupPartitionedMulNV(data[1].f16.xy, ballot);
279    data[invocation].f16.xyz = subgroupPartitionedMulNV(data[2].f16.xyz, ballot);
280    data[invocation].f16     = subgroupPartitionedMulNV(data[3].f16, ballot);
281
282    data[invocation].f16.x   = subgroupPartitionedMinNV(data[0].f16.x, ballot);
283    data[invocation].f16.xy  = subgroupPartitionedMinNV(data[1].f16.xy, ballot);
284    data[invocation].f16.xyz = subgroupPartitionedMinNV(data[2].f16.xyz, ballot);
285    data[invocation].f16     = subgroupPartitionedMinNV(data[3].f16, ballot);
286
287    data[invocation].f16.x   = subgroupPartitionedMaxNV(data[0].f16.x, ballot);
288    data[invocation].f16.xy  = subgroupPartitionedMaxNV(data[1].f16.xy, ballot);
289    data[invocation].f16.xyz = subgroupPartitionedMaxNV(data[2].f16.xyz, ballot);
290    data[invocation].f16     = subgroupPartitionedMaxNV(data[3].f16, ballot);
291}
292