SPIRV-Cross/reference/shaders-no-opt/comp/specialization-constant-evaluation.comp
Hans-Kristian Arntzen 66afe8c499 Implement a simple evaluator of specialization constants.
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.
2020-09-14 11:45:59 +02:00

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;
}