d3d_compiler.odin 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. package directx_d3d_compiler
  2. foreign import d3dcompiler "d3dcompiler_47.lib"
  3. D3DCOMPILER_DLL_A :: "d3dcompiler_47.dll"
  4. COMPILER_VERSION :: 47
  5. import "../dxgi"
  6. BOOL :: dxgi.BOOL
  7. IID :: dxgi.IID
  8. SIZE_T :: dxgi.SIZE_T
  9. HRESULT :: dxgi.HRESULT
  10. IUnknown :: dxgi.IUnknown
  11. IUnknown_VTable :: dxgi.IUnknown_VTable
  12. @(default_calling_convention="stdcall", link_prefix="D3D")
  13. foreign d3dcompiler {
  14. ReadFileToBlob :: proc(pFileName: [^]u16, ppContents: ^^ID3DBlob) -> HRESULT ---
  15. WriteBlobToFile :: proc(pBlob: ^ID3DBlob, pFileName: [^]u16, bOverwrite: BOOL) -> HRESULT ---
  16. Compile :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, pSourceName: cstring, pDefines: ^SHADER_MACRO, pInclude: ^ID3DInclude, pEntrypoint: cstring, pTarget: cstring, Flags1: u32, Flags2: u32, ppCode: ^^ID3DBlob, ppErrorMsgs: ^^ID3DBlob) -> HRESULT ---
  17. Compile2 :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, pSourceName: cstring, pDefines: ^SHADER_MACRO, pInclude: ^ID3DInclude, pEntrypoint: cstring, pTarget: cstring, Flags1: u32, Flags2: u32, SecondaryDataFlags: u32, pSecondaryData: rawptr, SecondaryDataSize: SIZE_T, ppCode: ^^ID3DBlob, ppErrorMsgs: ^^ID3DBlob) -> HRESULT ---
  18. CompileFromFile :: proc(pFileName: [^]u16, pDefines: ^SHADER_MACRO, pInclude: ^ID3DInclude, pEntrypoint: cstring, pTarget: cstring, Flags1: u32, Flags2: u32, ppCode: ^^ID3DBlob, ppErrorMsgs: ^^ID3DBlob) -> HRESULT ---
  19. Preprocess :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, pSourceName: cstring, pDefines: ^SHADER_MACRO, pInclude: ^ID3DInclude, ppCodeText: ^^ID3DBlob, ppErrorMsgs: ^^ID3DBlob) -> HRESULT ---
  20. GetDebugInfo :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, ppDebugInfo: ^^ID3DBlob) -> HRESULT ---
  21. Reflect :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, pInterface: ^IID, ppReflector: ^rawptr) -> HRESULT ---
  22. ReflectLibrary :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, riid: ^IID, ppReflector: ^rawptr) -> HRESULT ---
  23. Disassemble :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, Flags: u32, szComments: cstring, ppDisassembly: ^^ID3DBlob) -> HRESULT ---
  24. DisassembleRegion :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, Flags: u32, szComments: cstring, StartByteOffset: SIZE_T, NumInsts: SIZE_T, pFinishByteOffset: ^SIZE_T, ppDisassembly: ^^ID3DBlob) -> HRESULT ---
  25. CreateLinker :: proc(ppLinker: ^^ID3D11Linker) -> HRESULT ---
  26. LoadModule :: proc(pSrcData: rawptr, cbSrcDataSize: SIZE_T, ppModule: ^^ID3D11Module) -> HRESULT ---
  27. GetTraceInstructionOffsets :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, Flags: u32, StartInstIndex: SIZE_T, NumInsts: SIZE_T, pOffsets: ^SIZE_T, pTotalInsts: ^SIZE_T) -> HRESULT ---
  28. GetInputSignatureBlob :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, ppSignatureBlob: ^^ID3DBlob) -> HRESULT ---
  29. GetOutputSignatureBlob :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, ppSignatureBlob: ^^ID3DBlob) -> HRESULT ---
  30. GetInputAndOutputSignatureBlob :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, ppSignatureBlob: ^^ID3DBlob) -> HRESULT ---
  31. StripShader :: proc(pShaderBytecode: rawptr, BytecodeLength: SIZE_T, uStripFlags: u32, ppStrippedBlob: ^^ID3DBlob) -> HRESULT ---
  32. GetBlobPart :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, Part: BLOB_PART, Flags: u32, ppPart: ^^ID3DBlob) -> HRESULT ---
  33. SetBlobPart :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, Part: BLOB_PART, Flags: u32, pPart: rawptr, PartSize: SIZE_T, ppNewShader: ^^ID3DBlob) -> HRESULT ---
  34. CreateBlob :: proc(Size: SIZE_T, ppBlob: ^^ID3DBlob) -> HRESULT ---
  35. CompressShaders :: proc(uNumShaders: u32, pShaderData: ^SHADER_DATA, uFlags: u32, ppCompressedData: ^^ID3DBlob) -> HRESULT ---
  36. DecompressShaders :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, uNumShaders: u32, uStartIndex: u32, pIndices: ^u32, uFlags: u32, ppShaders: ^^ID3DBlob, pTotalShaders: ^u32) -> HRESULT ---
  37. Disassemble10Effect :: proc(pEffect: ^ID3D10Effect, Flags: u32, ppDisassembly: ^^ID3DBlob) -> HRESULT ---
  38. }
  39. D3DCOMPILE :: enum u32 { // TODO: make bit_field
  40. DEBUG = 1 << 0,
  41. SKIP_VALIDATION = 1 << 1,
  42. SKIP_OPTIMIZATION = 1 << 2,
  43. PACK_MATRIX_ROW_MAJOR = 1 << 3,
  44. PACK_MATRIX_COLUMN_MAJOR = 1 << 4,
  45. PARTIAL_PRECISION = 1 << 5,
  46. FORCE_VS_SOFTWARE_NO_OPT = 1 << 6,
  47. FORCE_PS_SOFTWARE_NO_OPT = 1 << 7,
  48. NO_PRESHADER = 1 << 8,
  49. AVOID_FLOW_CONTROL = 1 << 9,
  50. PREFER_FLOW_CONTROL = 1 << 10,
  51. ENABLE_STRICTNESS = 1 << 11,
  52. ENABLE_BACKWARDS_COMPATIBILITY = 1 << 12,
  53. IEEE_STRICTNESS = 1 << 13,
  54. OPTIMIZATION_LEVEL0 = 1 << 14,
  55. OPTIMIZATION_LEVEL1 = 0,
  56. OPTIMIZATION_LEVEL2 = (1 << 14)|(1 << 15), // Added manually
  57. OPTIMIZATION_LEVEL3 = 1 << 15,
  58. RESERVED16 = 1 << 16,
  59. RESERVED17 = 1 << 17,
  60. WARNINGS_ARE_ERRORS = 1 << 18,
  61. RESOURCES_MAY_ALIAS = 1 << 19,
  62. ENABLE_UNBOUNDED_DESCRIPTOR_TABLES = 1 << 20,
  63. ALL_RESOURCES_BOUND = 1 << 21,
  64. DEBUG_NAME_FOR_SOURCE = 1 << 22,
  65. DEBUG_NAME_FOR_BINARY = 1 << 23,
  66. }
  67. EFFECT :: enum u32 { // TODO: make bit_field
  68. CHILD_EFFECT = 1 << 0,
  69. ALLOW_SLOW_OPS = 1 << 1,
  70. }
  71. FLAGS2 :: enum u32 { // TODO: make bit_field
  72. FORCE_ROOT_SIGNATURE_LATEST = 0,
  73. FORCE_ROOT_SIGNATURE_1_0 = 1 << 4,
  74. FORCE_ROOT_SIGNATURE_1_1 = 1 << 5,
  75. }
  76. SECDATA :: enum u32 { // TODO: make bit_field
  77. MERGE_UAV_SLOTS = 0x00000001,
  78. PRESERVE_TEMPLATE_SLOTS = 0x00000002,
  79. REQUIRE_TEMPLATE_MATCH = 0x00000004,
  80. }
  81. DISASM_ENABLE_COLOR_CODE :: 0x00000001
  82. DISASM_ENABLE_DEFAULT_VALUE_PRINTS :: 0x00000002
  83. DISASM_ENABLE_INSTRUCTION_NUMBERING :: 0x00000004
  84. DISASM_ENABLE_INSTRUCTION_CYCLE :: 0x00000008
  85. DISASM_DISABLE_DEBUG_INFO :: 0x00000010
  86. DISASM_ENABLE_INSTRUCTION_OFFSET :: 0x00000020
  87. DISASM_INSTRUCTION_ONLY :: 0x00000040
  88. DISASM_PRINT_HEX_LITERALS :: 0x00000080
  89. GET_INST_OFFSETS_INCLUDE_NON_EXECUTABLE :: 0x00000001
  90. COMPRESS_SHADER_KEEP_ALL_PARTS :: 0x00000001
  91. SHADER_MACRO :: struct {
  92. Name: cstring,
  93. Definition: cstring,
  94. }
  95. ID3D10Blob_UUID_STRING :: "8BA5FB08-5195-40E2-AC58-0D989C3A0102"
  96. ID3D10Blob_UUID := &IID{0x8BA5FB08, 0x5195, 0x40E2, {0xAC, 0x58, 0x0D, 0x98, 0x9C, 0x3A, 0x01, 0x02}}
  97. ID3D10Blob :: struct #raw_union {
  98. #subtype iunknown: IUnknown,
  99. using id3d10blob_vtable: ^ID3D10Blob_VTable,
  100. }
  101. ID3D10Blob_VTable :: struct {
  102. using iunknown_vtable: IUnknown_VTable,
  103. GetBufferPointer: proc "stdcall" (this: ^ID3D10Blob) -> rawptr,
  104. GetBufferSize: proc "stdcall" (this: ^ID3D10Blob) -> SIZE_T,
  105. }
  106. ID3DBlob :: ID3D10Blob
  107. ID3DBlob_VTable :: ID3D10Blob_VTable
  108. INCLUDE_TYPE :: enum i32 {
  109. INCLUDE_LOCAL = 0,
  110. INCLUDE_SYSTEM = 1,
  111. _10_INCLUDE_LOCAL = 0,
  112. _10_INCLUDE_SYSTEM = 1,
  113. INCLUDE_FORCE_DWORD = 2147483647,
  114. }
  115. ID3DInclude :: struct {
  116. vtable: ^ID3DInclude_VTable,
  117. }
  118. ID3DInclude_VTable :: struct {
  119. Open: proc "stdcall" (this: ^ID3DInclude, IncludeType: INCLUDE_TYPE, pFileName: cstring, pParentData: rawptr, ppData: ^rawptr, pBytes: ^u32) -> HRESULT,
  120. Close: proc "stdcall" (this: ^ID3DInclude, pData: rawptr) -> HRESULT,
  121. }
  122. ID3D11Module :: struct #raw_union {
  123. #subtype iunknown: IUnknown,
  124. using id3d11module_vtable: ^ID3D11Module_VTable,
  125. }
  126. ID3D11Module_VTable :: struct {
  127. using iunknown_vtable: IUnknown_VTable,
  128. CreateInstance: proc "stdcall" (this: ^ID3D11Module, pNamespace: cstring, ppModuleInstance: ^^ID3D11ModuleInstance) -> HRESULT,
  129. }
  130. ID3D11ModuleInstance :: struct #raw_union {
  131. #subtype iunknown: IUnknown,
  132. using id3d11moduleinstance_vtable: ^ID3D11ModuleInstance_VTable,
  133. }
  134. ID3D11ModuleInstance_VTable :: struct {
  135. using iunknown_vtable: IUnknown_VTable,
  136. BindConstantBuffer: proc "stdcall" (this: ^ID3D11ModuleInstance, uSrcSlot: u32, uDstSlot: u32, cbDstOffset: u32) -> HRESULT,
  137. BindConstantBufferByName: proc "stdcall" (this: ^ID3D11ModuleInstance, pName: cstring, uDstSlot: u32, cbDstOffset: u32) -> HRESULT,
  138. BindResource: proc "stdcall" (this: ^ID3D11ModuleInstance, uSrcSlot: u32, uDstSlot: u32, uCount: u32) -> HRESULT,
  139. BindResourceByName: proc "stdcall" (this: ^ID3D11ModuleInstance, pName: cstring, uDstSlot: u32, uCount: u32) -> HRESULT,
  140. BindSampler: proc "stdcall" (this: ^ID3D11ModuleInstance, uSrcSlot: u32, uDstSlot: u32, uCount: u32) -> HRESULT,
  141. BindSamplerByName: proc "stdcall" (this: ^ID3D11ModuleInstance, pName: cstring, uDstSlot: u32, uCount: u32) -> HRESULT,
  142. BindUnorderedAccessView: proc "stdcall" (this: ^ID3D11ModuleInstance, uSrcSlot: u32, uDstSlot: u32, uCount: u32) -> HRESULT,
  143. BindUnorderedAccessViewByName: proc "stdcall" (this: ^ID3D11ModuleInstance, pName: cstring, uDstSlot: u32, uCount: u32) -> HRESULT,
  144. BindResourceAsUnorderedAccessView: proc "stdcall" (this: ^ID3D11ModuleInstance, uSrcSrvSlot: u32, uDstUavSlot: u32, uCount: u32) -> HRESULT,
  145. BindResourceAsUnorderedAccessViewByName: proc "stdcall" (this: ^ID3D11ModuleInstance, pSrvName: cstring, uDstUavSlot: u32, uCount: u32) -> HRESULT,
  146. }
  147. ID3D11Linker :: struct #raw_union {
  148. #subtype iunknown: IUnknown,
  149. using id3d11linker_vtable: ^ID3D11Linker_VTable,
  150. }
  151. ID3D11Linker_VTable :: struct {
  152. using iunknown_vtable: IUnknown_VTable,
  153. Link: proc "stdcall" (this: ^ID3D11Linker, pEntry: ^ID3D11ModuleInstance, pEntryName: cstring, pTargetName: cstring, uFlags: u32, ppShaderBlob: ^^ID3DBlob, ppErrorBuffer: ^^ID3DBlob) -> HRESULT,
  154. UseLibrary: proc "stdcall" (this: ^ID3D11Linker, pLibraryMI: ^ID3D11ModuleInstance) -> HRESULT,
  155. AddClipPlaneFromCBuffer: proc "stdcall" (this: ^ID3D11Linker, uCBufferSlot: u32, uCBufferEntry: u32) -> HRESULT,
  156. }
  157. pD3DCompile :: #type proc "c" (a0: rawptr, a1: SIZE_T, a2: cstring, a3: ^SHADER_MACRO, a4: ^ID3DInclude, a5: cstring, a6: cstring, a7: u32, a8: u32, a9: ^^ID3DBlob, a10: ^^ID3DBlob) -> HRESULT
  158. pD3DPreprocess :: #type proc "c" (a0: rawptr, a1: SIZE_T, a2: cstring, a3: ^SHADER_MACRO, a4: ^ID3DInclude, a5: ^^ID3DBlob, a6: ^^ID3DBlob) -> HRESULT
  159. pD3DDisassemble :: #type proc "c" (a0: rawptr, a1: SIZE_T, a2: u32, a3: cstring, a4: ^^ID3DBlob) -> HRESULT
  160. D3DCOMPILER_STRIP_FLAGS :: enum u32 { // TODO: make bit_field
  161. REFLECTION_DATA = 0x1,
  162. DEBUG_INFO = 0x2,
  163. TEST_BLOBS = 0x4,
  164. PRIVATE_DATA = 0x8,
  165. ROOT_SIGNATURE = 0x10,
  166. FORCE_DWORD = 0x7fffffff,
  167. }
  168. BLOB_PART :: enum i32 {
  169. INPUT_SIGNATURE_BLOB = 0,
  170. OUTPUT_SIGNATURE_BLOB = 1,
  171. INPUT_AND_OUTPUT_SIGNATURE_BLOB = 2,
  172. PATCH_CONSTANT_SIGNATURE_BLOB = 3,
  173. ALL_SIGNATURE_BLOB = 4,
  174. DEBUG_INFO = 5,
  175. LEGACY_SHADER = 6,
  176. XNA_PREPASS_SHADER = 7,
  177. XNA_SHADER = 8,
  178. PDB = 9,
  179. PRIVATE_DATA = 10,
  180. ROOT_SIGNATURE = 11,
  181. DEBUG_NAME = 12,
  182. TEST_ALTERNATE_SHADER = 32768,
  183. TEST_COMPILE_DETAILS = 32769,
  184. TEST_COMPILE_PERF = 32770,
  185. TEST_COMPILE_REPORT = 32771,
  186. }
  187. SHADER_DATA :: struct {
  188. pBytecode: rawptr,
  189. BytecodeLength: SIZE_T,
  190. }
  191. ID3D10Effect :: struct {
  192. // ????
  193. }