• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#version 450
2
3layout(local_size_x = 1) in;
4
5layout(constant_id = 0) const bool TRUE = true;
6layout(constant_id = 1) const bool FALSE = false;
7layout(constant_id = 2) const int SONE = 1;
8layout(constant_id = 3) const int STWO = 2;
9layout(constant_id = 4) const int SNEG_TWO = -2;
10layout(constant_id = 5) const uint UONE = 1;
11layout(constant_id = 6) const uint UTWO = 2;
12layout(constant_id = 7) const int SNEG_THREE = -3;
13
14const uint IADD = SONE + STWO + UONE + UTWO; // 6
15const uint ISUB = UTWO - SONE;               // 1
16const uint IMUL = UTWO * UTWO;               // 4
17const uint UDIV = UTWO / UTWO;               // 1
18const int SDIV = STWO / SNEG_TWO;            // -1
19//const int SREM = STWO % SNEG_THREE;          // 1
20const int SREM = 1;
21const int SMOD = STWO % SNEG_THREE;          // -1
22const uint UMOD = IADD % IMUL;               // 2
23
24const uint LSHL = IADD << ISUB;              // 12
25const uint RSHL = IADD >> ISUB;              // 3
26const int RSHA = (-int(IADD)) >> (-SDIV);         // -3
27
28const bool IEQ = IADD == ISUB;               // false
29const bool INEQ = IADD != ISUB;              // true
30const bool ULT = IADD < ISUB;                // false
31const bool ULE = IADD <= ISUB;               // false
32const bool UGT = IADD > ISUB;                // true
33const bool UGE = IADD >= ISUB;               // true
34
35const bool SLT = SMOD < SREM;                // true
36const bool SLE = SMOD <= SREM;               // true
37const bool SGT = SMOD > SREM;                // false
38const bool SGE = SMOD >= SREM;               // false
39
40const bool LOR = IEQ || SLT;                 // true
41const bool LAND = IEQ && SLT;                // false
42const bool LNOT = !LOR;                      // false
43
44const uint AND = IADD & IADD;                // 6
45const uint OR = IADD | ISUB;                 // 7
46const uint XOR = IADD ^ IADD;                // 0
47const uint NOT = ~XOR;                       // UINT_MAX
48
49const bool LEQ = LAND == LNOT;               // true
50const bool LNEQ = LAND != LNOT;              // false
51
52const uint SEL = IEQ ? IADD : ISUB;          // 1
53
54#define DUMMY_SSBO(name, bind, size) layout(std430, set = 0, binding = bind) buffer SSBO_##name { float val[size]; float dummy; } name
55
56// Normalize all sizes to 1 element so that the default offsets in glslang matches up with what we should be computing.
57// If we do it right, we should get no layout(offset = N) expressions.
58DUMMY_SSBO(IAdd, 0, IADD - 5);
59DUMMY_SSBO(ISub, 1, ISUB);
60DUMMY_SSBO(IMul, 2, IMUL - 3);
61DUMMY_SSBO(UDiv, 3, UDIV);
62DUMMY_SSBO(SDiv, 4, SDIV + 2);
63DUMMY_SSBO(SRem, 5, SREM);
64DUMMY_SSBO(SMod, 6, SMOD + 2);
65DUMMY_SSBO(UMod, 7, UMOD - 1);
66DUMMY_SSBO(LShl, 8, LSHL - 11);
67DUMMY_SSBO(RShl, 9, RSHL - 2);
68DUMMY_SSBO(RSha, 10, RSHA + 4);
69DUMMY_SSBO(IEq, 11, IEQ ? 2 : 1);
70DUMMY_SSBO(INeq, 12, INEQ ? 1 : 2);
71DUMMY_SSBO(Ult, 13, ULT ? 2 : 1);
72DUMMY_SSBO(Ule, 14, ULE ? 2 : 1);
73DUMMY_SSBO(Ugt, 15, UGT ? 1 : 2);
74DUMMY_SSBO(Uge, 16, UGE ? 1 : 2);
75DUMMY_SSBO(Slt, 17, SLT ? 1 : 2);
76DUMMY_SSBO(Sle, 18, SLE ? 1 : 2);
77DUMMY_SSBO(Sgt, 19, SGT ? 2 : 1);
78DUMMY_SSBO(Sge, 20, SGE ? 2 : 1);
79DUMMY_SSBO(Lor, 21, LOR ? 1 : 2);
80DUMMY_SSBO(Land, 22, LAND ? 2 : 1);
81DUMMY_SSBO(Lnot, 23, LNOT ? 2 : 1);
82DUMMY_SSBO(And, 24, AND - 5);
83DUMMY_SSBO(Or, 24, OR - 6);
84DUMMY_SSBO(Xor, 24, XOR + 1);
85DUMMY_SSBO(Not, 25, NOT - 0xfffffffeu);
86DUMMY_SSBO(Leq, 26, LEQ ? 1 : 2);
87DUMMY_SSBO(Lneq, 27, LNEQ ? 2 : 1);
88DUMMY_SSBO(Sel, 28, SEL);
89
90void main()
91{
92	IAdd.val[0] = 0.0;
93	ISub.val[0] = 0.0;
94	IMul.val[0] = 0.0;
95	UDiv.val[0] = 0.0;
96	SDiv.val[0] = 0.0;
97	SRem.val[0] = 0.0;
98	SMod.val[0] = 0.0;
99	UMod.val[0] = 0.0;
100	LShl.val[0] = 0.0;
101	RShl.val[0] = 0.0;
102	RSha.val[0] = 0.0;
103	IEq.val[0] = 0.0;
104	INeq.val[0] = 0.0;
105	Ult.val[0] = 0.0;
106	Ule.val[0] = 0.0;
107	Ugt.val[0] = 0.0;
108	Uge.val[0] = 0.0;
109	Slt.val[0] = 0.0;
110	Sle.val[0] = 0.0;
111	Sgt.val[0] = 0.0;
112	Sge.val[0] = 0.0;
113	Lor.val[0] = 0.0;
114	Land.val[0] = 0.0;
115	Lnot.val[0] = 0.0;
116	And.val[0] = 0.0;
117	Or.val[0] = 0.0;
118	Xor.val[0] = 0.0;
119	Not.val[0] = 0.0;
120	Leq.val[0] = 0.0;
121	Lneq.val[0] = 0.0;
122	Sel.val[0] = 0.0;
123}
124