DxilRootSignature.h 12 KB

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