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