Merge pull request #2976 from jeremy-lunarg/hayes-fix-2975
[platform/upstream/glslang.git] / Test / glsl.450.subgroup.geom
1 #version 450\r
2 \r
3 vec4 undeclared_errors(vec4 f4)\r
4 {\r
5   vec4 result;\r
6   gl_SubgroupSize;               // ERROR, extension not enabled (basic)\r
7   gl_SubgroupInvocationID;       // ERROR, extension not enabled (basic)\r
8   subgroupBarrier();             // ERROR, extension not enabled (basic)\r
9   subgroupMemoryBarrier();       // ERROR, extension not enabled (basic)\r
10   subgroupMemoryBarrierBuffer(); // ERROR, extension not enabled (basic)\r
11   subgroupMemoryBarrierImage();  // ERROR, extension not enabled (basic)\r
12   subgroupElect();               // ERROR, extension not enabled (basic)\r
13   gl_NumSubgroups;               // ERROR, only defined in compute\r
14   gl_SubgroupID;                 // ERROR, only defined in compute\r
15   subgroupMemoryBarrierShared(); // ERROR, only defined in compute\r
16 \r
17   subgroupAll(true);        // ERROR extension not enabled (vote)\r
18   subgroupAny(false);       // ERROR extension not enabled (vote)\r
19   subgroupAllEqual(f4);     // ERROR extension not enabled (vote)\r
20 \r
21   gl_SubgroupEqMask;                        // ERROR extension not enabled (ballot)\r
22   gl_SubgroupGeMask;                        // ERROR extension not enabled (ballot)\r
23   gl_SubgroupGtMask;                        // ERROR extension not enabled (ballot)\r
24   gl_SubgroupLeMask;                        // ERROR extension not enabled (ballot)\r
25   gl_SubgroupLtMask;                        // ERROR extension not enabled (ballot)\r
26   subgroupBroadcast(f4, 0);                 // ERROR extension not enabled (ballot)\r
27   subgroupBroadcastFirst(f4);               // ERROR extension not enabled (ballot)\r
28   uvec4 ballot = subgroupBallot(false);     // ERROR extension not enabled (ballot)\r
29   subgroupInverseBallot(uvec4(0x1));        // ERROR extension not enabled (ballot)\r
30   subgroupBallotBitExtract(ballot, 0);      // ERROR extension not enabled (ballot)\r
31   subgroupBallotBitCount(ballot);           // ERROR extension not enabled (ballot)\r
32   subgroupBallotInclusiveBitCount(ballot);  // ERROR extension not enabled (ballot)\r
33   subgroupBallotExclusiveBitCount(ballot);  // ERROR extension not enabled (ballot)\r
34   subgroupBallotFindLSB(ballot);            // ERROR extension not enabled (ballot)\r
35   subgroupBallotFindMSB(ballot);            // ERROR extension not enabled (ballot)\r
36 \r
37   subgroupShuffle(f4, 0);           // ERROR extension not enabled (shuffle)\r
38   subgroupShuffleXor(f4, 0x1);      // ERROR extension not enabled (shuffle)\r
39   subgroupShuffleUp(f4, 1);         // ERROR extension not enabled (shuffle_relative)\r
40   subgroupShuffleDown(f4, 1);       // ERROR extension not enabled (shuffle_relative)\r
41 \r
42   result = subgroupAdd(f4);         // ERROR, extension not enabled (arith)\r
43   subgroupMul(f4);                  // ERROR, extension not enabled (arith)\r
44   subgroupMin(f4);                  // ERROR, extension not enabled (arith)\r
45   subgroupMax(f4);                  // ERROR, extension not enabled (arith)\r
46   subgroupAnd(ballot);              // ERROR, extension not enabled (arith)\r
47   subgroupOr(ballot);               // ERROR, extension not enabled (arith)\r
48   subgroupXor(ballot);              // ERROR, extension not enabled (arith)\r
49   subgroupInclusiveAdd(f4);         // ERROR, extension not enabled (arith)\r
50   subgroupInclusiveMul(f4);         // ERROR, extension not enabled (arith)\r
51   subgroupInclusiveMin(f4);         // ERROR, extension not enabled (arith)\r
52   subgroupInclusiveMax(f4);         // ERROR, extension not enabled (arith)\r
53   subgroupInclusiveAnd(ballot);     // ERROR, extension not enabled (arith)\r
54   subgroupInclusiveOr(ballot);      // ERROR, extension not enabled (arith)\r
55   subgroupInclusiveXor(ballot);     // ERROR, extension not enabled (arith)\r
56   subgroupExclusiveAdd(f4);         // ERROR, extension not enabled (arith)\r
57   subgroupExclusiveMul(f4);         // ERROR, extension not enabled (arith)\r
58   subgroupExclusiveMin(f4);         // ERROR, extension not enabled (arith)\r
59   subgroupExclusiveMax(f4);         // ERROR, extension not enabled (arith)\r
60   subgroupExclusiveAnd(ballot);     // ERROR, extension not enabled (arith)\r
61   subgroupExclusiveOr(ballot);      // ERROR, extension not enabled (arith)\r
62   subgroupExclusiveXor(ballot);     // ERROR, extension not enabled (arith)\r
63 \r
64   subgroupClusteredAdd(f4, 2);      // ERROR, extension not enabled (clustered)\r
65   subgroupClusteredMul(f4, 2);      // ERROR, extension not enabled (clustered)\r
66   subgroupClusteredMin(f4, 2);      // ERROR, extension not enabled (clustered)\r
67   subgroupClusteredMax(f4, 2);      // ERROR, extension not enabled (clustered)\r
68   subgroupClusteredAnd(ballot, 2);  // ERROR, extension not enabled (clustered)\r
69   subgroupClusteredOr(ballot, 2);   // ERROR, extension not enabled (clustered)\r
70   subgroupClusteredXor(ballot, 2);  // ERROR, extension not enabled (clustered)\r
71 \r
72   subgroupQuadBroadcast(f4, 0);     // ERROR, extension not enabled (quad)\r
73   subgroupQuadSwapHorizontal(f4);   // ERROR, extension not enabled (quad)\r
74   subgroupQuadSwapVertical(f4);     // ERROR, extension not enabled (quad)\r
75   subgroupQuadSwapDiagonal(f4);     // ERROR, extension not enabled (quad)\r
76 \r
77   uvec4 parti = subgroupPartitionNV(f4);                // ERROR, extension not enabled (partitioned)\r
78   subgroupPartitionedAddNV(f4, parti);                  // ERROR, extension not enabled (partitioned)\r
79   subgroupPartitionedMulNV(f4, parti);                  // ERROR, extension not enabled (partitioned)\r
80   subgroupPartitionedMinNV(f4, parti);                  // ERROR, extension not enabled (partitioned)\r
81   subgroupPartitionedMaxNV(f4, parti);                  // ERROR, extension not enabled (partitioned)\r
82   subgroupPartitionedAndNV(ballot, parti);              // ERROR, extension not enabled (partitioned)\r
83   subgroupPartitionedOrNV(ballot, parti);               // ERROR, extension not enabled (partitioned)\r
84   subgroupPartitionedXorNV(ballot, parti);              // ERROR, extension not enabled (partitioned)\r
85   subgroupPartitionedInclusiveAddNV(f4, parti);         // ERROR, extension not enabled (partitioned)\r
86   subgroupPartitionedInclusiveMulNV(f4, parti);         // ERROR, extension not enabled (partitioned)\r
87   subgroupPartitionedInclusiveMinNV(f4, parti);         // ERROR, extension not enabled (partitioned)\r
88   subgroupPartitionedInclusiveMaxNV(f4, parti);         // ERROR, extension not enabled (partitioned)\r
89   subgroupPartitionedInclusiveAndNV(ballot, parti);     // ERROR, extension not enabled (partitioned)\r
90   subgroupPartitionedInclusiveOrNV(ballot, parti);      // ERROR, extension not enabled (partitioned)\r
91   subgroupPartitionedInclusiveXorNV(ballot, parti);     // ERROR, extension not enabled (partitioned)\r
92   subgroupPartitionedExclusiveAddNV(f4, parti);         // ERROR, extension not enabled (partitioned)\r
93   subgroupPartitionedExclusiveMulNV(f4, parti);         // ERROR, extension not enabled (partitioned)\r
94   subgroupPartitionedExclusiveMinNV(f4, parti);         // ERROR, extension not enabled (partitioned)\r
95   subgroupPartitionedExclusiveMaxNV(f4, parti);         // ERROR, extension not enabled (partitioned)\r
96   subgroupPartitionedExclusiveAndNV(ballot, parti);     // ERROR, extension not enabled (partitioned)\r
97   subgroupPartitionedExclusiveOrNV(ballot, parti);      // ERROR, extension not enabled (partitioned)\r
98   subgroupPartitionedExclusiveXorNV(ballot, parti);     // ERROR, extension not enabled (partitioned)\r
99 \r
100   return result;\r
101 }\r
102 \r
103 #extension GL_KHR_shader_subgroup_basic: enable\r
104 layout(points) in;\r
105 layout(points, max_vertices = 1) out;\r
106 layout(set = 0, binding = 0, std430) buffer Output\r
107 {\r
108   uvec4 result[];\r
109 };\r
110 \r
111 void main (void)\r
112 {\r
113   result[gl_PrimitiveIDIn] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\r
114   subgroupBarrier();\r
115   subgroupMemoryBarrier();\r
116   subgroupMemoryBarrierBuffer();\r
117   subgroupMemoryBarrierImage();\r
118   subgroupElect();\r
119 }\r
120 \r
121 #extension GL_KHR_shader_subgroup_ballot: enable\r
122 void ballot_works(vec4 f4) {\r
123   gl_SubgroupEqMask;\r
124   gl_SubgroupGeMask;\r
125   gl_SubgroupGtMask;\r
126   gl_SubgroupLeMask;\r
127   gl_SubgroupLtMask;\r
128   subgroupBroadcast(f4, 0);\r
129   subgroupBroadcastFirst(f4);\r
130   uvec4 ballot = subgroupBallot(false);\r
131   subgroupInverseBallot(uvec4(0x1));\r
132   subgroupBallotBitExtract(ballot, 0);\r
133   subgroupBallotBitCount(ballot);\r
134   subgroupBallotInclusiveBitCount(ballot);\r
135   subgroupBallotExclusiveBitCount(ballot);\r
136   subgroupBallotFindLSB(ballot);\r
137   subgroupBallotFindMSB(ballot);\r
138 }\r
139 \r
140 #extension GL_KHR_shader_subgroup_vote: enable\r
141 void vote_works(vec4 f4)\r
142 {\r
143   subgroupAll(true);\r
144   subgroupAny(false);\r
145   subgroupAllEqual(f4);\r
146 }\r
147 \r
148 #extension GL_KHR_shader_subgroup_shuffle: enable\r
149 #extension GL_KHR_shader_subgroup_shuffle_relative: enable\r
150 void shuffle_works(vec4 f4)\r
151 {\r
152   subgroupShuffle(f4, 0);\r
153   subgroupShuffleXor(f4, 0x1);\r
154   subgroupShuffleUp(f4, 1);\r
155   subgroupShuffleDown(f4, 1);\r
156 }\r
157 \r
158 #extension GL_KHR_shader_subgroup_arithmetic: enable\r
159 void arith_works(vec4 f4)\r
160 {\r
161   uvec4 ballot;\r
162   subgroupAdd(f4);\r
163   subgroupMul(f4);\r
164   subgroupMin(f4);\r
165   subgroupMax(f4);\r
166   subgroupAnd(ballot);\r
167   subgroupOr(ballot);\r
168   subgroupXor(ballot);\r
169   subgroupInclusiveAdd(f4);\r
170   subgroupInclusiveMul(f4);\r
171   subgroupInclusiveMin(f4);\r
172   subgroupInclusiveMax(f4);\r
173   subgroupInclusiveAnd(ballot);\r
174   subgroupInclusiveOr(ballot);\r
175   subgroupInclusiveXor(ballot);\r
176   subgroupExclusiveAdd(f4);\r
177   subgroupExclusiveMul(f4);\r
178   subgroupExclusiveMin(f4);\r
179   subgroupExclusiveMax(f4);\r
180   subgroupExclusiveAnd(ballot);\r
181   subgroupExclusiveOr(ballot);\r
182   subgroupExclusiveXor(ballot);\r
183 }\r
184 \r
185 #extension GL_KHR_shader_subgroup_clustered: enable\r
186 void clustered_works(vec4 f4)\r
187 {\r
188   uvec4 ballot = uvec4(0x55,0,0,0);\r
189   subgroupClusteredAdd(f4, 2);\r
190   subgroupClusteredMul(f4, 2);\r
191   subgroupClusteredMin(f4, 2);\r
192   subgroupClusteredMax(f4, 2);\r
193   subgroupClusteredAnd(ballot, 2);\r
194   subgroupClusteredOr(ballot, 2);\r
195   subgroupClusteredXor(ballot, 2);\r
196 }\r
197 \r
198 #extension GL_KHR_shader_subgroup_quad: enable\r
199 void quad_works(vec4 f4)\r
200 {\r
201   subgroupQuadBroadcast(f4, 0);\r
202   subgroupQuadSwapHorizontal(f4);\r
203   subgroupQuadSwapVertical(f4);\r
204   subgroupQuadSwapDiagonal(f4);\r
205 }\r
206 \r
207 #extension GL_NV_shader_subgroup_partitioned: enable\r
208 void partitioned_works(vec4 f4)\r
209 {\r
210   uvec4 parti = subgroupPartitionNV(f4);\r
211   uvec4 ballot = uvec4(0x55,0,0,0);\r
212   subgroupPartitionedAddNV(f4, parti);\r
213   subgroupPartitionedMulNV(f4, parti);\r
214   subgroupPartitionedMinNV(f4, parti);\r
215   subgroupPartitionedMaxNV(f4, parti);\r
216   subgroupPartitionedAndNV(ballot, parti);\r
217   subgroupPartitionedOrNV(ballot, parti);\r
218   subgroupPartitionedXorNV(ballot, parti);\r
219   subgroupPartitionedInclusiveAddNV(f4, parti);\r
220   subgroupPartitionedInclusiveMulNV(f4, parti);\r
221   subgroupPartitionedInclusiveMinNV(f4, parti);\r
222   subgroupPartitionedInclusiveMaxNV(f4, parti);\r
223   subgroupPartitionedInclusiveAndNV(ballot, parti);\r
224   subgroupPartitionedInclusiveOrNV(ballot, parti);\r
225   subgroupPartitionedInclusiveXorNV(ballot, parti);\r
226   subgroupPartitionedExclusiveAddNV(f4, parti);\r
227   subgroupPartitionedExclusiveMulNV(f4, parti);\r
228   subgroupPartitionedExclusiveMinNV(f4, parti);\r
229   subgroupPartitionedExclusiveMaxNV(f4, parti);\r
230   subgroupPartitionedExclusiveAndNV(ballot, parti);\r
231   subgroupPartitionedExclusiveOrNV(ballot, parti);\r
232   subgroupPartitionedExclusiveXorNV(ballot, parti);\r
233 }\r
234 \r
235 // tests for NV_shader_sm_builtins\r
236 void sm_builtins_err()\r
237 {\r
238     gl_WarpsPerSMNV;    // ERROR, no extension\r
239     gl_SMCountNV;       // ERROR, no extension\r
240     gl_WarpIDNV;        // ERROR, no extension\r
241     gl_SMIDNV;          // ERROR, no extension\r
242 }\r
243 \r
244 #ifdef GL_NV_shader_sm_builtins\r
245 #extension GL_NV_shader_sm_builtins : enable\r
246 #endif\r
247 \r
248 void sm_builtins()\r
249 {\r
250     gl_WarpsPerSMNV;\r
251     gl_SMCountNV;\r
252     gl_WarpIDNV;\r
253     gl_SMIDNV;\r
254 }\r