DxilRootSignature.h 12 KB

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