66afe8c499
In some cases, we need to get a literal value from a spec constant op. Mostly relevant when emitting buffers, so implement a 32-bit integer scalar subset of the evaluator. Can be extended as needed to support evaluating any specialization constant operation.
322 lines
6.5 KiB
Plaintext
322 lines
6.5 KiB
Plaintext
#version 450
|
|
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
|
|
|
#ifndef SPIRV_CROSS_CONSTANT_ID_2
|
|
#define SPIRV_CROSS_CONSTANT_ID_2 1
|
|
#endif
|
|
const int SONE = SPIRV_CROSS_CONSTANT_ID_2;
|
|
#ifndef SPIRV_CROSS_CONSTANT_ID_3
|
|
#define SPIRV_CROSS_CONSTANT_ID_3 2
|
|
#endif
|
|
const int STWO = SPIRV_CROSS_CONSTANT_ID_3;
|
|
const int _10 = (SONE + STWO);
|
|
const uint _13 = (uint(_10) + 0u);
|
|
#ifndef SPIRV_CROSS_CONSTANT_ID_5
|
|
#define SPIRV_CROSS_CONSTANT_ID_5 1u
|
|
#endif
|
|
const uint UONE = SPIRV_CROSS_CONSTANT_ID_5;
|
|
const uint _15 = (_13 + UONE);
|
|
#ifndef SPIRV_CROSS_CONSTANT_ID_6
|
|
#define SPIRV_CROSS_CONSTANT_ID_6 2u
|
|
#endif
|
|
const uint UTWO = SPIRV_CROSS_CONSTANT_ID_6;
|
|
const uint IADD = (_15 + UTWO);
|
|
const uint _19 = (IADD - 5u);
|
|
const uint _28 = (uint(SONE) + 0u);
|
|
const uint ISUB = (UTWO - _28);
|
|
const uint IMUL = (UTWO * UTWO);
|
|
const uint _37 = (IMUL - 3u);
|
|
const uint UDIV = (UTWO / UTWO);
|
|
#ifndef SPIRV_CROSS_CONSTANT_ID_4
|
|
#define SPIRV_CROSS_CONSTANT_ID_4 -2
|
|
#endif
|
|
const int SNEG_TWO = SPIRV_CROSS_CONSTANT_ID_4;
|
|
const int SDIV = (STWO / SNEG_TWO);
|
|
const int _52 = (SDIV + 2);
|
|
#ifndef SPIRV_CROSS_CONSTANT_ID_7
|
|
#define SPIRV_CROSS_CONSTANT_ID_7 -3
|
|
#endif
|
|
const int SNEG_THREE = SPIRV_CROSS_CONSTANT_ID_7;
|
|
const int SMOD = (STWO % SNEG_THREE);
|
|
const int _66 = (SMOD + 2);
|
|
const uint UMOD = (IADD % IMUL);
|
|
const uint _73 = (UMOD - 1u);
|
|
const uint LSHL = (IADD << ISUB);
|
|
const uint _81 = (LSHL - 11u);
|
|
const uint RSHL = (IADD >> ISUB);
|
|
const uint _89 = (RSHL - 2u);
|
|
const int _95 = int(IADD + 0u);
|
|
const int _96 = (-_95);
|
|
const int _97 = (-SDIV);
|
|
const int RSHA = (_96 >> _97);
|
|
const int _100 = (RSHA + 4);
|
|
const bool IEQ = (IADD == ISUB);
|
|
const int _109 = IEQ ? 2 : 1;
|
|
const bool INEQ = (IADD != ISUB);
|
|
const int _116 = INEQ ? 1 : 2;
|
|
const bool ULT = (IADD < ISUB);
|
|
const int _123 = ULT ? 2 : 1;
|
|
const bool ULE = (IADD <= ISUB);
|
|
const int _130 = ULE ? 2 : 1;
|
|
const bool UGT = (IADD > ISUB);
|
|
const int _137 = UGT ? 1 : 2;
|
|
const bool UGE = (IADD >= ISUB);
|
|
const int _144 = UGE ? 1 : 2;
|
|
const bool SLT = (SMOD < 1);
|
|
const int _151 = SLT ? 1 : 2;
|
|
const bool SLE = (SMOD <= 1);
|
|
const int _158 = SLE ? 1 : 2;
|
|
const bool SGT = (SMOD > 1);
|
|
const int _165 = SGT ? 2 : 1;
|
|
const bool SGE = (SMOD >= 1);
|
|
const int _172 = SGE ? 2 : 1;
|
|
const bool LOR = (IEQ || SLT);
|
|
const int _179 = LOR ? 1 : 2;
|
|
const bool LAND = (IEQ && SLT);
|
|
const int _186 = LAND ? 2 : 1;
|
|
const bool LNOT = (!LOR);
|
|
const int _193 = LNOT ? 2 : 1;
|
|
const uint AND = (IADD & IADD);
|
|
const uint _200 = (AND - 5u);
|
|
const uint OR = (IADD | ISUB);
|
|
const uint _208 = (OR - 6u);
|
|
const uint XOR = (IADD ^ IADD);
|
|
const uint _215 = (XOR + 1u);
|
|
const uint NOT = (~XOR);
|
|
const uint _223 = (NOT - 4294967294u);
|
|
const bool LEQ = (LAND == LNOT);
|
|
const int _230 = LEQ ? 1 : 2;
|
|
const bool LNEQ = (LAND != LNOT);
|
|
const int _237 = LNEQ ? 2 : 1;
|
|
const uint SEL = IEQ ? IADD : ISUB;
|
|
#ifndef SPIRV_CROSS_CONSTANT_ID_0
|
|
#define SPIRV_CROSS_CONSTANT_ID_0 true
|
|
#endif
|
|
const bool TRUE = SPIRV_CROSS_CONSTANT_ID_0;
|
|
#ifndef SPIRV_CROSS_CONSTANT_ID_1
|
|
#define SPIRV_CROSS_CONSTANT_ID_1 false
|
|
#endif
|
|
const bool FALSE = SPIRV_CROSS_CONSTANT_ID_1;
|
|
|
|
layout(binding = 0, std430) buffer SSBO_IAdd
|
|
{
|
|
float val[_19];
|
|
float dummy;
|
|
} IAdd;
|
|
|
|
layout(binding = 1, std430) buffer SSBO_ISub
|
|
{
|
|
float val[ISUB];
|
|
float dummy;
|
|
} ISub;
|
|
|
|
layout(binding = 2, std430) buffer SSBO_IMul
|
|
{
|
|
float val[_37];
|
|
float dummy;
|
|
} IMul;
|
|
|
|
layout(binding = 3, std430) buffer SSBO_UDiv
|
|
{
|
|
float val[UDIV];
|
|
float dummy;
|
|
} UDiv;
|
|
|
|
layout(binding = 4, std430) buffer SSBO_SDiv
|
|
{
|
|
float val[_52];
|
|
float dummy;
|
|
} SDiv;
|
|
|
|
layout(binding = 5, std430) buffer SSBO_SRem
|
|
{
|
|
float val[1];
|
|
float dummy;
|
|
} SRem;
|
|
|
|
layout(binding = 6, std430) buffer SSBO_SMod
|
|
{
|
|
float val[_66];
|
|
float dummy;
|
|
} SMod;
|
|
|
|
layout(binding = 7, std430) buffer SSBO_UMod
|
|
{
|
|
float val[_73];
|
|
float dummy;
|
|
} UMod;
|
|
|
|
layout(binding = 8, std430) buffer SSBO_LShl
|
|
{
|
|
float val[_81];
|
|
float dummy;
|
|
} LShl;
|
|
|
|
layout(binding = 9, std430) buffer SSBO_RShl
|
|
{
|
|
float val[_89];
|
|
float dummy;
|
|
} RShl;
|
|
|
|
layout(binding = 10, std430) buffer SSBO_RSha
|
|
{
|
|
float val[_100];
|
|
float dummy;
|
|
} RSha;
|
|
|
|
layout(binding = 11, std430) buffer SSBO_IEq
|
|
{
|
|
float val[_109];
|
|
float dummy;
|
|
} IEq;
|
|
|
|
layout(binding = 12, std430) buffer SSBO_INeq
|
|
{
|
|
float val[_116];
|
|
float dummy;
|
|
} INeq;
|
|
|
|
layout(binding = 13, std430) buffer SSBO_Ult
|
|
{
|
|
float val[_123];
|
|
float dummy;
|
|
} Ult;
|
|
|
|
layout(binding = 14, std430) buffer SSBO_Ule
|
|
{
|
|
float val[_130];
|
|
float dummy;
|
|
} Ule;
|
|
|
|
layout(binding = 15, std430) buffer SSBO_Ugt
|
|
{
|
|
float val[_137];
|
|
float dummy;
|
|
} Ugt;
|
|
|
|
layout(binding = 16, std430) buffer SSBO_Uge
|
|
{
|
|
float val[_144];
|
|
float dummy;
|
|
} Uge;
|
|
|
|
layout(binding = 17, std430) buffer SSBO_Slt
|
|
{
|
|
float val[_151];
|
|
float dummy;
|
|
} Slt;
|
|
|
|
layout(binding = 18, std430) buffer SSBO_Sle
|
|
{
|
|
float val[_158];
|
|
float dummy;
|
|
} Sle;
|
|
|
|
layout(binding = 19, std430) buffer SSBO_Sgt
|
|
{
|
|
float val[_165];
|
|
float dummy;
|
|
} Sgt;
|
|
|
|
layout(binding = 20, std430) buffer SSBO_Sge
|
|
{
|
|
float val[_172];
|
|
float dummy;
|
|
} Sge;
|
|
|
|
layout(binding = 21, std430) buffer SSBO_Lor
|
|
{
|
|
float val[_179];
|
|
float dummy;
|
|
} Lor;
|
|
|
|
layout(binding = 22, std430) buffer SSBO_Land
|
|
{
|
|
float val[_186];
|
|
float dummy;
|
|
} Land;
|
|
|
|
layout(binding = 23, std430) buffer SSBO_Lnot
|
|
{
|
|
float val[_193];
|
|
float dummy;
|
|
} Lnot;
|
|
|
|
layout(binding = 24, std430) buffer SSBO_And
|
|
{
|
|
float val[_200];
|
|
float dummy;
|
|
} And;
|
|
|
|
layout(binding = 24, std430) buffer SSBO_Or
|
|
{
|
|
float val[_208];
|
|
float dummy;
|
|
} Or;
|
|
|
|
layout(binding = 24, std430) buffer SSBO_Xor
|
|
{
|
|
float val[_215];
|
|
float dummy;
|
|
} Xor;
|
|
|
|
layout(binding = 25, std430) buffer SSBO_Not
|
|
{
|
|
float val[_223];
|
|
float dummy;
|
|
} Not;
|
|
|
|
layout(binding = 26, std430) buffer SSBO_Leq
|
|
{
|
|
float val[_230];
|
|
float dummy;
|
|
} Leq;
|
|
|
|
layout(binding = 27, std430) buffer SSBO_Lneq
|
|
{
|
|
float val[_237];
|
|
float dummy;
|
|
} Lneq;
|
|
|
|
layout(binding = 28, std430) buffer SSBO_Sel
|
|
{
|
|
float val[SEL];
|
|
float dummy;
|
|
} Sel;
|
|
|
|
void main()
|
|
{
|
|
IAdd.val[0] = 0.0;
|
|
ISub.val[0] = 0.0;
|
|
IMul.val[0] = 0.0;
|
|
UDiv.val[0] = 0.0;
|
|
SDiv.val[0] = 0.0;
|
|
SRem.val[0] = 0.0;
|
|
SMod.val[0] = 0.0;
|
|
UMod.val[0] = 0.0;
|
|
LShl.val[0] = 0.0;
|
|
RShl.val[0] = 0.0;
|
|
RSha.val[0] = 0.0;
|
|
IEq.val[0] = 0.0;
|
|
INeq.val[0] = 0.0;
|
|
Ult.val[0] = 0.0;
|
|
Ule.val[0] = 0.0;
|
|
Ugt.val[0] = 0.0;
|
|
Uge.val[0] = 0.0;
|
|
Slt.val[0] = 0.0;
|
|
Sle.val[0] = 0.0;
|
|
Sgt.val[0] = 0.0;
|
|
Sge.val[0] = 0.0;
|
|
Lor.val[0] = 0.0;
|
|
Land.val[0] = 0.0;
|
|
Lnot.val[0] = 0.0;
|
|
And.val[0] = 0.0;
|
|
Or.val[0] = 0.0;
|
|
Xor.val[0] = 0.0;
|
|
Not.val[0] = 0.0;
|
|
Leq.val[0] = 0.0;
|
|
Lneq.val[0] = 0.0;
|
|
Sel.val[0] = 0.0;
|
|
}
|
|
|