DxilRootSignature.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // DxilRootSignature.h //
  4. // Copyright (C) Microsoft Corporation. All rights reserved. //
  5. // This file is distributed under the University of Illinois Open Source //
  6. // License. See LICENSE.TXT for details. //
  7. // //
  8. // HLSL root signature parsing. //
  9. // //
  10. ///////////////////////////////////////////////////////////////////////////////
  11. #pragma once
  12. #ifndef __DXC_ROOTSIGNATURE__
  13. #define __DXC_ROOTSIGNATURE__
  14. #include <stdint.h>
  15. #include "dxc/Support/WinAdapter.h"
  16. struct IDxcBlob;
  17. struct IDxcBlobEncoding;
  18. namespace llvm {
  19. class raw_ostream;
  20. }
  21. namespace hlsl {
  22. // Forward declarations.
  23. struct DxilDescriptorRange;
  24. struct DxilDescriptorRange1;
  25. struct DxilRootConstants;
  26. struct DxilRootDescriptor;
  27. struct DxilRootDescriptor1;
  28. struct DxilRootDescriptorTable;
  29. struct DxilRootDescriptorTable1;
  30. struct DxilRootParameter;
  31. struct DxilRootParameter1;
  32. struct DxilRootSignatureDesc;
  33. struct DxilRootSignatureDesc1;
  34. struct DxilStaticSamplerDesc;
  35. struct DxilVersionedRootSignatureDesc;
  36. // Constant values.
  37. static const uint32_t DxilDescriptorRangeOffsetAppend = 0xffffffff;
  38. static const uint32_t DxilSystemReservedRegisterSpaceValuesStart = 0xfffffff0;
  39. static const uint32_t DxilSystemReservedRegisterSpaceValuesEnd = 0xffffffff;
  40. #define DxilMipLodBiaxMax ( 15.99f )
  41. #define DxilMipLodBiaxMin ( -16.0f )
  42. #define DxilFloat32Max ( 3.402823466e+38f )
  43. static const uint32_t DxilMipLodFractionalBitCount = 8;
  44. static const uint32_t DxilMapAnisotropy = 16;
  45. // Enumerations and flags.
  46. enum class DxilComparisonFunc : unsigned{
  47. Never = 1,
  48. Less = 2,
  49. Equal = 3,
  50. LessEqual = 4,
  51. Greater = 5,
  52. NotEqual = 6,
  53. GreaterEqual = 7,
  54. Always = 8
  55. };
  56. enum class DxilDescriptorRangeFlags : unsigned {
  57. None = 0,
  58. DescriptorsVolatile = 0x1,
  59. DataVolatile = 0x2,
  60. DataStaticWhileSetAtExecute = 0x4,
  61. DataStatic = 0x8,
  62. ValidFlags = 0xf,
  63. ValidSamplerFlags = DescriptorsVolatile
  64. };
  65. enum class DxilDescriptorRangeType : unsigned {
  66. SRV = 0,
  67. UAV = 1,
  68. CBV = 2,
  69. Sampler = 3
  70. };
  71. enum class DxilRootDescriptorFlags : unsigned {
  72. None = 0,
  73. DataVolatile = 0x2,
  74. DataStaticWhileSetAtExecute = 0x4,
  75. DataStatic = 0x8,
  76. ValidFlags = 0xe
  77. };
  78. enum class DxilRootSignatureVersion {
  79. Version_1 = 1,
  80. Version_1_0 = 1,
  81. Version_1_1 = 2
  82. };
  83. enum class DxilRootSignatureFlags : uint32_t {
  84. None = 0,
  85. AllowInputAssemblerInputLayout = 0x1,
  86. DenyVertexShaderRootAccess = 0x2,
  87. DenyHullShaderRootAccess = 0x4,
  88. DenyDomainShaderRootAccess = 0x8,
  89. DenyGeometryShaderRootAccess = 0x10,
  90. DenyPixelShaderRootAccess = 0x20,
  91. AllowStreamOutput = 0x40,
  92. AllowLowTierReservedHwCbLimit = 0x80000000,
  93. ValidFlags = 0x8000007f
  94. };
  95. enum class DxilRootParameterType {
  96. DescriptorTable = 0,
  97. Constants32Bit = 1,
  98. CBV = 2,
  99. SRV = 3,
  100. UAV = 4
  101. };
  102. enum class DxilFilter {
  103. // TODO: make these names consistent with code convention
  104. MIN_MAG_MIP_POINT = 0,
  105. MIN_MAG_POINT_MIP_LINEAR = 0x1,
  106. MIN_POINT_MAG_LINEAR_MIP_POINT = 0x4,
  107. MIN_POINT_MAG_MIP_LINEAR = 0x5,
  108. MIN_LINEAR_MAG_MIP_POINT = 0x10,
  109. MIN_LINEAR_MAG_POINT_MIP_LINEAR = 0x11,
  110. MIN_MAG_LINEAR_MIP_POINT = 0x14,
  111. MIN_MAG_MIP_LINEAR = 0x15,
  112. ANISOTROPIC = 0x55,
  113. COMPARISON_MIN_MAG_MIP_POINT = 0x80,
  114. COMPARISON_MIN_MAG_POINT_MIP_LINEAR = 0x81,
  115. COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT = 0x84,
  116. COMPARISON_MIN_POINT_MAG_MIP_LINEAR = 0x85,
  117. COMPARISON_MIN_LINEAR_MAG_MIP_POINT = 0x90,
  118. COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR = 0x91,
  119. COMPARISON_MIN_MAG_LINEAR_MIP_POINT = 0x94,
  120. COMPARISON_MIN_MAG_MIP_LINEAR = 0x95,
  121. COMPARISON_ANISOTROPIC = 0xd5,
  122. MINIMUM_MIN_MAG_MIP_POINT = 0x100,
  123. MINIMUM_MIN_MAG_POINT_MIP_LINEAR = 0x101,
  124. MINIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT = 0x104,
  125. MINIMUM_MIN_POINT_MAG_MIP_LINEAR = 0x105,
  126. MINIMUM_MIN_LINEAR_MAG_MIP_POINT = 0x110,
  127. MINIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR = 0x111,
  128. MINIMUM_MIN_MAG_LINEAR_MIP_POINT = 0x114,
  129. MINIMUM_MIN_MAG_MIP_LINEAR = 0x115,
  130. MINIMUM_ANISOTROPIC = 0x155,
  131. MAXIMUM_MIN_MAG_MIP_POINT = 0x180,
  132. MAXIMUM_MIN_MAG_POINT_MIP_LINEAR = 0x181,
  133. MAXIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT = 0x184,
  134. MAXIMUM_MIN_POINT_MAG_MIP_LINEAR = 0x185,
  135. MAXIMUM_MIN_LINEAR_MAG_MIP_POINT = 0x190,
  136. MAXIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR = 0x191,
  137. MAXIMUM_MIN_MAG_LINEAR_MIP_POINT = 0x194,
  138. MAXIMUM_MIN_MAG_MIP_LINEAR = 0x195,
  139. MAXIMUM_ANISOTROPIC = 0x1d5
  140. };
  141. enum class DxilShaderVisibility {
  142. All = 0,
  143. Vertex = 1,
  144. Hull = 2,
  145. Domain = 3,
  146. Geometry = 4,
  147. Pixel = 5
  148. };
  149. enum class DxilStaticBorderColor {
  150. TransparentBlack = 0,
  151. OpaqueBlack = 1,
  152. OpaqueWhite = 2
  153. };
  154. enum class DxilTextureAddressMode {
  155. Wrap = 1,
  156. Mirror = 2,
  157. Clamp = 3,
  158. Border = 4,
  159. MirrorOnce = 5
  160. };
  161. // Structure definitions for serialized structures.
  162. #pragma pack(push, 1)
  163. struct DxilContainerRootDescriptor1
  164. {
  165. uint32_t ShaderRegister;
  166. uint32_t RegisterSpace;
  167. uint32_t Flags;
  168. };
  169. struct DxilContainerDescriptorRange
  170. {
  171. uint32_t RangeType;
  172. uint32_t NumDescriptors;
  173. uint32_t BaseShaderRegister;
  174. uint32_t RegisterSpace;
  175. uint32_t OffsetInDescriptorsFromTableStart;
  176. };
  177. struct DxilContainerDescriptorRange1
  178. {
  179. uint32_t RangeType;
  180. uint32_t NumDescriptors;
  181. uint32_t BaseShaderRegister;
  182. uint32_t RegisterSpace;
  183. uint32_t Flags;
  184. uint32_t OffsetInDescriptorsFromTableStart;
  185. };
  186. struct DxilContainerRootDescriptorTable
  187. {
  188. uint32_t NumDescriptorRanges;
  189. uint32_t DescriptorRangesOffset;
  190. };
  191. struct DxilContainerRootParameter
  192. {
  193. uint32_t ParameterType;
  194. uint32_t ShaderVisibility;
  195. uint32_t PayloadOffset;
  196. };
  197. struct DxilContainerRootSignatureDesc
  198. {
  199. uint32_t Version;
  200. uint32_t NumParameters;
  201. uint32_t RootParametersOffset;
  202. uint32_t NumStaticSamplers;
  203. uint32_t StaticSamplersOffset;
  204. uint32_t Flags;
  205. };
  206. #pragma pack(pop)
  207. // Structure definitions for in-memory structures.
  208. struct DxilDescriptorRange {
  209. DxilDescriptorRangeType RangeType;
  210. uint32_t NumDescriptors;
  211. uint32_t BaseShaderRegister;
  212. uint32_t RegisterSpace;
  213. uint32_t OffsetInDescriptorsFromTableStart;
  214. };
  215. struct DxilRootDescriptorTable {
  216. uint32_t NumDescriptorRanges;
  217. _Field_size_full_(NumDescriptorRanges) const DxilDescriptorRange *pDescriptorRanges;
  218. };
  219. struct DxilRootConstants {
  220. uint32_t ShaderRegister;
  221. uint32_t RegisterSpace;
  222. uint32_t Num32BitValues;
  223. };
  224. struct DxilRootDescriptor {
  225. uint32_t ShaderRegister;
  226. uint32_t RegisterSpace;
  227. };
  228. struct DxilRootDescriptor1 {
  229. uint32_t ShaderRegister;
  230. uint32_t RegisterSpace;
  231. DxilRootDescriptorFlags Flags;
  232. };
  233. struct DxilRootParameter {
  234. DxilRootParameterType ParameterType;
  235. union {
  236. DxilRootDescriptorTable DescriptorTable;
  237. DxilRootConstants Constants;
  238. DxilRootDescriptor Descriptor;
  239. };
  240. DxilShaderVisibility ShaderVisibility;
  241. };
  242. struct DxilDescriptorRange1 {
  243. DxilDescriptorRangeType RangeType;
  244. uint32_t NumDescriptors;
  245. uint32_t BaseShaderRegister;
  246. uint32_t RegisterSpace;
  247. DxilDescriptorRangeFlags Flags;
  248. uint32_t OffsetInDescriptorsFromTableStart;
  249. };
  250. struct DxilRootDescriptorTable1 {
  251. uint32_t NumDescriptorRanges;
  252. _Field_size_full_(NumDescriptorRanges) const DxilDescriptorRange1 *pDescriptorRanges;
  253. };
  254. struct DxilRootParameter1 {
  255. DxilRootParameterType ParameterType;
  256. union {
  257. DxilRootDescriptorTable1 DescriptorTable;
  258. DxilRootConstants Constants;
  259. DxilRootDescriptor1 Descriptor;
  260. };
  261. DxilShaderVisibility ShaderVisibility;
  262. };
  263. struct DxilRootSignatureDesc {
  264. uint32_t NumParameters;
  265. _Field_size_full_(NumParameters) DxilRootParameter *pParameters;
  266. uint32_t NumStaticSamplers;
  267. _Field_size_full_(NumStaticSamplers) DxilStaticSamplerDesc *pStaticSamplers;
  268. DxilRootSignatureFlags Flags;
  269. };
  270. struct DxilStaticSamplerDesc {
  271. DxilFilter Filter;
  272. DxilTextureAddressMode AddressU;
  273. DxilTextureAddressMode AddressV;
  274. DxilTextureAddressMode AddressW;
  275. float MipLODBias;
  276. uint32_t MaxAnisotropy;
  277. DxilComparisonFunc ComparisonFunc;
  278. DxilStaticBorderColor BorderColor;
  279. float MinLOD;
  280. float MaxLOD;
  281. uint32_t ShaderRegister;
  282. uint32_t RegisterSpace;
  283. DxilShaderVisibility ShaderVisibility;
  284. };
  285. struct DxilRootSignatureDesc1 {
  286. uint32_t NumParameters;
  287. _Field_size_full_(NumParameters) DxilRootParameter1 *pParameters;
  288. uint32_t NumStaticSamplers;
  289. _Field_size_full_(NumStaticSamplers) DxilStaticSamplerDesc *pStaticSamplers;
  290. DxilRootSignatureFlags Flags;
  291. };
  292. struct DxilVersionedRootSignatureDesc {
  293. DxilRootSignatureVersion Version;
  294. union {
  295. DxilRootSignatureDesc Desc_1_0;
  296. DxilRootSignatureDesc1 Desc_1_1;
  297. };
  298. };
  299. // Use this class to represent a root signature that may be in memory or serialized.
  300. // There is just enough API surface to help callers not take a dependency on Windows headers.
  301. class RootSignatureHandle {
  302. private:
  303. const DxilVersionedRootSignatureDesc *m_pDesc;
  304. IDxcBlob *m_pSerialized;
  305. public:
  306. RootSignatureHandle() : m_pDesc(nullptr), m_pSerialized(nullptr) {}
  307. RootSignatureHandle(const RootSignatureHandle &) = delete;
  308. RootSignatureHandle(RootSignatureHandle &&other);
  309. ~RootSignatureHandle() { Clear(); }
  310. bool IsEmpty() const {
  311. return m_pDesc == nullptr && m_pSerialized == nullptr;
  312. }
  313. IDxcBlob *GetSerialized() const { return m_pSerialized; }
  314. const uint8_t *GetSerializedBytes() const;
  315. unsigned GetSerializedSize() const;
  316. void Assign(const DxilVersionedRootSignatureDesc *pDesc, IDxcBlob *pSerialized);
  317. void Clear();
  318. void LoadSerialized(const uint8_t *pData, uint32_t length);
  319. void EnsureSerializedAvailable();
  320. void Deserialize();
  321. const DxilVersionedRootSignatureDesc *GetDesc() const { return m_pDesc; }
  322. };
  323. void DeleteRootSignature(const DxilVersionedRootSignatureDesc *pRootSignature);
  324. // Careful to delete: returns the original root signature, if conversion is not required.
  325. void ConvertRootSignature(const DxilVersionedRootSignatureDesc* pRootSignatureIn,
  326. DxilRootSignatureVersion RootSignatureVersionOut,
  327. const DxilVersionedRootSignatureDesc ** ppRootSignatureOut);
  328. void SerializeRootSignature(const DxilVersionedRootSignatureDesc *pRootSignature,
  329. _Outptr_ IDxcBlob **ppBlob, _Outptr_ IDxcBlobEncoding **ppErrorBlob,
  330. bool bAllowReservedRegisterSpace);
  331. void DeserializeRootSignature(_In_reads_bytes_(SrcDataSizeInBytes) const void *pSrcData,
  332. _In_ uint32_t SrcDataSizeInBytes,
  333. _Out_ const DxilVersionedRootSignatureDesc **ppRootSignature);
  334. // Takes PSV - pipeline state validation data, not shader container.
  335. bool VerifyRootSignatureWithShaderPSV(_In_ const DxilVersionedRootSignatureDesc *pDesc,
  336. _In_ DXIL::ShaderKind ShaderKind,
  337. _In_reads_bytes_(PSVSize) const void *pPSVData,
  338. _In_ uint32_t PSVSize,
  339. _In_ llvm::raw_ostream &DiagStream);
  340. } // namespace hlsl
  341. #endif // __DXC_ROOTSIGNATURE__