DxilRootSignature.h 11 KB

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