diff options
Diffstat (limited to 'Runtime/GfxDevice/d3d11/D3D11ByteCode.h')
-rw-r--r-- | Runtime/GfxDevice/d3d11/D3D11ByteCode.h | 856 |
1 files changed, 856 insertions, 0 deletions
diff --git a/Runtime/GfxDevice/d3d11/D3D11ByteCode.h b/Runtime/GfxDevice/d3d11/D3D11ByteCode.h new file mode 100644 index 0000000..020a8c1 --- /dev/null +++ b/Runtime/GfxDevice/d3d11/D3D11ByteCode.h @@ -0,0 +1,856 @@ +#pragma once + +#include "Runtime/Utilities/dynamic_array.h" + +struct _D3D11_SIGNATURE_PARAMETER_DESC; +typedef struct _D3D11_SIGNATURE_PARAMETER_DESC D3D11_SIGNATURE_PARAMETER_DESC; + + + +#define MAKE_FOURCC(a, b, c, d) ((UInt32)(UInt8)(a) | ((UInt32)(UInt8)(b) << 8) | ((UInt32)(UInt8)(c) << 16) | ((UInt32)(UInt8)(d) << 24 )) +#define kFOURCC_DXBC MAKE_FOURCC('D', 'X', 'B', 'C') + +// Reflection or debug information? stripped shaders don't have this chunk +#define kFOURCC_RDEF MAKE_FOURCC('R', 'D', 'E', 'F') +// Shader input signature +#define kFOURCC_ISGN MAKE_FOURCC('I', 'S', 'G', 'N') +// Shader output signature +#define kFOURCC_OSGN MAKE_FOURCC('O', 'S', 'G', 'N') +// Shader code +#define kFOURCC_SHDR MAKE_FOURCC('S', 'H', 'D', 'R') +#define kFOURCC_SHEX MAKE_FOURCC('S', 'H', 'E', 'X') +// Statistics? stripped shaders don't have this chunk +#define kFOURCC_STAT MAKE_FOURCC('S', 'T', 'A', 'T') +// Patch information? +#define kFOURCC_PCSG MAKE_FOURCC('P', 'C', 'S', 'G') +//FL 9.x SM 2.0 shader magic signature +#define kFOURCC_SM20 MAKE_FOURCC('A', 'o', 'n', '9') + + +struct DXBCChunkHeader +{ + unsigned fourcc; + unsigned size; +}; + + +struct DXBCContainer +{ + const void* data; + dynamic_array<DXBCChunkHeader*> chunks; +}; + +struct DXBCSignatureElement +{ + UInt32 name_offset; + UInt32 semantic_index; + UInt32 system_value_type; + UInt32 component_type; + UInt32 register_num; + UInt8 mask; + UInt8 read_write_mask; + UInt8 stream; + UInt8 unused; +}; + +struct DXBCChunkSig : public DXBCChunkHeader +{ + UInt32 count; + UInt32 unk8; // always has 8? + DXBCSignatureElement elements[1]; +}; + +struct DXBCChunkCode : public DXBCChunkHeader +{ + UInt32 version; + UInt32 length; // length in dword tokens +}; + +struct DXBCChunkSM20 : public DXBCChunkHeader +{ + UInt32 length; // length in bytes +}; + + +struct SM4TokInstruction +{ + // not an union directly because unions can't be inherited from + union + { + UInt32 dword; + // length and extended are always present, but they are only here to reduce duplication + struct + { + unsigned opcode : 11; + unsigned _11_23 : 13; + unsigned length : 7; + unsigned extended : 1; + }; + struct + { + unsigned opcode : 11; + unsigned resinfo_return_type : 2; + unsigned sat : 1; + unsigned _14_17 : 4; + unsigned test_nz : 1; // bit 18 + unsigned precise_mask : 4; + unsigned _23 : 1; + unsigned length : 7; + unsigned extended : 1; + } insn; + struct + { + unsigned opcode : 11; + unsigned threads_in_group : 1; + unsigned shared_memory : 1; + unsigned uav_group : 1; + unsigned uav_global : 1; + unsigned _15_17 : 3; + } sync; + struct + { + unsigned opcode : 11; + unsigned allow_refactoring : 1; + unsigned fp64 : 1; + unsigned early_depth_stencil : 1; + unsigned enable_raw_and_structured_in_non_cs : 1; + } dcl_global_flags; + struct + { + unsigned opcode : 11; + unsigned target : 5; + unsigned nr_samples : 7; + } dcl_resource; + struct + { + unsigned opcode : 11; + unsigned shadow : 1; + unsigned mono : 1; + } dcl_sampler; + struct + { + unsigned opcode : 11; + unsigned interpolation : 5; + } dcl_input_ps; + struct + { + unsigned opcode : 11; + unsigned dynamic : 1; + } dcl_constant_buffer; + struct + { + unsigned opcode : 11; + unsigned primitive : 6; + } dcl_gs_input_primitive; + struct + { + unsigned opcode : 11; + unsigned primitive_topology : 7; + } dcl_gs_output_primitive_topology; + struct + { + unsigned opcode : 11; + unsigned control_points : 6; + } dcl_input_control_point_count; + struct + { + unsigned opcode : 11; + unsigned control_points : 6; + } dcl_output_control_point_count; + struct + { + unsigned opcode : 11; + unsigned domain : 3; /* D3D_TESSELLATOR_DOMAIN */ + } dcl_tess_domain; + struct + { + unsigned opcode : 11; + unsigned partitioning : 3; /* D3D_TESSELLATOR_PARTITIONING */ + } dcl_tess_partitioning; + struct + { + unsigned opcode : 11; + unsigned primitive : 3; /* D3D_TESSELLATOR_OUTPUT_PRIMITIVE */ + } dcl_tess_output_primitive; + }; +}; + +union SM4TokInstructionEx +{ + UInt32 dword; + struct + { + unsigned type : 6; + unsigned _6_30 : 25; + unsigned extended :1; + }; + struct + { + unsigned type : 6; + unsigned _6_8 : 3; + int offset_u : 4; + int offset_v : 4; + int offset_w : 4; + } sample_controls; + struct + { + unsigned type : 6; + unsigned target : 5; + } resource_target; + struct + { + unsigned type : 6; + unsigned x : 4; + unsigned y : 4; + unsigned z : 4; + unsigned w : 4; + } resource_return_type; +}; + +struct SM4TokOperand +{ + union { + UInt32 dword; + struct { + unsigned comps_enum : 2; /* sm4_operands_comps */ + unsigned mode : 2; /* SM4OperMode */ + unsigned sel : 8; + unsigned file : 8; /* SM4RegFile */ + unsigned num_indices : 2; + unsigned index0_repr : 3; /* SM4OperIndexRepr */ + unsigned index1_repr : 3; /* SM4OperIndexRepr */ + unsigned index2_repr : 3; /* SM4OperIndexRepr */ + unsigned extended : 1; + }; + }; +}; + +struct SM2TokInstruction +{ + union + { + UInt32 dword; + struct + { + unsigned opcode : 16; + unsigned specific : 8; + unsigned length : 4; + unsigned predicated : 1; + unsigned _res0 : 1; + unsigned _res1 : 1; + unsigned _res2 : 1; + }; + struct + { + unsigned minor : 8; + unsigned major : 8; + unsigned _magic : 16; + } version; + }; +}; + +struct SM2TokDst +{ + union { + UInt32 dword; + struct { + unsigned reg_num : 11; + unsigned reg_type34 : 2; + unsigned _res0 : 1; + unsigned _res1 : 2; + unsigned write_mask : 4; + unsigned res_mod : 4; + unsigned shift_scl : 4; + unsigned reg_type02 : 3; + unsigned _one : 1; + }; + }; +}; + +void dxbc_create(struct DXBCChunkHeader** chunks, unsigned num_chunks, dynamic_array<UInt8>& out); + + +DXBCContainer* dxbc_parse(const void* data, int size); +DXBCChunkHeader* dxbc_find_chunk(const void* data, int size, unsigned fourcc); +void dxbc_print(const DXBCContainer* dxbc); +int dxbc_parse_signature(const DXBCChunkSig* sig, D3D11_SIGNATURE_PARAMETER_DESC** params); + + +enum SM2Opcode +{ + kSM2Op_NOP = 0, + kSM2Op_MOV , + kSM2Op_ADD , + kSM2Op_SUB , + kSM2Op_MAD , + kSM2Op_MUL , + kSM2Op_RCP , + kSM2Op_RSQ , + kSM2Op_DP3 , + kSM2Op_DP4 , + kSM2Op_MIN , + kSM2Op_MAX , + kSM2Op_SLT , + kSM2Op_SGE , + kSM2Op_EXP , + kSM2Op_LOG , + kSM2Op_LIT , + kSM2Op_DST , + kSM2Op_LRP , + kSM2Op_FRC , + kSM2Op_M4x4 , + kSM2Op_M4x3 , + kSM2Op_M3x4 , + kSM2Op_M3x3 , + kSM2Op_M3x2 , + kSM2Op_CALL , + kSM2Op_CALLNZ , + kSM2Op_LOOP , + kSM2Op_RET , + kSM2Op_ENDLOOP , + kSM2Op_LABEL , + kSM2Op_DCL , + kSM2Op_POW , + kSM2Op_CRS , + kSM2Op_SGN , + kSM2Op_ABS , + kSM2Op_NRM , + kSM2Op_SINCOS , + kSM2Op_REP , + kSM2Op_ENDREP , + kSM2Op_IF , + kSM2Op_IFC , + kSM2Op_ELSE , + kSM2Op_ENDIF , + kSM2Op_BREAK , + kSM2Op_BREAKC , + kSM2Op_MOVA , + kSM2Op_DEFB , + kSM2Op_DEFI , + + kSM2Op_TEXCOORD = 64, + kSM2Op_TEXKILL , + kSM2Op_TEX , + kSM2Op_TEXBEM , + kSM2Op_TEXBEML , + kSM2Op_TEXREG2AR , + kSM2Op_TEXREG2GB , + kSM2Op_TEXM3x2PAD , + kSM2Op_TEXM3x2TEX , + kSM2Op_TEXM3x3PAD , + kSM2Op_TEXM3x3TEX , + kSM2Op_RESERVED0 , + kSM2Op_TEXM3x3SPEC , + kSM2Op_TEXM3x3VSPEC , + kSM2Op_EXPP , + kSM2Op_LOGP , + kSM2Op_CND , + kSM2Op_DEF , + kSM2Op_TEXREG2RGB , + kSM2Op_TEXDP3TEX , + kSM2Op_TEXM3x2DEPTH , + kSM2Op_TEXDP3 , + kSM2Op_TEXM3x3 , + kSM2Op_TEXDEPTH , + kSM2Op_CMP , + kSM2Op_BEM , + kSM2Op_DP2ADD , + kSM2Op_DSX , + kSM2Op_DSY , + kSM2Op_TEXLDD , + kSM2Op_SETP , + kSM2Op_TEXLDL , + kSM2Op_BREAKP , + + kSM2Op_PHASE = 0xFFFD, + kSM2Op_COMMENT = 0xFFFE, + kSM2Op_END = 0xFFFF, +}; + +enum SM4ShaderType +{ + kSM4Shader_Pixel, + kSM4Shader_Vertex, +}; + +enum SM4Opcode +{ + kSM4Op_ADD, + kSM4Op_AND, + kSM4Op_BREAK, + kSM4Op_BREAKC, + kSM4Op_CALL, + kSM4Op_CALLC, + kSM4Op_CASE, + kSM4Op_CONTINUE, + kSM4Op_CONTINUEC, + kSM4Op_CUT, + kSM4Op_DEFAULT, + kSM4Op_DERIV_RTX, + kSM4Op_DERIV_RTY, + kSM4Op_DISCARD, + kSM4Op_DIV, + kSM4Op_DP2, + kSM4Op_DP3, + kSM4Op_DP4, + kSM4Op_ELSE, + kSM4Op_EMIT, + kSM4Op_EMITTHENCUT, + kSM4Op_ENDIF, + kSM4Op_ENDLOOP, + kSM4Op_ENDSWITCH, + kSM4Op_EQ, + kSM4Op_EXP, + kSM4Op_FRC, + kSM4Op_FTOI, + kSM4Op_FTOU, + kSM4Op_GE, + kSM4Op_IADD, + kSM4Op_IF, + kSM4Op_IEQ, + kSM4Op_IGE, + kSM4Op_ILT, + kSM4Op_IMAD, + kSM4Op_IMAX, + kSM4Op_IMIN, + kSM4Op_IMUL, + kSM4Op_INE, + kSM4Op_INEG, + kSM4Op_ISHL, + kSM4Op_ISHR, + kSM4Op_ITOF, + kSM4Op_LABEL, + kSM4Op_LD, + kSM4Op_LD_MS, + kSM4Op_LOG, + kSM4Op_LOOP, + kSM4Op_LT, + kSM4Op_MAD, + kSM4Op_MIN, + kSM4Op_MAX, + kSM4Op_CUSTOMDATA, + kSM4Op_MOV, + kSM4Op_MOVC, + kSM4Op_MUL, + kSM4Op_NE, + kSM4Op_NOP, + kSM4Op_NOT, + kSM4Op_OR, + kSM4Op_RESINFO, + kSM4Op_RET, + kSM4Op_RETC, + kSM4Op_ROUND_NE, + kSM4Op_ROUND_NI, + kSM4Op_ROUND_PI, + kSM4Op_ROUND_Z, + kSM4Op_RSQ, + kSM4Op_SAMPLE, + kSM4Op_SAMPLE_C, + kSM4Op_SAMPLE_C_LZ, + kSM4Op_SAMPLE_L, + kSM4Op_SAMPLE_D, + kSM4Op_SAMPLE_B, + kSM4Op_SQRT, + kSM4Op_SWITCH, + kSM4Op_SINCOS, + kSM4Op_UDIV, + kSM4Op_ULT, + kSM4Op_UGE, + kSM4Op_UMUL, + kSM4Op_UMAD, + kSM4Op_UMAX, + kSM4Op_UMIN, + kSM4Op_USHR, + kSM4Op_UTOF, + kSM4Op_XOR, + kSM4Op_DCL_RESOURCE, + kSM4Op_DCL_CONSTANT_BUFFER, + kSM4Op_DCL_SAMPLER, + kSM4Op_DCL_INDEX_RANGE, + kSM4Op_DCL_GS_OUTPUT_PRIMITIVE_TOPOLOGY, + kSM4Op_DCL_GS_INPUT_PRIMITIVE, + kSM4Op_DCL_MAX_OUTPUT_VERTEX_COUNT, + kSM4Op_DCL_INPUT, + kSM4Op_DCL_INPUT_SGV, + kSM4Op_DCL_INPUT_SIV, + kSM4Op_DCL_INPUT_PS, + kSM4Op_DCL_INPUT_PS_SGV, + kSM4Op_DCL_INPUT_PS_SIV, + kSM4Op_DCL_OUTPUT, + kSM4Op_DCL_OUTPUT_SGV, + kSM4Op_DCL_OUTPUT_SIV, + kSM4Op_DCL_TEMPS, + kSM4Op_DCL_INDEXABLE_TEMP, + kSM4Op_DCL_GLOBAL_FLAGS, + kSM4Op_D3D10_COUNT, + kSM4Op_LOD, + kSM4Op_GATHER4, + kSM4Op_SAMPLE_POS, + kSM4Op_SAMPLE_INFO, + kSM4Op_D3D10_1_COUNT, + kSM4Op_HS_DECLS, + kSM4Op_HS_CONTROL_POINT_PHASE, + kSM4Op_HS_FORK_PHASE, + kSM4Op_HS_JOIN_PHASE, + kSM4Op_EMIT_STREAM, + kSM4Op_CUT_STREAM, + kSM4Op_EMITTHENCUT_STREAM, + kSM4Op_INTERFACE_CALL, + kSM4Op_BUFINFO, + kSM4Op_DERIV_RTX_COARSE, + kSM4Op_DERIV_RTX_FINE, + kSM4Op_DERIV_RTY_COARSE, + kSM4Op_DERIV_RTY_FINE, + kSM4Op_GATHER4_C, + kSM4Op_GATHER4_PO, + kSM4Op_GATHER4_PO_C, + kSM4Op_RCP, + kSM4Op_F32TOF16, + kSM4Op_F16TOF32, + kSM4Op_UADDC, + kSM4Op_USUBB, + kSM4Op_COUNTBITS, + kSM4Op_FIRSTBIT_HI, + kSM4Op_FIRSTBIT_LO, + kSM4Op_FIRSTBIT_SHI, + kSM4Op_UBFE, + kSM4Op_IBFE, + kSM4Op_BFI, + kSM4Op_BFREV, + kSM4Op_SWAPC, + kSM4Op_DCL_STREAM, + kSM4Op_DCL_FUNCTION_BODY, + kSM4Op_DCL_FUNCTION_TABLE, + kSM4Op_DCL_INTERFACE, + kSM4Op_DCL_INPUT_CONTROL_POINT_COUNT, + kSM4Op_DCL_OUTPUT_CONTROL_POINT_COUNT, + kSM4Op_DCL_TESS_DOMAIN, + kSM4Op_DCL_TESS_PARTITIONING, + kSM4Op_DCL_TESS_OUTPUT_PRIMITIVE, + kSM4Op_DCL_HS_MAX_TESSFACTOR, + kSM4Op_DCL_HS_FORK_PHASE_INSTANCE_COUNT, + kSM4Op_DCL_HS_JOIN_PHASE_INSTANCE_COUNT, + kSM4Op_DCL_THREAD_GROUP, + kSM4Op_DCL_UNORDERED_ACCESS_VIEW_TYPED, + kSM4Op_DCL_UNORDERED_ACCESS_VIEW_RAW, + kSM4Op_DCL_UNORDERED_ACCESS_VIEW_STRUCTURED, + kSM4Op_DCL_THREAD_GROUP_SHARED_MEMORY_RAW, + kSM4Op_DCL_THREAD_GROUP_SHARED_MEMORY_STRUCTURED, + kSM4Op_DCL_RESOURCE_RAW, + kSM4Op_DCL_RESOURCE_STRUCTURED, + kSM4Op_LD_UAV_TYPED, + kSM4Op_STORE_UAV_TYPED, + kSM4Op_LD_RAW, + kSM4Op_STORE_RAW, + kSM4Op_LD_STRUCTURED, + kSM4Op_STORE_STRUCTURED, + kSM4Op_ATOMIC_AND, + kSM4Op_ATOMIC_OR, + kSM4Op_ATOMIC_XOR, + kSM4Op_ATOMIC_CMP_STORE, + kSM4Op_ATOMIC_IADD, + kSM4Op_ATOMIC_IMAX, + kSM4Op_ATOMIC_IMIN, + kSM4Op_ATOMIC_UMAX, + kSM4Op_ATOMIC_UMIN, + kSM4Op_IMM_ATOMIC_ALLOC, + kSM4Op_IMM_ATOMIC_CONSUME, + kSM4Op_IMM_ATOMIC_IADD, + kSM4Op_IMM_ATOMIC_AND, + kSM4Op_IMM_ATOMIC_OR, + kSM4Op_IMM_ATOMIC_XOR, + kSM4Op_IMM_ATOMIC_EXCH, + kSM4Op_IMM_ATOMIC_CMP_EXCH, + kSM4Op_IMM_ATOMIC_IMAX, + kSM4Op_IMM_ATOMIC_IMIN, + kSM4Op_IMM_ATOMIC_UMAX, + kSM4Op_IMM_ATOMIC_UMIN, + kSM4Op_SYNC, + kSM4Op_DADD, + kSM4Op_DMAX, + kSM4Op_DMIN, + kSM4Op_DMUL, + kSM4Op_DEQ, + kSM4Op_DGE, + kSM4Op_DLT, + kSM4Op_DNE, + kSM4Op_DMOV, + kSM4Op_DMOVC, + kSM4Op_DTOF, + kSM4Op_FTOD, + kSM4Op_EVAL_SNAPPED, + kSM4Op_EVAL_SAMPLE_INDEX, + kSM4Op_EVAL_CENTROID, + kSM4Op_DCL_GS_INSTANCE_COUNT, + kSM4Op_COUNT +}; + + +enum SM4Interpolation +{ + kSM4Interp_UNDEFINED, + kSM4Interp_CONSTANT, + kSM4Interp_LINEAR, + kSM4Interp_LINEAR_CENTROID, + kSM4Interp_LINEAR_NOPERSPECTIVE, + kSM4Interp_LINEAR_NOPERSPECTIVE_CENTROID, + kSM4Interp_LINEAR_SAMPLE, + kSM4Interp_LINEAR_NOPERSPECTIVE_SAMPLE, + kSM4Interp_COUNT +}; + + +enum SM4OperCompnum +{ + kSM4OperComp0, + kSM4OperComp1, + kSM4OperComp4, + kSM4OperCompN, + kSM4OperComp, + kSM4OperCompCOUNT +}; + +enum SM4OperMode +{ + SM4_OPERAND_MODE_MASK, + SM4_OPERAND_MODE_SWIZZLE, + SM4_OPERAND_MODE_SCALAR, + SM4_OPERAND_MODE_, + SM4_OPERAND_MODE_COUNT +}; + +enum SM4OperIndexRepr +{ + SM4_OPERAND_INDEX_REPR_IMM32, + SM4_OPERAND_INDEX_REPR_IMM64, + SM4_OPERAND_INDEX_REPR_REG, + SM4_OPERAND_INDEX_REPR_REG_IMM32, + SM4_OPERAND_INDEX_REPR_REG_IMM64, + SM4_OPERAND_INDEX_REPR_COUNT +}; + + +enum SM4RegFile +{ + kSM4File_TEMP, + kSM4File_INPUT, + kSM4File_OUTPUT, + kSM4File_INDEXABLE_TEMP, + kSM4File_IMMEDIATE32, + kSM4File_IMMEDIATE64, + kSM4File_SAMPLER, + kSM4File_RESOURCE, + kSM4File_CONSTANT_BUFFER, + kSM4File_IMMEDIATE_CONSTANT_BUFFER, + kSM4File_LABEL, + kSM4File_INPUT_PRIMITIVEID, + kSM4File_OUTPUT_DEPTH, + kSM4File_NULL, + kSM4File_RASTERIZER, + kSM4File_OUTPUT_COVERAGE_MASK, + kSM4File_STREAM, + kSM4File_FUNCTION_BODY, + kSM4File_FUNCTION_TABLE, + kSM4File_INTERFACE, + kSM4File_FUNCTION_INPUT, + kSM4File_FUNCTION_OUTPUT, + kSM4File_OUTPUT_CONTROL_POINT_ID, + kSM4File_INPUT_FORK_INSTANCE_ID, + kSM4File_INPUT_JOIN_INSTANCE_ID, + kSM4File_INPUT_CONTROL_POINT, + kSM4File_OUTPUT_CONTROL_POINT, + kSM4File_INPUT_PATCH_CONSTANT, + kSM4File_INPUT_DOMAIN_POINT, + kSM4File_THIS_POINTER, + kSM4File_UNORDERED_ACCESS_VIEW, + kSM4File_THREAD_GROUP_SHARED_MEMORY, + kSM4File_INPUT_THREAD_ID, + kSM4File_INPUT_THREAD_GROUP_ID, + kSM4File_INPUT_THREAD_ID_IN_GROUP, + kSM4File_INPUT_COVERAGE_MASK, + kSM4File_INPUT_THREAD_ID_IN_GROUP_FLATTENED, + kSM4File_INPUT_GS_INSTANCE_ID, + kSM4File_OUTPUT_DEPTH_GREATER_EQUAL, + kSM4File_OUTPUT_DEPTH_LESS_EQUAL, + kSM4File_CYCLE_COUNTER, + kSM4File_COUNT +}; + + +extern const char* kSM4OpcodeNames[kSM4Op_COUNT]; + + +enum SM4Swizzle { + kSM4SwzNone = 0xE4, // 11.10.01.00 + kSM4SwzRepX = 0x00, // 00.00.00.00 + kSM4SwzRepY = 0x55, // 01.01.01.01 + kSM4SwzRepZ = 0xAA, // 10.10.10.10 + kSM4SwzRepW = 0xFF, // 11.11.11.11 + kSM4SwzXYZZ = 0xA4, // 10.10.01.00 + kSM4SwzXYYY = 0x54, // 01.01.01.00 + kSM4SwzXYXX = 0x04, // 00.00.01.00 + kSM4SwzXYXY = 0x44, // 01.00.01.00 + kSM4SwzZWZW = 0xEE, // 11.10.11.10 + kSM4SwzZWWW = 0xFE, // 11.11.11.10 + kSM4SwzYYYZ = 0x95, // 10.01.01.01 + kSM4SwzXYZX = 0x24, // 00.10.01.00 + kSM4SwzXYZY = 0x64, // 01.10.01.00 + kSM4SwzYZWY = 0x79, // 01.11.10.01 +}; + +enum SM4Target +{ + kSM4Target_UNKNOWN, + kSM4Target_BUFFER, + kSM4Target_TEXTURE1D, + kSM4Target_TEXTURE2D, + kSM4Target_TEXTURE2DMS, + kSM4Target_TEXTURE3D, + kSM4Target_TEXTURECUBE, + kSM4Target_TEXTURE1DARRAY, + kSM4Target_TEXTURE2DARRAY, + kSM4Target_TEXTURE2DMSARRAY, + kSM4Target_TEXTURECUBEARRAY, + kSM4Target_RAW_BUFFER, + kSM4Target_STRUCTURED_BUFFER, + kSM4Target_COUNT +}; + + +struct DXBCBuilder; +DXBCBuilder* dxb_create(int major, int minor, SM4ShaderType type); +void dxb_destroy(DXBCBuilder* b); + + +struct DXBCCodeBuilder; +DXBCCodeBuilder* dxb_get_code_builder(DXBCBuilder* b); +DXBCCodeBuilder* dxb_create_code(dynamic_array<UInt32>& destArray); +void dxb_destroy_code(DXBCCodeBuilder* b); + +// result must be free()'d +void* dxb_build (DXBCBuilder* b, size_t& outSize); + +void dxb_dcl_input (DXBCBuilder* b, const char* name, int index, int reg, int mask = 0xF); +void dxb_dcl_output (DXBCBuilder* b, const char* name, int index, int reg, int mask = 0xF); +void dxb_dcl_tex (DXBCBuilder* b, int index, SM4Target dim); +void dxb_dcl_cb (DXBCBuilder* b, int index, int size); + +void dxb_op (DXBCCodeBuilder* b, SM4Opcode op, bool sat); +void dxb_reg (DXBCCodeBuilder* b, char rchar, int reg, unsigned mask = 0xF); +void dxb_swz (DXBCCodeBuilder* b, char rchar, int reg, unsigned swiz = kSM4SwzNone, bool neg=false); +void dxb_float1 (DXBCCodeBuilder* b, float v); +void dxb_int1 (DXBCCodeBuilder* b, int i); +void dxb_float4 (DXBCCodeBuilder* b, float v0, float v1, float v2, float v3); + +//------------------------------------------------------------------------------------ +//SM 2.0 stuff +void dxb_dcl_input2 (DXBCBuilder* b, const char* name, int index, int reg, int mask); +void dxb_dcl_output2 (DXBCBuilder* b, const char* name, int index, int reg, int mask); +void dxb_dcl_tex2 (DXBCBuilder* b, int index, SM4Target dim); +void dxb_op2 (DXBCBuilder* b, SM2Opcode op, bool sat, int scratchTmpRegForSat = -1); +void dxb_reg2 (DXBCBuilder* b, char rchar, int reg, unsigned mask = 0xF); +void dxb_swz2 (DXBCBuilder* b, char rchar, int reg, unsigned swiz = kSM4SwzNone, bool neg=false); +int dxb_imm_f4 (DXBCBuilder* b, float v0, float v1, float v2, float v3); +SM2Opcode dxb_to_sm2 (SM4Opcode op); + + +struct DXBCBuilderStream +{ + //no shader builder and no auto SM20 code for raw code works + DXBCBuilderStream (DXBCCodeBuilder* b) : builder(NULL), bldcode(b), noSM2(true) { } + DXBCBuilderStream (DXBCBuilder* b) : builder(b), bldcode(dxb_get_code_builder(b)), noSM2(false) { } + + DXBCBuilderStream& op(SM4Opcode op) + { + dxb_op(bldcode, op, false); + if (!noSM2 && builder) + dxb_op2(builder, dxb_to_sm2(op), false); + return *this; + } + DXBCBuilderStream& op_sat(SM4Opcode op, int scratchTmpRegForSM2) + { + dxb_op(bldcode, op, true); + if (!noSM2 && builder) + dxb_op2(builder, dxb_to_sm2(op), true, scratchTmpRegForSM2); + return *this; + } + DXBCBuilderStream& reg (char rchar, int reg, unsigned mask = 0xF) + { + dxb_reg(bldcode, rchar, reg, mask); + if (!noSM2 && builder) + dxb_reg2(builder, rchar, reg, mask); + return *this; + } + DXBCBuilderStream& swz (char rchar, int reg, unsigned swiz = kSM4SwzNone, bool neg=false) + { + dxb_swz(bldcode, rchar, reg, swiz, neg); + if (!noSM2 && builder) + dxb_swz2(builder, rchar, reg, swiz, neg); + return *this; + } + DXBCBuilderStream& float1 (float v) + { + dxb_float1(bldcode, v); + + if (!noSM2 && builder) + { + const int reg = dxb_imm_f4 (builder, v, v, v, v); + dxb_swz2(builder, 'c', reg, kSM4SwzRepX); + } + return *this; + } + // float1 constant for SM2 only + DXBCBuilderStream& float1_2 (float v) + { + if (builder) + { + const int reg = dxb_imm_f4 (builder, v, v, v, v); + dxb_swz2(builder, 'c', reg, kSM4SwzRepX); + } + return *this; + } + DXBCBuilderStream& float4 (float v0, float v1, float v2, float v3) + { + dxb_float4(bldcode, v0, v1, v2, v3); + + if (!noSM2 && builder) + { + const int reg = dxb_imm_f4 (builder, v0, v1, v2, v3); + dxb_swz2(builder, 'c', reg); + } + return *this; + } + + + //------------------------------------------------------------------------------------ + //SM 2.0 stuff + + DXBCBuilderStream& op2(SM2Opcode op) + { + dxb_op2(builder, op, false); + return *this; + } + DXBCBuilderStream& reg2 (char rchar, int reg, unsigned mask = 0xF) + { + dxb_reg2(builder, rchar, reg, mask); + return *this; + } + DXBCBuilderStream& swz2 (char rchar, int reg, unsigned swiz = kSM4SwzNone, bool neg=false) + { + dxb_swz2(builder, rchar, reg, swiz, neg); + return *this; + } + void noAutoSM2(bool _noSM2=true) + { + noSM2 = _noSM2; + } + void autoSM2() + { + noSM2 = false; + } + + DXBCBuilder* builder; + DXBCCodeBuilder* bldcode; + bool noSM2; +}; + |