Skip to content

Commit 16d9fea

Browse files
Merge pull request #1463 from KhronosGroup/fix-1462
Implement a simple evaluator of specialization constants.
2 parents bdbef7b + 66afe8c commit 16d9fea

7 files changed

Lines changed: 623 additions & 48 deletions

File tree

Lines changed: 321 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,321 @@
1+
#version 450
2+
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
3+
4+
#ifndef SPIRV_CROSS_CONSTANT_ID_2
5+
#define SPIRV_CROSS_CONSTANT_ID_2 1
6+
#endif
7+
const int SONE = SPIRV_CROSS_CONSTANT_ID_2;
8+
#ifndef SPIRV_CROSS_CONSTANT_ID_3
9+
#define SPIRV_CROSS_CONSTANT_ID_3 2
10+
#endif
11+
const int STWO = SPIRV_CROSS_CONSTANT_ID_3;
12+
const int _10 = (SONE + STWO);
13+
const uint _13 = (uint(_10) + 0u);
14+
#ifndef SPIRV_CROSS_CONSTANT_ID_5
15+
#define SPIRV_CROSS_CONSTANT_ID_5 1u
16+
#endif
17+
const uint UONE = SPIRV_CROSS_CONSTANT_ID_5;
18+
const uint _15 = (_13 + UONE);
19+
#ifndef SPIRV_CROSS_CONSTANT_ID_6
20+
#define SPIRV_CROSS_CONSTANT_ID_6 2u
21+
#endif
22+
const uint UTWO = SPIRV_CROSS_CONSTANT_ID_6;
23+
const uint IADD = (_15 + UTWO);
24+
const uint _19 = (IADD - 5u);
25+
const uint _28 = (uint(SONE) + 0u);
26+
const uint ISUB = (UTWO - _28);
27+
const uint IMUL = (UTWO * UTWO);
28+
const uint _37 = (IMUL - 3u);
29+
const uint UDIV = (UTWO / UTWO);
30+
#ifndef SPIRV_CROSS_CONSTANT_ID_4
31+
#define SPIRV_CROSS_CONSTANT_ID_4 -2
32+
#endif
33+
const int SNEG_TWO = SPIRV_CROSS_CONSTANT_ID_4;
34+
const int SDIV = (STWO / SNEG_TWO);
35+
const int _52 = (SDIV + 2);
36+
#ifndef SPIRV_CROSS_CONSTANT_ID_7
37+
#define SPIRV_CROSS_CONSTANT_ID_7 -3
38+
#endif
39+
const int SNEG_THREE = SPIRV_CROSS_CONSTANT_ID_7;
40+
const int SMOD = (STWO % SNEG_THREE);
41+
const int _66 = (SMOD + 2);
42+
const uint UMOD = (IADD % IMUL);
43+
const uint _73 = (UMOD - 1u);
44+
const uint LSHL = (IADD << ISUB);
45+
const uint _81 = (LSHL - 11u);
46+
const uint RSHL = (IADD >> ISUB);
47+
const uint _89 = (RSHL - 2u);
48+
const int _95 = int(IADD + 0u);
49+
const int _96 = (-_95);
50+
const int _97 = (-SDIV);
51+
const int RSHA = (_96 >> _97);
52+
const int _100 = (RSHA + 4);
53+
const bool IEQ = (IADD == ISUB);
54+
const int _109 = IEQ ? 2 : 1;
55+
const bool INEQ = (IADD != ISUB);
56+
const int _116 = INEQ ? 1 : 2;
57+
const bool ULT = (IADD < ISUB);
58+
const int _123 = ULT ? 2 : 1;
59+
const bool ULE = (IADD <= ISUB);
60+
const int _130 = ULE ? 2 : 1;
61+
const bool UGT = (IADD > ISUB);
62+
const int _137 = UGT ? 1 : 2;
63+
const bool UGE = (IADD >= ISUB);
64+
const int _144 = UGE ? 1 : 2;
65+
const bool SLT = (SMOD < 1);
66+
const int _151 = SLT ? 1 : 2;
67+
const bool SLE = (SMOD <= 1);
68+
const int _158 = SLE ? 1 : 2;
69+
const bool SGT = (SMOD > 1);
70+
const int _165 = SGT ? 2 : 1;
71+
const bool SGE = (SMOD >= 1);
72+
const int _172 = SGE ? 2 : 1;
73+
const bool LOR = (IEQ || SLT);
74+
const int _179 = LOR ? 1 : 2;
75+
const bool LAND = (IEQ && SLT);
76+
const int _186 = LAND ? 2 : 1;
77+
const bool LNOT = (!LOR);
78+
const int _193 = LNOT ? 2 : 1;
79+
const uint AND = (IADD & IADD);
80+
const uint _200 = (AND - 5u);
81+
const uint OR = (IADD | ISUB);
82+
const uint _208 = (OR - 6u);
83+
const uint XOR = (IADD ^ IADD);
84+
const uint _215 = (XOR + 1u);
85+
const uint NOT = (~XOR);
86+
const uint _223 = (NOT - 4294967294u);
87+
const bool LEQ = (LAND == LNOT);
88+
const int _230 = LEQ ? 1 : 2;
89+
const bool LNEQ = (LAND != LNOT);
90+
const int _237 = LNEQ ? 2 : 1;
91+
const uint SEL = IEQ ? IADD : ISUB;
92+
#ifndef SPIRV_CROSS_CONSTANT_ID_0
93+
#define SPIRV_CROSS_CONSTANT_ID_0 true
94+
#endif
95+
const bool TRUE = SPIRV_CROSS_CONSTANT_ID_0;
96+
#ifndef SPIRV_CROSS_CONSTANT_ID_1
97+
#define SPIRV_CROSS_CONSTANT_ID_1 false
98+
#endif
99+
const bool FALSE = SPIRV_CROSS_CONSTANT_ID_1;
100+
101+
layout(binding = 0, std430) buffer SSBO_IAdd
102+
{
103+
float val[_19];
104+
float dummy;
105+
} IAdd;
106+
107+
layout(binding = 1, std430) buffer SSBO_ISub
108+
{
109+
float val[ISUB];
110+
float dummy;
111+
} ISub;
112+
113+
layout(binding = 2, std430) buffer SSBO_IMul
114+
{
115+
float val[_37];
116+
float dummy;
117+
} IMul;
118+
119+
layout(binding = 3, std430) buffer SSBO_UDiv
120+
{
121+
float val[UDIV];
122+
float dummy;
123+
} UDiv;
124+
125+
layout(binding = 4, std430) buffer SSBO_SDiv
126+
{
127+
float val[_52];
128+
float dummy;
129+
} SDiv;
130+
131+
layout(binding = 5, std430) buffer SSBO_SRem
132+
{
133+
float val[1];
134+
float dummy;
135+
} SRem;
136+
137+
layout(binding = 6, std430) buffer SSBO_SMod
138+
{
139+
float val[_66];
140+
float dummy;
141+
} SMod;
142+
143+
layout(binding = 7, std430) buffer SSBO_UMod
144+
{
145+
float val[_73];
146+
float dummy;
147+
} UMod;
148+
149+
layout(binding = 8, std430) buffer SSBO_LShl
150+
{
151+
float val[_81];
152+
float dummy;
153+
} LShl;
154+
155+
layout(binding = 9, std430) buffer SSBO_RShl
156+
{
157+
float val[_89];
158+
float dummy;
159+
} RShl;
160+
161+
layout(binding = 10, std430) buffer SSBO_RSha
162+
{
163+
float val[_100];
164+
float dummy;
165+
} RSha;
166+
167+
layout(binding = 11, std430) buffer SSBO_IEq
168+
{
169+
float val[_109];
170+
float dummy;
171+
} IEq;
172+
173+
layout(binding = 12, std430) buffer SSBO_INeq
174+
{
175+
float val[_116];
176+
float dummy;
177+
} INeq;
178+
179+
layout(binding = 13, std430) buffer SSBO_Ult
180+
{
181+
float val[_123];
182+
float dummy;
183+
} Ult;
184+
185+
layout(binding = 14, std430) buffer SSBO_Ule
186+
{
187+
float val[_130];
188+
float dummy;
189+
} Ule;
190+
191+
layout(binding = 15, std430) buffer SSBO_Ugt
192+
{
193+
float val[_137];
194+
float dummy;
195+
} Ugt;
196+
197+
layout(binding = 16, std430) buffer SSBO_Uge
198+
{
199+
float val[_144];
200+
float dummy;
201+
} Uge;
202+
203+
layout(binding = 17, std430) buffer SSBO_Slt
204+
{
205+
float val[_151];
206+
float dummy;
207+
} Slt;
208+
209+
layout(binding = 18, std430) buffer SSBO_Sle
210+
{
211+
float val[_158];
212+
float dummy;
213+
} Sle;
214+
215+
layout(binding = 19, std430) buffer SSBO_Sgt
216+
{
217+
float val[_165];
218+
float dummy;
219+
} Sgt;
220+
221+
layout(binding = 20, std430) buffer SSBO_Sge
222+
{
223+
float val[_172];
224+
float dummy;
225+
} Sge;
226+
227+
layout(binding = 21, std430) buffer SSBO_Lor
228+
{
229+
float val[_179];
230+
float dummy;
231+
} Lor;
232+
233+
layout(binding = 22, std430) buffer SSBO_Land
234+
{
235+
float val[_186];
236+
float dummy;
237+
} Land;
238+
239+
layout(binding = 23, std430) buffer SSBO_Lnot
240+
{
241+
float val[_193];
242+
float dummy;
243+
} Lnot;
244+
245+
layout(binding = 24, std430) buffer SSBO_And
246+
{
247+
float val[_200];
248+
float dummy;
249+
} And;
250+
251+
layout(binding = 24, std430) buffer SSBO_Or
252+
{
253+
float val[_208];
254+
float dummy;
255+
} Or;
256+
257+
layout(binding = 24, std430) buffer SSBO_Xor
258+
{
259+
float val[_215];
260+
float dummy;
261+
} Xor;
262+
263+
layout(binding = 25, std430) buffer SSBO_Not
264+
{
265+
float val[_223];
266+
float dummy;
267+
} Not;
268+
269+
layout(binding = 26, std430) buffer SSBO_Leq
270+
{
271+
float val[_230];
272+
float dummy;
273+
} Leq;
274+
275+
layout(binding = 27, std430) buffer SSBO_Lneq
276+
{
277+
float val[_237];
278+
float dummy;
279+
} Lneq;
280+
281+
layout(binding = 28, std430) buffer SSBO_Sel
282+
{
283+
float val[SEL];
284+
float dummy;
285+
} Sel;
286+
287+
void main()
288+
{
289+
IAdd.val[0] = 0.0;
290+
ISub.val[0] = 0.0;
291+
IMul.val[0] = 0.0;
292+
UDiv.val[0] = 0.0;
293+
SDiv.val[0] = 0.0;
294+
SRem.val[0] = 0.0;
295+
SMod.val[0] = 0.0;
296+
UMod.val[0] = 0.0;
297+
LShl.val[0] = 0.0;
298+
RShl.val[0] = 0.0;
299+
RSha.val[0] = 0.0;
300+
IEq.val[0] = 0.0;
301+
INeq.val[0] = 0.0;
302+
Ult.val[0] = 0.0;
303+
Ule.val[0] = 0.0;
304+
Ugt.val[0] = 0.0;
305+
Uge.val[0] = 0.0;
306+
Slt.val[0] = 0.0;
307+
Sle.val[0] = 0.0;
308+
Sgt.val[0] = 0.0;
309+
Sge.val[0] = 0.0;
310+
Lor.val[0] = 0.0;
311+
Land.val[0] = 0.0;
312+
Lnot.val[0] = 0.0;
313+
And.val[0] = 0.0;
314+
Or.val[0] = 0.0;
315+
Xor.val[0] = 0.0;
316+
Not.val[0] = 0.0;
317+
Leq.val[0] = 0.0;
318+
Lneq.val[0] = 0.0;
319+
Sel.val[0] = 0.0;
320+
}
321+

0 commit comments

Comments
 (0)