339 lines
7.6 KiB
C
339 lines
7.6 KiB
C
// Modifications copyright Amazon.com, Inc. or its affiliates
|
|
// Modifications copyright Crytek GmbH
|
|
|
|
#ifndef STRUCTS_H
|
|
#define STRUCTS_H
|
|
|
|
#include "hlslcc.h"
|
|
#include "bstrlib.h"
|
|
|
|
#include "internal_includes/tokens.h"
|
|
#include "internal_includes/reflect.h"
|
|
|
|
enum
|
|
{
|
|
MAX_SUB_OPERANDS = 3
|
|
};
|
|
|
|
typedef struct Operand_TAG
|
|
{
|
|
int iExtended;
|
|
OPERAND_TYPE eType;
|
|
OPERAND_MODIFIER eModifier;
|
|
OPERAND_MIN_PRECISION eMinPrecision;
|
|
int iIndexDims;
|
|
int indexRepresentation[4];
|
|
int writeMask;
|
|
int iGSInput;
|
|
int iWriteMaskEnabled;
|
|
|
|
int iNumComponents;
|
|
|
|
OPERAND_4_COMPONENT_SELECTION_MODE eSelMode;
|
|
uint32_t ui32CompMask;
|
|
uint32_t ui32Swizzle;
|
|
uint32_t aui32Swizzle[4];
|
|
|
|
uint32_t aui32ArraySizes[3];
|
|
uint32_t ui32RegisterNumber;
|
|
//If eType is OPERAND_TYPE_IMMEDIATE32
|
|
float afImmediates[4];
|
|
//If eType is OPERAND_TYPE_IMMEDIATE64
|
|
double adImmediates[4];
|
|
|
|
int iIntegerImmediate;
|
|
|
|
SPECIAL_NAME eSpecialName;
|
|
char pszSpecialName[64];
|
|
|
|
OPERAND_INDEX_REPRESENTATION eIndexRep[3];
|
|
|
|
struct Operand_TAG* psSubOperand[MAX_SUB_OPERANDS];
|
|
|
|
//One type for each component.
|
|
SHADER_VARIABLE_TYPE aeDataType[4];
|
|
|
|
#ifdef _DEBUG
|
|
uint64_t id;
|
|
#endif
|
|
} Operand;
|
|
|
|
typedef struct Instruction_TAG
|
|
{
|
|
OPCODE_TYPE eOpcode;
|
|
INSTRUCTION_TEST_BOOLEAN eBooleanTestType;
|
|
COMPARISON_DX9 eDX9TestType;
|
|
uint32_t ui32SyncFlags;
|
|
uint32_t ui32NumOperands;
|
|
uint32_t ui32FirstSrc;
|
|
Operand asOperands[6];
|
|
uint32_t bSaturate;
|
|
uint32_t ui32FuncIndexWithinInterface;
|
|
RESINFO_RETURN_TYPE eResInfoReturnType;
|
|
|
|
int bAddressOffset;
|
|
int8_t iUAddrOffset;
|
|
int8_t iVAddrOffset;
|
|
int8_t iWAddrOffset;
|
|
RESOURCE_RETURN_TYPE xType, yType, zType, wType;
|
|
RESOURCE_DIMENSION eResDim;
|
|
|
|
#ifdef _DEBUG
|
|
uint64_t id;
|
|
#endif
|
|
} Instruction;
|
|
|
|
enum
|
|
{
|
|
MAX_IMMEDIATE_CONST_BUFFER_VEC4_SIZE = 1024
|
|
};
|
|
enum
|
|
{
|
|
MAX_TEXTURE_SAMPLERS_PAIRS = 32
|
|
};
|
|
|
|
typedef struct ICBVec4_TAG
|
|
{
|
|
uint32_t a;
|
|
uint32_t b;
|
|
uint32_t c;
|
|
uint32_t d;
|
|
} ICBVec4;
|
|
|
|
typedef struct Declaration_TAG
|
|
{
|
|
OPCODE_TYPE eOpcode;
|
|
|
|
uint32_t ui32NumOperands;
|
|
|
|
Operand asOperands[2];
|
|
|
|
ICBVec4 asImmediateConstBuffer[MAX_IMMEDIATE_CONST_BUFFER_VEC4_SIZE];
|
|
//The declaration can set one of these
|
|
//values depending on the opcode.
|
|
union
|
|
{
|
|
uint32_t ui32GlobalFlags;
|
|
uint32_t ui32NumTemps;
|
|
RESOURCE_DIMENSION eResourceDimension;
|
|
CONSTANT_BUFFER_ACCESS_PATTERN eCBAccessPattern;
|
|
INTERPOLATION_MODE eInterpolation;
|
|
PRIMITIVE_TOPOLOGY eOutputPrimitiveTopology;
|
|
PRIMITIVE eInputPrimitive;
|
|
uint32_t ui32MaxOutputVertexCount;
|
|
TESSELLATOR_DOMAIN eTessDomain;
|
|
TESSELLATOR_PARTITIONING eTessPartitioning;
|
|
TESSELLATOR_OUTPUT_PRIMITIVE eTessOutPrim;
|
|
uint32_t aui32WorkGroupSize[3];
|
|
//Fork phase index followed by the instance count.
|
|
uint32_t aui32HullPhaseInstanceInfo[2];
|
|
float fMaxTessFactor;
|
|
uint32_t ui32IndexRange;
|
|
uint32_t ui32GSInstanceCount;
|
|
|
|
struct Interface_TAG
|
|
{
|
|
uint32_t ui32InterfaceID;
|
|
uint32_t ui32NumFuncTables;
|
|
uint32_t ui32ArraySize;
|
|
} interface;
|
|
} value;
|
|
|
|
struct UAV_TAG
|
|
{
|
|
uint32_t ui32GloballyCoherentAccess;
|
|
uint32_t ui32BufferSize;
|
|
uint8_t bCounter;
|
|
RESOURCE_RETURN_TYPE Type;
|
|
} sUAV;
|
|
|
|
struct TGSM_TAG
|
|
{
|
|
uint32_t ui32Stride;
|
|
uint32_t ui32Count;
|
|
} sTGSM;
|
|
|
|
struct IndexableTemp_TAG
|
|
{
|
|
uint32_t ui32RegIndex;
|
|
uint32_t ui32RegCount;
|
|
uint32_t ui32RegComponentSize;
|
|
} sIdxTemp;
|
|
|
|
uint32_t ui32TableLength;
|
|
|
|
uint32_t ui32IsShadowTex;
|
|
|
|
uint32_t ui32SamplerUsed[MAX_TEXTURE_SAMPLERS_PAIRS];
|
|
uint32_t ui32SamplerUsedCount;
|
|
|
|
uint32_t bIsComparisonSampler;
|
|
} Declaration;
|
|
|
|
enum
|
|
{
|
|
MAX_TEMP_VEC4 = 512
|
|
};
|
|
|
|
enum
|
|
{
|
|
MAX_GROUPSHARED = 8
|
|
};
|
|
|
|
enum
|
|
{
|
|
MAX_COLOR_MRT = 8
|
|
};
|
|
|
|
enum
|
|
{
|
|
MAX_DX9_IMMCONST = 256
|
|
};
|
|
|
|
static const uint32_t MAIN_PHASE = 0;
|
|
static const uint32_t HS_GLOBAL_DECL = 1;
|
|
static const uint32_t HS_CTRL_POINT_PHASE = 2;
|
|
static const uint32_t HS_FORK_PHASE = 3;
|
|
static const uint32_t HS_JOIN_PHASE = 4;
|
|
enum
|
|
{
|
|
NUM_PHASES = 5
|
|
};
|
|
|
|
typedef struct ShaderPhase_TAG
|
|
{
|
|
//How many instances of this phase type are there?
|
|
uint32_t ui32InstanceCount;
|
|
|
|
uint32_t* pui32DeclCount;
|
|
Declaration** ppsDecl;
|
|
|
|
uint32_t* pui32InstCount;
|
|
Instruction** ppsInst;
|
|
} ShaderPhase;
|
|
|
|
typedef struct Shader_TAG
|
|
{
|
|
uint32_t ui32MajorVersion;
|
|
uint32_t ui32MinorVersion;
|
|
SHADER_TYPE eShaderType;
|
|
|
|
ShaderLang eTargetLanguage;
|
|
const struct GlExtensions* extensions;
|
|
|
|
int fp64;
|
|
|
|
//DWORDs in program code, including version and length tokens.
|
|
uint32_t ui32ShaderLength;
|
|
|
|
//Instruction* functions;//non-main subroutines
|
|
|
|
uint32_t aui32FuncTableToFuncPointer[MAX_FUNCTION_TABLES];//FIXME dynamic alloc
|
|
uint32_t aui32FuncBodyToFuncTable[MAX_FUNCTION_BODIES];
|
|
|
|
struct
|
|
{
|
|
uint32_t aui32FuncBodies[MAX_FUNCTION_BODIES];
|
|
}funcTable[MAX_FUNCTION_TABLES];
|
|
|
|
struct
|
|
{
|
|
uint32_t aui32FuncTables[MAX_FUNCTION_TABLES];
|
|
uint32_t ui32NumBodiesPerTable;
|
|
}funcPointer[MAX_FUNCTION_POINTERS];
|
|
|
|
uint32_t ui32NextClassFuncName[MAX_CLASS_TYPES];
|
|
|
|
const uint32_t* pui32FirstToken;//Reference for calculating current position in token stream.
|
|
|
|
ShaderPhase asPhase[NUM_PHASES];
|
|
|
|
ShaderInfo sInfo;
|
|
|
|
int abScalarInput[MAX_SHADER_VEC4_INPUT];
|
|
|
|
int aIndexedOutput[MAX_SHADER_VEC4_OUTPUT];
|
|
|
|
int aIndexedInput[MAX_SHADER_VEC4_INPUT];
|
|
int aIndexedInputParents[MAX_SHADER_VEC4_INPUT];
|
|
|
|
RESOURCE_DIMENSION aeResourceDims[MAX_TEXTURES];
|
|
|
|
int aiInputDeclaredSize[MAX_SHADER_VEC4_INPUT];
|
|
|
|
int aiOutputDeclared[MAX_SHADER_VEC4_OUTPUT];
|
|
|
|
//Does not track built-in inputs.
|
|
int abInputReferencedByInstruction[MAX_SHADER_VEC4_INPUT];
|
|
|
|
int aiOpcodeUsed[NUM_OPCODES];
|
|
|
|
uint32_t ui32CurrentVertexOutputStream;
|
|
|
|
uint32_t ui32NumDx9ImmConst;
|
|
uint32_t aui32Dx9ImmConstArrayRemap[MAX_DX9_IMMCONST];
|
|
|
|
ShaderVarType sGroupSharedVarType[MAX_GROUPSHARED];
|
|
|
|
TextureSamplerInfo textureSamplerInfo;
|
|
} ShaderData;
|
|
|
|
// CONFETTI NOTE: DAVID SROUR
|
|
// The following is super sketchy, but at the moment,
|
|
// there is no way to figure out the type of a resource
|
|
// since HLSL has only register sets for the following:
|
|
// bool, int4, float4, sampler.
|
|
enum
|
|
{
|
|
GMEM_FLOAT4_START_SLOT = 120
|
|
};
|
|
enum
|
|
{
|
|
GMEM_FLOAT3_START_SLOT = 112
|
|
};
|
|
enum
|
|
{
|
|
GMEM_FLOAT2_START_SLOT = 104
|
|
};
|
|
enum
|
|
{
|
|
GMEM_FLOAT_START_SLOT = 96
|
|
};
|
|
|
|
// CONFETTI NOTE
|
|
// Set the starting binding point for UAV_Buffer.
|
|
// All the binding points after the starting point is reserved for UAV
|
|
// only. This apply for both [[texture]] and [[buffer]]
|
|
enum
|
|
{
|
|
UAV_BUFFER_START_SLOT = 25
|
|
};
|
|
|
|
typedef struct HLSLCrossCompilerContext_TAG
|
|
{
|
|
bstring mainShader;
|
|
bstring stagedInputDeclarations; // Metal only
|
|
bstring parameterDeclarations; // Metal only
|
|
bstring declaredOutputs; // Metal only
|
|
bstring earlyMain;//Code to be inserted at the start of main()
|
|
bstring postShaderCode[NUM_PHASES];//End of main or before emit()
|
|
|
|
bstring* currentShaderString;//either mainShader or earlyMain
|
|
|
|
int needsFragmentTestHint; // METAL only
|
|
|
|
int havePostShaderCode[NUM_PHASES];
|
|
uint32_t currentPhase;
|
|
|
|
// GMEM INPUT AND OUTPUT TYPES MUST MATCH!
|
|
// THIS TABLE KEEPS TRACK OF WHAT THE OUTPUT TYPE SHOULD
|
|
// BE IF GMEM INPUT WAS DECLARED TO THE SAME SLOT #
|
|
uint32_t gmemOutputNumElements[MAX_COLOR_MRT]; // Metal only
|
|
|
|
int indent;
|
|
unsigned int flags;
|
|
ShaderData* psShader;
|
|
} HLSLCrossCompilerContext;
|
|
|
|
#endif
|