// Modifications copyright Amazon.com, Inc. or its affiliates // Modifications copyright Crytek GmbH #ifndef TOKENS_H #define TOKENS_H #include "hlslcc.h" typedef enum { INVALID_SHADER = -1, PIXEL_SHADER, VERTEX_SHADER, GEOMETRY_SHADER, HULL_SHADER, DOMAIN_SHADER, COMPUTE_SHADER, } SHADER_TYPE; static SHADER_TYPE DecodeShaderType(uint32_t ui32Token) { return (SHADER_TYPE)((ui32Token & 0xffff0000) >> 16); } static uint32_t DecodeProgramMajorVersion(uint32_t ui32Token) { return (ui32Token & 0x000000f0) >> 4; } static uint32_t DecodeProgramMinorVersion(uint32_t ui32Token) { return (ui32Token & 0x0000000f); } static uint32_t DecodeInstructionLength(uint32_t ui32Token) { return (ui32Token & 0x7f000000) >> 24; } static uint32_t DecodeIsOpcodeExtended(uint32_t ui32Token) { return (ui32Token & 0x80000000) >> 31; } typedef enum EXTENDED_OPCODE_TYPE { EXTENDED_OPCODE_EMPTY = 0, EXTENDED_OPCODE_SAMPLE_CONTROLS = 1, EXTENDED_OPCODE_RESOURCE_DIM = 2, EXTENDED_OPCODE_RESOURCE_RETURN_TYPE = 3, } EXTENDED_OPCODE_TYPE; static EXTENDED_OPCODE_TYPE DecodeExtendedOpcodeType(uint32_t ui32Token) { return (EXTENDED_OPCODE_TYPE)(ui32Token & 0x0000003f); } typedef enum RESOURCE_RETURN_TYPE { RETURN_TYPE_UNORM = 1, RETURN_TYPE_SNORM = 2, RETURN_TYPE_SINT = 3, RETURN_TYPE_UINT = 4, RETURN_TYPE_FLOAT = 5, RETURN_TYPE_MIXED = 6, RETURN_TYPE_DOUBLE = 7, RETURN_TYPE_CONTINUED = 8, RETURN_TYPE_UNUSED = 9, } RESOURCE_RETURN_TYPE; static RESOURCE_RETURN_TYPE DecodeResourceReturnType(uint32_t ui32Coord, uint32_t ui32Token) { return (RESOURCE_RETURN_TYPE)((ui32Token>>(ui32Coord * 4))&0xF); } static RESOURCE_RETURN_TYPE DecodeExtendedResourceReturnType(uint32_t ui32Coord, uint32_t ui32Token) { return (RESOURCE_RETURN_TYPE)((ui32Token>>(ui32Coord * 4 + 6))&0xF); } typedef enum { //For DX9 OPCODE_POW = -6, OPCODE_DP2ADD = -5, OPCODE_LRP = -4, OPCODE_ENDREP = -3, OPCODE_REP = -2, OPCODE_SPECIAL_DCL_IMMCONST = -1, OPCODE_ADD, OPCODE_AND, OPCODE_BREAK, OPCODE_BREAKC, OPCODE_CALL, OPCODE_CALLC, OPCODE_CASE, OPCODE_CONTINUE, OPCODE_CONTINUEC, OPCODE_CUT, OPCODE_DEFAULT, OPCODE_DERIV_RTX, OPCODE_DERIV_RTY, OPCODE_DISCARD, OPCODE_DIV, OPCODE_DP2, OPCODE_DP3, OPCODE_DP4, OPCODE_ELSE, OPCODE_EMIT, OPCODE_EMITTHENCUT, OPCODE_ENDIF, OPCODE_ENDLOOP, OPCODE_ENDSWITCH, OPCODE_EQ, OPCODE_EXP, OPCODE_FRC, OPCODE_FTOI, OPCODE_FTOU, OPCODE_GE, OPCODE_IADD, OPCODE_IF, OPCODE_IEQ, OPCODE_IGE, OPCODE_ILT, OPCODE_IMAD, OPCODE_IMAX, OPCODE_IMIN, OPCODE_IMUL, OPCODE_INE, OPCODE_INEG, OPCODE_ISHL, OPCODE_ISHR, OPCODE_ITOF, OPCODE_LABEL, OPCODE_LD, OPCODE_LD_MS, OPCODE_LOG, OPCODE_LOOP, OPCODE_LT, OPCODE_MAD, OPCODE_MIN, OPCODE_MAX, OPCODE_CUSTOMDATA, OPCODE_MOV, OPCODE_MOVC, OPCODE_MUL, OPCODE_NE, OPCODE_NOP, OPCODE_NOT, OPCODE_OR, OPCODE_RESINFO, OPCODE_RET, OPCODE_RETC, OPCODE_ROUND_NE, OPCODE_ROUND_NI, OPCODE_ROUND_PI, OPCODE_ROUND_Z, OPCODE_RSQ, OPCODE_SAMPLE, OPCODE_SAMPLE_C, OPCODE_SAMPLE_C_LZ, OPCODE_SAMPLE_L, OPCODE_SAMPLE_D, OPCODE_SAMPLE_B, OPCODE_SQRT, OPCODE_SWITCH, OPCODE_SINCOS, OPCODE_UDIV, OPCODE_ULT, OPCODE_UGE, OPCODE_UMUL, OPCODE_UMAD, OPCODE_UMAX, OPCODE_UMIN, OPCODE_USHR, OPCODE_UTOF, OPCODE_XOR, OPCODE_DCL_RESOURCE, // DCL* opcodes have OPCODE_DCL_CONSTANT_BUFFER, // custom operand formats. OPCODE_DCL_SAMPLER, OPCODE_DCL_INDEX_RANGE, OPCODE_DCL_GS_OUTPUT_PRIMITIVE_TOPOLOGY, OPCODE_DCL_GS_INPUT_PRIMITIVE, OPCODE_DCL_MAX_OUTPUT_VERTEX_COUNT, OPCODE_DCL_INPUT, OPCODE_DCL_INPUT_SGV, OPCODE_DCL_INPUT_SIV, OPCODE_DCL_INPUT_PS, OPCODE_DCL_INPUT_PS_SGV, OPCODE_DCL_INPUT_PS_SIV, OPCODE_DCL_OUTPUT, OPCODE_DCL_OUTPUT_SGV, OPCODE_DCL_OUTPUT_SIV, OPCODE_DCL_TEMPS, OPCODE_DCL_INDEXABLE_TEMP, OPCODE_DCL_GLOBAL_FLAGS, // ----------------------------------------------- OPCODE_RESERVED_10, // ---------- DX 10.1 op codes--------------------- OPCODE_LOD, OPCODE_GATHER4, OPCODE_SAMPLE_POS, OPCODE_SAMPLE_INFO, // ----------------------------------------------- // This should be 10.1's version of NUM_OPCODES OPCODE_RESERVED_10_1, // ---------- DX 11 op codes--------------------- OPCODE_HS_DECLS, // token marks beginning of HS sub-shader OPCODE_HS_CONTROL_POINT_PHASE, // token marks beginning of HS sub-shader OPCODE_HS_FORK_PHASE, // token marks beginning of HS sub-shader OPCODE_HS_JOIN_PHASE, // token marks beginning of HS sub-shader OPCODE_EMIT_STREAM, OPCODE_CUT_STREAM, OPCODE_EMITTHENCUT_STREAM, OPCODE_INTERFACE_CALL, OPCODE_BUFINFO, OPCODE_DERIV_RTX_COARSE, OPCODE_DERIV_RTX_FINE, OPCODE_DERIV_RTY_COARSE, OPCODE_DERIV_RTY_FINE, OPCODE_GATHER4_C, OPCODE_GATHER4_PO, OPCODE_GATHER4_PO_C, OPCODE_RCP, OPCODE_F32TOF16, OPCODE_F16TOF32, OPCODE_UADDC, OPCODE_USUBB, OPCODE_COUNTBITS, OPCODE_FIRSTBIT_HI, OPCODE_FIRSTBIT_LO, OPCODE_FIRSTBIT_SHI, OPCODE_UBFE, OPCODE_IBFE, OPCODE_BFI, OPCODE_BFREV, OPCODE_SWAPC, OPCODE_DCL_STREAM, OPCODE_DCL_FUNCTION_BODY, OPCODE_DCL_FUNCTION_TABLE, OPCODE_DCL_INTERFACE, OPCODE_DCL_INPUT_CONTROL_POINT_COUNT, OPCODE_DCL_OUTPUT_CONTROL_POINT_COUNT, OPCODE_DCL_TESS_DOMAIN, OPCODE_DCL_TESS_PARTITIONING, OPCODE_DCL_TESS_OUTPUT_PRIMITIVE, OPCODE_DCL_HS_MAX_TESSFACTOR, OPCODE_DCL_HS_FORK_PHASE_INSTANCE_COUNT, OPCODE_DCL_HS_JOIN_PHASE_INSTANCE_COUNT, OPCODE_DCL_THREAD_GROUP, OPCODE_DCL_UNORDERED_ACCESS_VIEW_TYPED, OPCODE_DCL_UNORDERED_ACCESS_VIEW_RAW, OPCODE_DCL_UNORDERED_ACCESS_VIEW_STRUCTURED, OPCODE_DCL_THREAD_GROUP_SHARED_MEMORY_RAW, OPCODE_DCL_THREAD_GROUP_SHARED_MEMORY_STRUCTURED, OPCODE_DCL_RESOURCE_RAW, OPCODE_DCL_RESOURCE_STRUCTURED, OPCODE_LD_UAV_TYPED, OPCODE_STORE_UAV_TYPED, OPCODE_LD_RAW, OPCODE_STORE_RAW, OPCODE_LD_STRUCTURED, OPCODE_STORE_STRUCTURED, OPCODE_ATOMIC_AND, OPCODE_ATOMIC_OR, OPCODE_ATOMIC_XOR, OPCODE_ATOMIC_CMP_STORE, OPCODE_ATOMIC_IADD, OPCODE_ATOMIC_IMAX, OPCODE_ATOMIC_IMIN, OPCODE_ATOMIC_UMAX, OPCODE_ATOMIC_UMIN, OPCODE_IMM_ATOMIC_ALLOC, OPCODE_IMM_ATOMIC_CONSUME, OPCODE_IMM_ATOMIC_IADD, OPCODE_IMM_ATOMIC_AND, OPCODE_IMM_ATOMIC_OR, OPCODE_IMM_ATOMIC_XOR, OPCODE_IMM_ATOMIC_EXCH, OPCODE_IMM_ATOMIC_CMP_EXCH, OPCODE_IMM_ATOMIC_IMAX, OPCODE_IMM_ATOMIC_IMIN, OPCODE_IMM_ATOMIC_UMAX, OPCODE_IMM_ATOMIC_UMIN, OPCODE_SYNC, OPCODE_DADD, OPCODE_DMAX, OPCODE_DMIN, OPCODE_DMUL, OPCODE_DEQ, OPCODE_DGE, OPCODE_DLT, OPCODE_DNE, OPCODE_DMOV, OPCODE_DMOVC, OPCODE_DTOF, OPCODE_FTOD, OPCODE_EVAL_SNAPPED, OPCODE_EVAL_SAMPLE_INDEX, OPCODE_EVAL_CENTROID, OPCODE_DCL_GS_INSTANCE_COUNT, OPCODE_ABORT, OPCODE_DEBUG_BREAK, // ----------------------------------------------- // This marks the end of D3D11.0 opcodes OPCODE_RESERVED_11, OPCODE_DDIV, OPCODE_DFMA, OPCODE_DRCP, OPCODE_MSAD, OPCODE_DTOI, OPCODE_DTOU, OPCODE_ITOD, OPCODE_UTOD, // ----------------------------------------------- // This marks the end of D3D11.1 opcodes OPCODE_RESERVED_11_1, NUM_OPCODES, OPCODE_INVAILD = NUM_OPCODES, } OPCODE_TYPE; static OPCODE_TYPE DecodeOpcodeType(uint32_t ui32Token) { return (OPCODE_TYPE)(ui32Token & 0x00007ff); } typedef enum { INDEX_0D, INDEX_1D, INDEX_2D, INDEX_3D, } OPERAND_INDEX_DIMENSION; static OPERAND_INDEX_DIMENSION DecodeOperandIndexDimension(uint32_t ui32Token) { return (OPERAND_INDEX_DIMENSION)((ui32Token & 0x00300000) >> 20); } typedef enum OPERAND_TYPE { OPERAND_TYPE_SPECIAL_LOOPCOUNTER = -10, OPERAND_TYPE_SPECIAL_IMMCONSTINT = -9, OPERAND_TYPE_SPECIAL_TEXCOORD = -8, OPERAND_TYPE_SPECIAL_POSITION = -7, OPERAND_TYPE_SPECIAL_FOG = -6, OPERAND_TYPE_SPECIAL_POINTSIZE = -5, OPERAND_TYPE_SPECIAL_OUTOFFSETCOLOUR = -4, OPERAND_TYPE_SPECIAL_OUTBASECOLOUR = -3, OPERAND_TYPE_SPECIAL_ADDRESS = -2, OPERAND_TYPE_SPECIAL_IMMCONST = -1, OPERAND_TYPE_TEMP = 0, // Temporary Register File OPERAND_TYPE_INPUT = 1, // General Input Register File OPERAND_TYPE_OUTPUT = 2, // General Output Register File OPERAND_TYPE_INDEXABLE_TEMP = 3, // Temporary Register File (indexable) OPERAND_TYPE_IMMEDIATE32 = 4, // 32bit/component immediate value(s) // If for example, operand token bits // [01:00]==OPERAND_4_COMPONENT, // this means that the operand type: // OPERAND_TYPE_IMMEDIATE32 // results in 4 additional 32bit // DWORDS present for the operand. OPERAND_TYPE_IMMEDIATE64 = 5, // 64bit/comp.imm.val(s)HI:LO OPERAND_TYPE_SAMPLER = 6, // Reference to sampler state OPERAND_TYPE_RESOURCE = 7, // Reference to memory resource (e.g. texture) OPERAND_TYPE_CONSTANT_BUFFER= 8, // Reference to constant buffer OPERAND_TYPE_IMMEDIATE_CONSTANT_BUFFER= 9, // Reference to immediate constant buffer OPERAND_TYPE_LABEL = 10, // Label OPERAND_TYPE_INPUT_PRIMITIVEID = 11, // Input primitive ID OPERAND_TYPE_OUTPUT_DEPTH = 12, // Output Depth OPERAND_TYPE_NULL = 13, // Null register, used to discard results of operations // Below Are operands new in DX 10.1 OPERAND_TYPE_RASTERIZER = 14, // DX10.1 Rasterizer register, used to denote the depth/stencil and render target resources OPERAND_TYPE_OUTPUT_COVERAGE_MASK = 15, // DX10.1 PS output MSAA coverage mask (scalar) // Below Are operands new in DX 11 OPERAND_TYPE_STREAM = 16, // Reference to GS stream output resource OPERAND_TYPE_FUNCTION_BODY = 17, // Reference to a function definition OPERAND_TYPE_FUNCTION_TABLE = 18, // Reference to a set of functions used by a class OPERAND_TYPE_INTERFACE = 19, // Reference to an interface OPERAND_TYPE_FUNCTION_INPUT = 20, // Reference to an input parameter to a function OPERAND_TYPE_FUNCTION_OUTPUT = 21, // Reference to an output parameter to a function OPERAND_TYPE_OUTPUT_CONTROL_POINT_ID = 22, // HS Control Point phase input saying which output control point ID this is OPERAND_TYPE_INPUT_FORK_INSTANCE_ID = 23, // HS Fork Phase input instance ID OPERAND_TYPE_INPUT_JOIN_INSTANCE_ID = 24, // HS Join Phase input instance ID OPERAND_TYPE_INPUT_CONTROL_POINT = 25, // HS Fork+Join, DS phase input control points (array of them) OPERAND_TYPE_OUTPUT_CONTROL_POINT = 26, // HS Fork+Join phase output control points (array of them) OPERAND_TYPE_INPUT_PATCH_CONSTANT = 27, // DS+HSJoin Input Patch Constants (array of them) OPERAND_TYPE_INPUT_DOMAIN_POINT = 28, // DS Input Domain point OPERAND_TYPE_THIS_POINTER = 29, // Reference to an interface this pointer OPERAND_TYPE_UNORDERED_ACCESS_VIEW = 30, // Reference to UAV u# OPERAND_TYPE_THREAD_GROUP_SHARED_MEMORY = 31, // Reference to Thread Group Shared Memory g# OPERAND_TYPE_INPUT_THREAD_ID = 32, // Compute Shader Thread ID OPERAND_TYPE_INPUT_THREAD_GROUP_ID = 33, // Compute Shader Thread Group ID OPERAND_TYPE_INPUT_THREAD_ID_IN_GROUP = 34, // Compute Shader Thread ID In Thread Group OPERAND_TYPE_INPUT_COVERAGE_MASK = 35, // Pixel shader coverage mask input OPERAND_TYPE_INPUT_THREAD_ID_IN_GROUP_FLATTENED = 36, // Compute Shader Thread ID In Group Flattened to a 1D value. OPERAND_TYPE_INPUT_GS_INSTANCE_ID = 37, // Input GS instance ID OPERAND_TYPE_OUTPUT_DEPTH_GREATER_EQUAL = 38, // Output Depth, forced to be greater than or equal than current depth OPERAND_TYPE_OUTPUT_DEPTH_LESS_EQUAL = 39, // Output Depth, forced to be less than or equal to current depth OPERAND_TYPE_CYCLE_COUNTER = 40, // Cycle counter } OPERAND_TYPE; static OPERAND_TYPE DecodeOperandType(uint32_t ui32Token) { return (OPERAND_TYPE)((ui32Token & 0x000ff000) >> 12); } static SPECIAL_NAME DecodeOperandSpecialName(uint32_t ui32Token) { return (SPECIAL_NAME)(ui32Token & 0x0000ffff); } typedef enum OPERAND_INDEX_REPRESENTATION { OPERAND_INDEX_IMMEDIATE32 = 0, // Extra DWORD OPERAND_INDEX_IMMEDIATE64 = 1, // 2 Extra DWORDs // (HI32:LO32) OPERAND_INDEX_RELATIVE = 2, // Extra operand OPERAND_INDEX_IMMEDIATE32_PLUS_RELATIVE = 3, // Extra DWORD followed by // extra operand OPERAND_INDEX_IMMEDIATE64_PLUS_RELATIVE = 4, // 2 Extra DWORDS // (HI32:LO32) followed // by extra operand } OPERAND_INDEX_REPRESENTATION; static OPERAND_INDEX_REPRESENTATION DecodeOperandIndexRepresentation(uint32_t ui32Dimension, uint32_t ui32Token) { return (OPERAND_INDEX_REPRESENTATION)((ui32Token & (0x3<<(22+3*((ui32Dimension)&3)))) >> (22+3*((ui32Dimension)&3))); } typedef enum OPERAND_NUM_COMPONENTS { OPERAND_0_COMPONENT = 0, OPERAND_1_COMPONENT = 1, OPERAND_4_COMPONENT = 2, OPERAND_N_COMPONENT = 3 // unused for now } OPERAND_NUM_COMPONENTS; static OPERAND_NUM_COMPONENTS DecodeOperandNumComponents(uint32_t ui32Token) { return (OPERAND_NUM_COMPONENTS)(ui32Token & 0x00000003); } typedef enum OPERAND_4_COMPONENT_SELECTION_MODE { OPERAND_4_COMPONENT_MASK_MODE = 0, // mask 4 components OPERAND_4_COMPONENT_SWIZZLE_MODE = 1, // swizzle 4 components OPERAND_4_COMPONENT_SELECT_1_MODE = 2, // select 1 of 4 components } OPERAND_4_COMPONENT_SELECTION_MODE; static OPERAND_4_COMPONENT_SELECTION_MODE DecodeOperand4CompSelMode(uint32_t ui32Token) { return (OPERAND_4_COMPONENT_SELECTION_MODE)((ui32Token & 0x0000000c) >> 2); } #define OPERAND_4_COMPONENT_MASK_X 0x00000001 #define OPERAND_4_COMPONENT_MASK_Y 0x00000002 #define OPERAND_4_COMPONENT_MASK_Z 0x00000004 #define OPERAND_4_COMPONENT_MASK_W 0x00000008 #define OPERAND_4_COMPONENT_MASK_R OPERAND_4_COMPONENT_MASK_X #define OPERAND_4_COMPONENT_MASK_G OPERAND_4_COMPONENT_MASK_Y #define OPERAND_4_COMPONENT_MASK_B OPERAND_4_COMPONENT_MASK_Z #define OPERAND_4_COMPONENT_MASK_A OPERAND_4_COMPONENT_MASK_W #define OPERAND_4_COMPONENT_MASK_ALL 0x0000000f static uint32_t DecodeOperand4CompMask(uint32_t ui32Token) { return (uint32_t)((ui32Token & 0x000000f0) >> 4); } static uint32_t DecodeOperand4CompSwizzle(uint32_t ui32Token) { return (uint32_t)((ui32Token & 0x00000ff0) >> 4); } static uint32_t DecodeOperand4CompSel1(uint32_t ui32Token) { return (uint32_t)((ui32Token & 0x00000030) >> 4); } #define OPERAND_4_COMPONENT_X 0 #define OPERAND_4_COMPONENT_Y 1 #define OPERAND_4_COMPONENT_Z 2 #define OPERAND_4_COMPONENT_W 3 static uint32_t NO_SWIZZLE = (( (OPERAND_4_COMPONENT_X) | (OPERAND_4_COMPONENT_Y<<2) | (OPERAND_4_COMPONENT_Z << 4) | (OPERAND_4_COMPONENT_W << 6))/*<<4*/); static uint32_t XXXX_SWIZZLE = (((OPERAND_4_COMPONENT_X) | (OPERAND_4_COMPONENT_X<<2) | (OPERAND_4_COMPONENT_X << 4) | (OPERAND_4_COMPONENT_X << 6))); static uint32_t YYYY_SWIZZLE = (((OPERAND_4_COMPONENT_Y) | (OPERAND_4_COMPONENT_Y<<2) | (OPERAND_4_COMPONENT_Y << 4) | (OPERAND_4_COMPONENT_Y << 6))); static uint32_t ZZZZ_SWIZZLE = (((OPERAND_4_COMPONENT_Z) | (OPERAND_4_COMPONENT_Z<<2) | (OPERAND_4_COMPONENT_Z << 4) | (OPERAND_4_COMPONENT_Z << 6))); static uint32_t WWWW_SWIZZLE = (((OPERAND_4_COMPONENT_W) | (OPERAND_4_COMPONENT_W<<2) | (OPERAND_4_COMPONENT_W << 4) | (OPERAND_4_COMPONENT_W << 6))); static uint32_t DecodeOperand4CompSwizzleSource(uint32_t ui32Token, uint32_t comp) { return (uint32_t)(((ui32Token)>>(4+2*((comp)&3)))&3); } typedef enum RESOURCE_DIMENSION { RESOURCE_DIMENSION_UNKNOWN = 0, RESOURCE_DIMENSION_BUFFER = 1, RESOURCE_DIMENSION_TEXTURE1D = 2, RESOURCE_DIMENSION_TEXTURE2D = 3, RESOURCE_DIMENSION_TEXTURE2DMS = 4, RESOURCE_DIMENSION_TEXTURE3D = 5, RESOURCE_DIMENSION_TEXTURECUBE = 6, RESOURCE_DIMENSION_TEXTURE1DARRAY = 7, RESOURCE_DIMENSION_TEXTURE2DARRAY = 8, RESOURCE_DIMENSION_TEXTURE2DMSARRAY = 9, RESOURCE_DIMENSION_TEXTURECUBEARRAY = 10, RESOURCE_DIMENSION_RAW_BUFFER = 11, RESOURCE_DIMENSION_STRUCTURED_BUFFER = 12, } RESOURCE_DIMENSION; static RESOURCE_DIMENSION DecodeResourceDimension(uint32_t ui32Token) { return (RESOURCE_DIMENSION)((ui32Token & 0x0000f800) >> 11); } static RESOURCE_DIMENSION DecodeExtendedResourceDimension(uint32_t ui32Token) { return (RESOURCE_DIMENSION)((ui32Token & 0x000007C0) >> 6); } typedef enum CONSTANT_BUFFER_ACCESS_PATTERN { CONSTANT_BUFFER_ACCESS_PATTERN_IMMEDIATEINDEXED = 0, CONSTANT_BUFFER_ACCESS_PATTERN_DYNAMICINDEXED = 1 } CONSTANT_BUFFER_ACCESS_PATTERN; static CONSTANT_BUFFER_ACCESS_PATTERN DecodeConstantBufferAccessPattern(uint32_t ui32Token) { return (CONSTANT_BUFFER_ACCESS_PATTERN)((ui32Token & 0x00000800) >> 11); } typedef enum INSTRUCTION_TEST_BOOLEAN { INSTRUCTION_TEST_ZERO = 0, INSTRUCTION_TEST_NONZERO = 1 } INSTRUCTION_TEST_BOOLEAN; static INSTRUCTION_TEST_BOOLEAN DecodeInstrTestBool(uint32_t ui32Token) { return (INSTRUCTION_TEST_BOOLEAN)((ui32Token & 0x00040000) >> 18); } static uint32_t DecodeIsOperandExtended(uint32_t ui32Token) { return (ui32Token & 0x80000000) >> 31; } typedef enum EXTENDED_OPERAND_TYPE { EXTENDED_OPERAND_EMPTY = 0, EXTENDED_OPERAND_MODIFIER = 1, } EXTENDED_OPERAND_TYPE; static EXTENDED_OPERAND_TYPE DecodeExtendedOperandType(uint32_t ui32Token) { return (EXTENDED_OPERAND_TYPE)(ui32Token & 0x0000003f); } typedef enum OPERAND_MODIFIER { OPERAND_MODIFIER_NONE = 0, OPERAND_MODIFIER_NEG = 1, OPERAND_MODIFIER_ABS = 2, OPERAND_MODIFIER_ABSNEG = 3, } OPERAND_MODIFIER; static OPERAND_MODIFIER DecodeExtendedOperandModifier(uint32_t ui32Token) { return (OPERAND_MODIFIER)((ui32Token & 0x00003fc0) >> 6); } static const uint32_t GLOBAL_FLAG_REFACTORING_ALLOWED = (1<<11); static const uint32_t GLOBAL_FLAG_ENABLE_DOUBLE_PRECISION_FLOAT_OPS = (1<<12); static const uint32_t GLOBAL_FLAG_FORCE_EARLY_DEPTH_STENCIL = (1<<13); static const uint32_t GLOBAL_FLAG_ENABLE_RAW_AND_STRUCTURED_BUFFERS = (1<<14); static const uint32_t GLOBAL_FLAG_SKIP_OPTIMIZATION = (1<<15); static const uint32_t GLOBAL_FLAG_ENABLE_MINIMUM_PRECISION = (1<<16); static const uint32_t GLOBAL_FLAG_ENABLE_DOUBLE_EXTENSIONS = (1<<17); static const uint32_t GLOBAL_FLAG_ENABLE_SHADER_EXTENSIONS = (1<<18); static uint32_t DecodeGlobalFlags(uint32_t ui32Token) { return (uint32_t)(ui32Token & 0x00fff800); } static INTERPOLATION_MODE DecodeInterpolationMode(uint32_t ui32Token) { return (INTERPOLATION_MODE)((ui32Token & 0x00007800) >> 11); } typedef enum PRIMITIVE_TOPOLOGY { PRIMITIVE_TOPOLOGY_UNDEFINED = 0, PRIMITIVE_TOPOLOGY_POINTLIST = 1, PRIMITIVE_TOPOLOGY_LINELIST = 2, PRIMITIVE_TOPOLOGY_LINESTRIP = 3, PRIMITIVE_TOPOLOGY_TRIANGLELIST = 4, PRIMITIVE_TOPOLOGY_TRIANGLESTRIP = 5, // 6 is reserved for legacy triangle fans // Adjacency values should be equal to (0x8 & non-adjacency): PRIMITIVE_TOPOLOGY_LINELIST_ADJ = 10, PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ = 11, PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ = 12, PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ = 13, } PRIMITIVE_TOPOLOGY; static PRIMITIVE_TOPOLOGY DecodeGSOutputPrimitiveTopology(uint32_t ui32Token) { return (PRIMITIVE_TOPOLOGY)((ui32Token & 0x0001f800) >> 11); } typedef enum PRIMITIVE { PRIMITIVE_UNDEFINED = 0, PRIMITIVE_POINT = 1, PRIMITIVE_LINE = 2, PRIMITIVE_TRIANGLE = 3, // Adjacency values should be equal to (0x4 & non-adjacency): PRIMITIVE_LINE_ADJ = 6, PRIMITIVE_TRIANGLE_ADJ = 7, PRIMITIVE_1_CONTROL_POINT_PATCH = 8, PRIMITIVE_2_CONTROL_POINT_PATCH = 9, PRIMITIVE_3_CONTROL_POINT_PATCH = 10, PRIMITIVE_4_CONTROL_POINT_PATCH = 11, PRIMITIVE_5_CONTROL_POINT_PATCH = 12, PRIMITIVE_6_CONTROL_POINT_PATCH = 13, PRIMITIVE_7_CONTROL_POINT_PATCH = 14, PRIMITIVE_8_CONTROL_POINT_PATCH = 15, PRIMITIVE_9_CONTROL_POINT_PATCH = 16, PRIMITIVE_10_CONTROL_POINT_PATCH = 17, PRIMITIVE_11_CONTROL_POINT_PATCH = 18, PRIMITIVE_12_CONTROL_POINT_PATCH = 19, PRIMITIVE_13_CONTROL_POINT_PATCH = 20, PRIMITIVE_14_CONTROL_POINT_PATCH = 21, PRIMITIVE_15_CONTROL_POINT_PATCH = 22, PRIMITIVE_16_CONTROL_POINT_PATCH = 23, PRIMITIVE_17_CONTROL_POINT_PATCH = 24, PRIMITIVE_18_CONTROL_POINT_PATCH = 25, PRIMITIVE_19_CONTROL_POINT_PATCH = 26, PRIMITIVE_20_CONTROL_POINT_PATCH = 27, PRIMITIVE_21_CONTROL_POINT_PATCH = 28, PRIMITIVE_22_CONTROL_POINT_PATCH = 29, PRIMITIVE_23_CONTROL_POINT_PATCH = 30, PRIMITIVE_24_CONTROL_POINT_PATCH = 31, PRIMITIVE_25_CONTROL_POINT_PATCH = 32, PRIMITIVE_26_CONTROL_POINT_PATCH = 33, PRIMITIVE_27_CONTROL_POINT_PATCH = 34, PRIMITIVE_28_CONTROL_POINT_PATCH = 35, PRIMITIVE_29_CONTROL_POINT_PATCH = 36, PRIMITIVE_30_CONTROL_POINT_PATCH = 37, PRIMITIVE_31_CONTROL_POINT_PATCH = 38, PRIMITIVE_32_CONTROL_POINT_PATCH = 39, } PRIMITIVE; static PRIMITIVE DecodeGSInputPrimitive(uint32_t ui32Token) { return (PRIMITIVE)((ui32Token & 0x0001f800) >> 11); } static TESSELLATOR_PARTITIONING DecodeTessPartitioning(uint32_t ui32Token) { return (TESSELLATOR_PARTITIONING)((ui32Token & 0x00003800) >> 11); } typedef enum TESSELLATOR_DOMAIN { TESSELLATOR_DOMAIN_UNDEFINED = 0, TESSELLATOR_DOMAIN_ISOLINE = 1, TESSELLATOR_DOMAIN_TRI = 2, TESSELLATOR_DOMAIN_QUAD = 3 } TESSELLATOR_DOMAIN; static TESSELLATOR_DOMAIN DecodeTessDomain(uint32_t ui32Token) { return (TESSELLATOR_DOMAIN)((ui32Token & 0x00001800) >> 11); } static TESSELLATOR_OUTPUT_PRIMITIVE DecodeTessOutPrim(uint32_t ui32Token) { return (TESSELLATOR_OUTPUT_PRIMITIVE)((ui32Token & 0x00003800) >> 11); } static const uint32_t SYNC_THREADS_IN_GROUP = 0x00000800; static const uint32_t SYNC_THREAD_GROUP_SHARED_MEMORY = 0x00001000; static const uint32_t SYNC_UNORDERED_ACCESS_VIEW_MEMORY_GROUP = 0x00002000; static const uint32_t SYNC_UNORDERED_ACCESS_VIEW_MEMORY_GLOBAL = 0x00004000; static uint32_t DecodeSyncFlags(uint32_t ui32Token) { return ui32Token & 0x00007800; } // The number of types that implement this interface static uint32_t DecodeInterfaceTableLength(uint32_t ui32Token) { return (uint32_t)((ui32Token & 0x0000ffff) >> 0); } // The number of interfaces that are defined in this array. static uint32_t DecodeInterfaceArrayLength(uint32_t ui32Token) { return (uint32_t)((ui32Token & 0xffff0000) >> 16); } typedef enum CUSTOMDATA_CLASS { CUSTOMDATA_COMMENT = 0, CUSTOMDATA_DEBUGINFO, CUSTOMDATA_OPAQUE, CUSTOMDATA_DCL_IMMEDIATE_CONSTANT_BUFFER, CUSTOMDATA_SHADER_MESSAGE, } CUSTOMDATA_CLASS; static CUSTOMDATA_CLASS DecodeCustomDataClass(uint32_t ui32Token) { return (CUSTOMDATA_CLASS)((ui32Token & 0xfffff800) >> 11); } static uint32_t DecodeInstructionSaturate(uint32_t ui32Token) { return (ui32Token & 0x00002000) ? 1 : 0; } typedef enum OPERAND_MIN_PRECISION { OPERAND_MIN_PRECISION_DEFAULT = 0, // Default precision // for the shader model OPERAND_MIN_PRECISION_FLOAT_16 = 1, // Min 16 bit/component float OPERAND_MIN_PRECISION_FLOAT_2_8 = 2, // Min 10(2.8)bit/comp. float OPERAND_MIN_PRECISION_SINT_16 = 4, // Min 16 bit/comp. signed integer OPERAND_MIN_PRECISION_UINT_16 = 5, // Min 16 bit/comp. unsigned integer } OPERAND_MIN_PRECISION; static uint32_t DecodeOperandMinPrecision(uint32_t ui32Token) { return (ui32Token & 0x0001C000) >> 14; } static uint32_t DecodeOutputControlPointCount(uint32_t ui32Token) { return ((ui32Token & 0x0001f800) >> 11); } typedef enum IMMEDIATE_ADDRESS_OFFSET_COORD { IMMEDIATE_ADDRESS_OFFSET_U = 0, IMMEDIATE_ADDRESS_OFFSET_V = 1, IMMEDIATE_ADDRESS_OFFSET_W = 2, } IMMEDIATE_ADDRESS_OFFSET_COORD; #define IMMEDIATE_ADDRESS_OFFSET_SHIFT(Coord) (9+4*((Coord)&3)) #define IMMEDIATE_ADDRESS_OFFSET_MASK(Coord) (0x0000000f<>(IMMEDIATE_ADDRESS_OFFSET_SHIFT(eCoord)))); } // UAV access scope flags static const uint32_t GLOBALLY_COHERENT_ACCESS = 0x00010000; static uint32_t DecodeAccessCoherencyFlags(uint32_t ui32Token) { return ui32Token & 0x00010000; } typedef enum RESINFO_RETURN_TYPE { RESINFO_INSTRUCTION_RETURN_FLOAT = 0, RESINFO_INSTRUCTION_RETURN_RCPFLOAT = 1, RESINFO_INSTRUCTION_RETURN_UINT = 2 } RESINFO_RETURN_TYPE; static RESINFO_RETURN_TYPE DecodeResInfoReturnType(uint32_t ui32Token) { return (RESINFO_RETURN_TYPE)((ui32Token & 0x00001800) >> 11); } #include "tokensDX9.h" #endif