d3dx12_state_object.h 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790
  1. //*********************************************************
  2. //
  3. // Copyright (c) Microsoft Corporation.
  4. // Licensed under the MIT License (MIT).
  5. //
  6. //*********************************************************
  7. #pragma once
  8. #ifndef __cplusplus
  9. #error D3DX12 requires C++
  10. #endif
  11. #include "d3d12.h"
  12. //================================================================================================
  13. // D3DX12 State Object Creation Helpers
  14. //
  15. // Helper classes for creating new style state objects out of an arbitrary set of subobjects.
  16. // Uses STL
  17. //
  18. // Start by instantiating CD3DX12_STATE_OBJECT_DESC (see its public methods).
  19. // One of its methods is CreateSubobject(), which has a comment showing a couple of options for
  20. // defining subobjects using the helper classes for each subobject (CD3DX12_DXIL_LIBRARY_SUBOBJECT
  21. // etc.). The subobject helpers each have methods specific to the subobject for configuring its
  22. // contents.
  23. //
  24. //================================================================================================
  25. #include <list>
  26. #include <memory>
  27. #include <string>
  28. #include <vector>
  29. #ifndef D3DX12_USE_ATL
  30. #include <wrl/client.h>
  31. #define D3DX12_COM_PTR Microsoft::WRL::ComPtr
  32. #define D3DX12_COM_PTR_GET(x) x.Get()
  33. #define D3DX12_COM_PTR_ADDRESSOF(x) x.GetAddressOf()
  34. #else
  35. #include <atlbase.h>
  36. #define D3DX12_COM_PTR ATL::CComPtr
  37. #define D3DX12_COM_PTR_GET(x) x.p
  38. #define D3DX12_COM_PTR_ADDRESSOF(x) &x.p
  39. #endif
  40. //------------------------------------------------------------------------------------------------
  41. class CD3DX12_STATE_OBJECT_DESC
  42. {
  43. public:
  44. CD3DX12_STATE_OBJECT_DESC() noexcept
  45. {
  46. Init(D3D12_STATE_OBJECT_TYPE_COLLECTION);
  47. }
  48. CD3DX12_STATE_OBJECT_DESC(D3D12_STATE_OBJECT_TYPE Type) noexcept
  49. {
  50. Init(Type);
  51. }
  52. void SetStateObjectType(D3D12_STATE_OBJECT_TYPE Type) noexcept { m_Desc.Type = Type; }
  53. operator const D3D12_STATE_OBJECT_DESC&()
  54. {
  55. // Do final preparation work
  56. m_RepointedAssociations.clear();
  57. m_SubobjectArray.clear();
  58. m_SubobjectArray.reserve(m_Desc.NumSubobjects);
  59. // Flatten subobjects into an array (each flattened subobject still has a
  60. // member that's a pointer to its desc that's not flattened)
  61. for (auto Iter = m_SubobjectList.begin();
  62. Iter != m_SubobjectList.end(); Iter++)
  63. {
  64. m_SubobjectArray.push_back(*Iter);
  65. // Store new location in array so we can redirect pointers contained in subobjects
  66. Iter->pSubobjectArrayLocation = &m_SubobjectArray.back();
  67. }
  68. // For subobjects with pointer fields, create a new copy of those subobject definitions
  69. // with fixed pointers
  70. for (UINT i = 0; i < m_Desc.NumSubobjects; i++)
  71. {
  72. if (m_SubobjectArray[i].Type == D3D12_STATE_SUBOBJECT_TYPE_SUBOBJECT_TO_EXPORTS_ASSOCIATION)
  73. {
  74. auto pOriginalSubobjectAssociation =
  75. static_cast<const D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION*>(m_SubobjectArray[i].pDesc);
  76. D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION Repointed = *pOriginalSubobjectAssociation;
  77. auto pWrapper =
  78. static_cast<const SUBOBJECT_WRAPPER*>(pOriginalSubobjectAssociation->pSubobjectToAssociate);
  79. Repointed.pSubobjectToAssociate = pWrapper->pSubobjectArrayLocation;
  80. m_RepointedAssociations.push_back(Repointed);
  81. m_SubobjectArray[i].pDesc = &m_RepointedAssociations.back();
  82. }
  83. }
  84. // Below: using ugly way to get pointer in case .data() is not defined
  85. m_Desc.pSubobjects = m_Desc.NumSubobjects ? &m_SubobjectArray[0] : nullptr;
  86. return m_Desc;
  87. }
  88. operator const D3D12_STATE_OBJECT_DESC*()
  89. {
  90. // Cast calls the above final preparation work
  91. return &static_cast<const D3D12_STATE_OBJECT_DESC&>(*this);
  92. }
  93. // CreateSubobject creates a sububject helper (e.g. CD3DX12_HIT_GROUP_SUBOBJECT)
  94. // whose lifetime is owned by this class.
  95. // e.g.
  96. //
  97. // CD3DX12_STATE_OBJECT_DESC Collection1(D3D12_STATE_OBJECT_TYPE_COLLECTION);
  98. // auto Lib0 = Collection1.CreateSubobject<CD3DX12_DXIL_LIBRARY_SUBOBJECT>();
  99. // Lib0->SetDXILLibrary(&pMyAppDxilLibs[0]);
  100. // Lib0->DefineExport(L"rayGenShader0"); // in practice these export listings might be
  101. // // data/engine driven
  102. // etc.
  103. //
  104. // Alternatively, users can instantiate sububject helpers explicitly, such as via local
  105. // variables instead, passing the state object desc that should point to it into the helper
  106. // constructor (or call mySubobjectHelper.AddToStateObject(Collection1)).
  107. // In this alternative scenario, the user must keep the subobject alive as long as the state
  108. // object it is associated with is alive, else its pointer references will be stale.
  109. // e.g.
  110. //
  111. // CD3DX12_STATE_OBJECT_DESC RaytracingState2(D3D12_STATE_OBJECT_TYPE_RAYTRACING_PIPELINE);
  112. // CD3DX12_DXIL_LIBRARY_SUBOBJECT LibA(RaytracingState2);
  113. // LibA.SetDXILLibrary(&pMyAppDxilLibs[4]); // not manually specifying exports
  114. // // - meaning all exports in the libraries
  115. // // are exported
  116. // etc.
  117. template<typename T>
  118. T* CreateSubobject()
  119. {
  120. T* pSubobject = new T(*this);
  121. m_OwnedSubobjectHelpers.emplace_back(pSubobject);
  122. return pSubobject;
  123. }
  124. private:
  125. D3D12_STATE_SUBOBJECT* TrackSubobject(D3D12_STATE_SUBOBJECT_TYPE Type, void* pDesc)
  126. {
  127. SUBOBJECT_WRAPPER Subobject;
  128. Subobject.pSubobjectArrayLocation = nullptr;
  129. Subobject.Type = Type;
  130. Subobject.pDesc = pDesc;
  131. m_SubobjectList.push_back(Subobject);
  132. m_Desc.NumSubobjects++;
  133. return &m_SubobjectList.back();
  134. }
  135. void Init(D3D12_STATE_OBJECT_TYPE Type) noexcept
  136. {
  137. SetStateObjectType(Type);
  138. m_Desc.pSubobjects = nullptr;
  139. m_Desc.NumSubobjects = 0;
  140. m_SubobjectList.clear();
  141. m_SubobjectArray.clear();
  142. m_RepointedAssociations.clear();
  143. }
  144. typedef struct SUBOBJECT_WRAPPER : public D3D12_STATE_SUBOBJECT
  145. {
  146. D3D12_STATE_SUBOBJECT* pSubobjectArrayLocation; // new location when flattened into array
  147. // for repointing pointers in subobjects
  148. } SUBOBJECT_WRAPPER;
  149. D3D12_STATE_OBJECT_DESC m_Desc;
  150. std::list<SUBOBJECT_WRAPPER> m_SubobjectList; // Pointers to list nodes handed out so
  151. // these can be edited live
  152. std::vector<D3D12_STATE_SUBOBJECT> m_SubobjectArray; // Built at the end, copying list contents
  153. std::list<D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION>
  154. m_RepointedAssociations; // subobject type that contains pointers to other subobjects,
  155. // repointed to flattened array
  156. class StringContainer
  157. {
  158. public:
  159. LPCWSTR LocalCopy(LPCWSTR string, bool bSingleString = false)
  160. {
  161. if (string)
  162. {
  163. if (bSingleString)
  164. {
  165. m_Strings.clear();
  166. m_Strings.push_back(string);
  167. }
  168. else
  169. {
  170. m_Strings.push_back(string);
  171. }
  172. return m_Strings.back().c_str();
  173. }
  174. else
  175. {
  176. return nullptr;
  177. }
  178. }
  179. void clear() noexcept { m_Strings.clear(); }
  180. private:
  181. std::list<std::wstring> m_Strings;
  182. };
  183. class SUBOBJECT_HELPER_BASE
  184. {
  185. public:
  186. SUBOBJECT_HELPER_BASE() noexcept { Init(); }
  187. virtual ~SUBOBJECT_HELPER_BASE() = default;
  188. virtual D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept = 0;
  189. void AddToStateObject(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
  190. {
  191. m_pSubobject = ContainingStateObject.TrackSubobject(Type(), Data());
  192. }
  193. protected:
  194. virtual void* Data() noexcept = 0;
  195. void Init() noexcept { m_pSubobject = nullptr; }
  196. D3D12_STATE_SUBOBJECT* m_pSubobject;
  197. };
  198. #if(__cplusplus >= 201103L)
  199. std::list<std::unique_ptr<const SUBOBJECT_HELPER_BASE>> m_OwnedSubobjectHelpers;
  200. #else
  201. class OWNED_HELPER
  202. {
  203. public:
  204. OWNED_HELPER(const SUBOBJECT_HELPER_BASE* pHelper) noexcept { m_pHelper = pHelper; }
  205. ~OWNED_HELPER() { delete m_pHelper; }
  206. const SUBOBJECT_HELPER_BASE* m_pHelper;
  207. };
  208. std::list<OWNED_HELPER> m_OwnedSubobjectHelpers;
  209. #endif
  210. friend class CD3DX12_DXIL_LIBRARY_SUBOBJECT;
  211. friend class CD3DX12_EXISTING_COLLECTION_SUBOBJECT;
  212. friend class CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT;
  213. friend class CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION;
  214. friend class CD3DX12_HIT_GROUP_SUBOBJECT;
  215. friend class CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT;
  216. friend class CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT;
  217. friend class CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT;
  218. friend class CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT;
  219. friend class CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT;
  220. friend class CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT;
  221. friend class CD3DX12_NODE_MASK_SUBOBJECT;
  222. };
  223. //------------------------------------------------------------------------------------------------
  224. class CD3DX12_DXIL_LIBRARY_SUBOBJECT
  225. : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
  226. {
  227. public:
  228. CD3DX12_DXIL_LIBRARY_SUBOBJECT() noexcept
  229. {
  230. Init();
  231. }
  232. CD3DX12_DXIL_LIBRARY_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
  233. {
  234. Init();
  235. AddToStateObject(ContainingStateObject);
  236. }
  237. void SetDXILLibrary(const D3D12_SHADER_BYTECODE* pCode) noexcept
  238. {
  239. static const D3D12_SHADER_BYTECODE Default = {};
  240. m_Desc.DXILLibrary = pCode ? *pCode : Default;
  241. }
  242. void DefineExport(
  243. LPCWSTR Name,
  244. LPCWSTR ExportToRename = nullptr,
  245. D3D12_EXPORT_FLAGS Flags = D3D12_EXPORT_FLAG_NONE)
  246. {
  247. D3D12_EXPORT_DESC Export;
  248. Export.Name = m_Strings.LocalCopy(Name);
  249. Export.ExportToRename = m_Strings.LocalCopy(ExportToRename);
  250. Export.Flags = Flags;
  251. m_Exports.push_back(Export);
  252. m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined
  253. m_Desc.NumExports = static_cast<UINT>(m_Exports.size());
  254. }
  255. template<size_t N>
  256. void DefineExports(LPCWSTR(&Exports)[N])
  257. {
  258. for (UINT i = 0; i < N; i++)
  259. {
  260. DefineExport(Exports[i]);
  261. }
  262. }
  263. void DefineExports(const LPCWSTR* Exports, UINT N)
  264. {
  265. for (UINT i = 0; i < N; i++)
  266. {
  267. DefineExport(Exports[i]);
  268. }
  269. }
  270. D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
  271. {
  272. return D3D12_STATE_SUBOBJECT_TYPE_DXIL_LIBRARY;
  273. }
  274. operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
  275. operator const D3D12_DXIL_LIBRARY_DESC&() const noexcept { return m_Desc; }
  276. private:
  277. void Init() noexcept
  278. {
  279. SUBOBJECT_HELPER_BASE::Init();
  280. m_Desc = {};
  281. m_Strings.clear();
  282. m_Exports.clear();
  283. }
  284. void* Data() noexcept override { return &m_Desc; }
  285. D3D12_DXIL_LIBRARY_DESC m_Desc;
  286. CD3DX12_STATE_OBJECT_DESC::StringContainer m_Strings;
  287. std::vector<D3D12_EXPORT_DESC> m_Exports;
  288. };
  289. //------------------------------------------------------------------------------------------------
  290. class CD3DX12_EXISTING_COLLECTION_SUBOBJECT
  291. : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
  292. {
  293. public:
  294. CD3DX12_EXISTING_COLLECTION_SUBOBJECT() noexcept
  295. {
  296. Init();
  297. }
  298. CD3DX12_EXISTING_COLLECTION_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
  299. {
  300. Init();
  301. AddToStateObject(ContainingStateObject);
  302. }
  303. void SetExistingCollection(ID3D12StateObject*pExistingCollection) noexcept
  304. {
  305. m_Desc.pExistingCollection = pExistingCollection;
  306. m_CollectionRef = pExistingCollection;
  307. }
  308. void DefineExport(
  309. LPCWSTR Name,
  310. LPCWSTR ExportToRename = nullptr,
  311. D3D12_EXPORT_FLAGS Flags = D3D12_EXPORT_FLAG_NONE)
  312. {
  313. D3D12_EXPORT_DESC Export;
  314. Export.Name = m_Strings.LocalCopy(Name);
  315. Export.ExportToRename = m_Strings.LocalCopy(ExportToRename);
  316. Export.Flags = Flags;
  317. m_Exports.push_back(Export);
  318. m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined
  319. m_Desc.NumExports = static_cast<UINT>(m_Exports.size());
  320. }
  321. template<size_t N>
  322. void DefineExports(LPCWSTR(&Exports)[N])
  323. {
  324. for (UINT i = 0; i < N; i++)
  325. {
  326. DefineExport(Exports[i]);
  327. }
  328. }
  329. void DefineExports(const LPCWSTR* Exports, UINT N)
  330. {
  331. for (UINT i = 0; i < N; i++)
  332. {
  333. DefineExport(Exports[i]);
  334. }
  335. }
  336. D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
  337. {
  338. return D3D12_STATE_SUBOBJECT_TYPE_EXISTING_COLLECTION;
  339. }
  340. operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
  341. operator const D3D12_EXISTING_COLLECTION_DESC&() const noexcept { return m_Desc; }
  342. private:
  343. void Init() noexcept
  344. {
  345. SUBOBJECT_HELPER_BASE::Init();
  346. m_Desc = {};
  347. m_CollectionRef = nullptr;
  348. m_Strings.clear();
  349. m_Exports.clear();
  350. }
  351. void* Data() noexcept override { return &m_Desc; }
  352. D3D12_EXISTING_COLLECTION_DESC m_Desc;
  353. D3DX12_COM_PTR<ID3D12StateObject> m_CollectionRef;
  354. CD3DX12_STATE_OBJECT_DESC::StringContainer m_Strings;
  355. std::vector<D3D12_EXPORT_DESC> m_Exports;
  356. };
  357. //------------------------------------------------------------------------------------------------
  358. class CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT
  359. : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
  360. {
  361. public:
  362. CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT() noexcept
  363. {
  364. Init();
  365. }
  366. CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
  367. {
  368. Init();
  369. AddToStateObject(ContainingStateObject);
  370. }
  371. void SetSubobjectToAssociate(const D3D12_STATE_SUBOBJECT& SubobjectToAssociate) noexcept
  372. {
  373. m_Desc.pSubobjectToAssociate = &SubobjectToAssociate;
  374. }
  375. void AddExport(LPCWSTR Export)
  376. {
  377. m_Desc.NumExports++;
  378. m_Exports.push_back(m_Strings.LocalCopy(Export));
  379. m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined
  380. }
  381. template<size_t N>
  382. void AddExports(LPCWSTR (&Exports)[N])
  383. {
  384. for (UINT i = 0; i < N; i++)
  385. {
  386. AddExport(Exports[i]);
  387. }
  388. }
  389. void AddExports(const LPCWSTR* Exports, UINT N)
  390. {
  391. for (UINT i = 0; i < N; i++)
  392. {
  393. AddExport(Exports[i]);
  394. }
  395. }
  396. D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
  397. {
  398. return D3D12_STATE_SUBOBJECT_TYPE_SUBOBJECT_TO_EXPORTS_ASSOCIATION;
  399. }
  400. operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
  401. operator const D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION&() const noexcept { return m_Desc; }
  402. private:
  403. void Init() noexcept
  404. {
  405. SUBOBJECT_HELPER_BASE::Init();
  406. m_Desc = {};
  407. m_Strings.clear();
  408. m_Exports.clear();
  409. }
  410. void* Data() noexcept override { return &m_Desc; }
  411. D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION m_Desc;
  412. CD3DX12_STATE_OBJECT_DESC::StringContainer m_Strings;
  413. std::vector<LPCWSTR> m_Exports;
  414. };
  415. //------------------------------------------------------------------------------------------------
  416. class CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION
  417. : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
  418. {
  419. public:
  420. CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION() noexcept
  421. {
  422. Init();
  423. }
  424. CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
  425. {
  426. Init();
  427. AddToStateObject(ContainingStateObject);
  428. }
  429. void SetSubobjectNameToAssociate(LPCWSTR SubobjectToAssociate)
  430. {
  431. m_Desc.SubobjectToAssociate = m_SubobjectName.LocalCopy(SubobjectToAssociate, true);
  432. }
  433. void AddExport(LPCWSTR Export)
  434. {
  435. m_Desc.NumExports++;
  436. m_Exports.push_back(m_Strings.LocalCopy(Export));
  437. m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined
  438. }
  439. template<size_t N>
  440. void AddExports(LPCWSTR (&Exports)[N])
  441. {
  442. for (UINT i = 0; i < N; i++)
  443. {
  444. AddExport(Exports[i]);
  445. }
  446. }
  447. void AddExports(const LPCWSTR* Exports, UINT N)
  448. {
  449. for (UINT i = 0; i < N; i++)
  450. {
  451. AddExport(Exports[i]);
  452. }
  453. }
  454. D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
  455. {
  456. return D3D12_STATE_SUBOBJECT_TYPE_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION;
  457. }
  458. operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
  459. operator const D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION&() const noexcept { return m_Desc; }
  460. private:
  461. void Init() noexcept
  462. {
  463. SUBOBJECT_HELPER_BASE::Init();
  464. m_Desc = {};
  465. m_Strings.clear();
  466. m_SubobjectName.clear();
  467. m_Exports.clear();
  468. }
  469. void* Data() noexcept override { return &m_Desc; }
  470. D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION m_Desc;
  471. CD3DX12_STATE_OBJECT_DESC::StringContainer m_Strings;
  472. CD3DX12_STATE_OBJECT_DESC::StringContainer m_SubobjectName;
  473. std::vector<LPCWSTR> m_Exports;
  474. };
  475. //------------------------------------------------------------------------------------------------
  476. class CD3DX12_HIT_GROUP_SUBOBJECT
  477. : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
  478. {
  479. public:
  480. CD3DX12_HIT_GROUP_SUBOBJECT() noexcept
  481. {
  482. Init();
  483. }
  484. CD3DX12_HIT_GROUP_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
  485. {
  486. Init();
  487. AddToStateObject(ContainingStateObject);
  488. }
  489. void SetHitGroupExport(LPCWSTR exportName)
  490. {
  491. m_Desc.HitGroupExport = m_Strings[0].LocalCopy(exportName, true);
  492. }
  493. void SetHitGroupType(D3D12_HIT_GROUP_TYPE Type) noexcept { m_Desc.Type = Type; }
  494. void SetAnyHitShaderImport(LPCWSTR importName)
  495. {
  496. m_Desc.AnyHitShaderImport = m_Strings[1].LocalCopy(importName, true);
  497. }
  498. void SetClosestHitShaderImport(LPCWSTR importName)
  499. {
  500. m_Desc.ClosestHitShaderImport = m_Strings[2].LocalCopy(importName, true);
  501. }
  502. void SetIntersectionShaderImport(LPCWSTR importName)
  503. {
  504. m_Desc.IntersectionShaderImport = m_Strings[3].LocalCopy(importName, true);
  505. }
  506. D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
  507. {
  508. return D3D12_STATE_SUBOBJECT_TYPE_HIT_GROUP;
  509. }
  510. operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
  511. operator const D3D12_HIT_GROUP_DESC&() const noexcept { return m_Desc; }
  512. private:
  513. void Init() noexcept
  514. {
  515. SUBOBJECT_HELPER_BASE::Init();
  516. m_Desc = {};
  517. for (UINT i = 0; i < m_NumStrings; i++)
  518. {
  519. m_Strings[i].clear();
  520. }
  521. }
  522. void* Data() noexcept override { return &m_Desc; }
  523. D3D12_HIT_GROUP_DESC m_Desc;
  524. static constexpr UINT m_NumStrings = 4;
  525. CD3DX12_STATE_OBJECT_DESC::StringContainer
  526. m_Strings[m_NumStrings]; // one string for every entrypoint name
  527. };
  528. //------------------------------------------------------------------------------------------------
  529. class CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT
  530. : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
  531. {
  532. public:
  533. CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT() noexcept
  534. {
  535. Init();
  536. }
  537. CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
  538. {
  539. Init();
  540. AddToStateObject(ContainingStateObject);
  541. }
  542. void Config(UINT MaxPayloadSizeInBytes, UINT MaxAttributeSizeInBytes) noexcept
  543. {
  544. m_Desc.MaxPayloadSizeInBytes = MaxPayloadSizeInBytes;
  545. m_Desc.MaxAttributeSizeInBytes = MaxAttributeSizeInBytes;
  546. }
  547. D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
  548. {
  549. return D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_SHADER_CONFIG;
  550. }
  551. operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
  552. operator const D3D12_RAYTRACING_SHADER_CONFIG&() const noexcept { return m_Desc; }
  553. private:
  554. void Init() noexcept
  555. {
  556. SUBOBJECT_HELPER_BASE::Init();
  557. m_Desc = {};
  558. }
  559. void* Data() noexcept override { return &m_Desc; }
  560. D3D12_RAYTRACING_SHADER_CONFIG m_Desc;
  561. };
  562. //------------------------------------------------------------------------------------------------
  563. class CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT
  564. : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
  565. {
  566. public:
  567. CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT() noexcept
  568. {
  569. Init();
  570. }
  571. CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
  572. {
  573. Init();
  574. AddToStateObject(ContainingStateObject);
  575. }
  576. void Config(UINT MaxTraceRecursionDepth) noexcept
  577. {
  578. m_Desc.MaxTraceRecursionDepth = MaxTraceRecursionDepth;
  579. }
  580. D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
  581. {
  582. return D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_PIPELINE_CONFIG;
  583. }
  584. operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
  585. operator const D3D12_RAYTRACING_PIPELINE_CONFIG&() const noexcept { return m_Desc; }
  586. private:
  587. void Init() noexcept
  588. {
  589. SUBOBJECT_HELPER_BASE::Init();
  590. m_Desc = {};
  591. }
  592. void* Data() noexcept override { return &m_Desc; }
  593. D3D12_RAYTRACING_PIPELINE_CONFIG m_Desc;
  594. };
  595. //------------------------------------------------------------------------------------------------
  596. class CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT
  597. : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
  598. {
  599. public:
  600. CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT() noexcept
  601. {
  602. Init();
  603. }
  604. CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
  605. {
  606. Init();
  607. AddToStateObject(ContainingStateObject);
  608. }
  609. void Config(UINT MaxTraceRecursionDepth, D3D12_RAYTRACING_PIPELINE_FLAGS Flags) noexcept
  610. {
  611. m_Desc.MaxTraceRecursionDepth = MaxTraceRecursionDepth;
  612. m_Desc.Flags = Flags;
  613. }
  614. D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
  615. {
  616. return D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_PIPELINE_CONFIG1;
  617. }
  618. operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
  619. operator const D3D12_RAYTRACING_PIPELINE_CONFIG1&() const noexcept { return m_Desc; }
  620. private:
  621. void Init() noexcept
  622. {
  623. SUBOBJECT_HELPER_BASE::Init();
  624. m_Desc = {};
  625. }
  626. void* Data() noexcept override { return &m_Desc; }
  627. D3D12_RAYTRACING_PIPELINE_CONFIG1 m_Desc;
  628. };
  629. //------------------------------------------------------------------------------------------------
  630. class CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT
  631. : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
  632. {
  633. public:
  634. CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT() noexcept
  635. {
  636. Init();
  637. }
  638. CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
  639. {
  640. Init();
  641. AddToStateObject(ContainingStateObject);
  642. }
  643. void SetRootSignature(ID3D12RootSignature* pRootSig) noexcept
  644. {
  645. m_pRootSig = pRootSig;
  646. }
  647. D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
  648. {
  649. return D3D12_STATE_SUBOBJECT_TYPE_GLOBAL_ROOT_SIGNATURE;
  650. }
  651. operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
  652. operator ID3D12RootSignature*() const noexcept { return D3DX12_COM_PTR_GET(m_pRootSig); }
  653. private:
  654. void Init() noexcept
  655. {
  656. SUBOBJECT_HELPER_BASE::Init();
  657. m_pRootSig = nullptr;
  658. }
  659. void* Data() noexcept override { return D3DX12_COM_PTR_ADDRESSOF(m_pRootSig); }
  660. D3DX12_COM_PTR<ID3D12RootSignature> m_pRootSig;
  661. };
  662. //------------------------------------------------------------------------------------------------
  663. class CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT
  664. : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
  665. {
  666. public:
  667. CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT() noexcept
  668. {
  669. Init();
  670. }
  671. CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
  672. {
  673. Init();
  674. AddToStateObject(ContainingStateObject);
  675. }
  676. void SetRootSignature(ID3D12RootSignature* pRootSig) noexcept
  677. {
  678. m_pRootSig = pRootSig;
  679. }
  680. D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
  681. {
  682. return D3D12_STATE_SUBOBJECT_TYPE_LOCAL_ROOT_SIGNATURE;
  683. }
  684. operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
  685. operator ID3D12RootSignature*() const noexcept { return D3DX12_COM_PTR_GET(m_pRootSig); }
  686. private:
  687. void Init() noexcept
  688. {
  689. SUBOBJECT_HELPER_BASE::Init();
  690. m_pRootSig = nullptr;
  691. }
  692. void* Data() noexcept override { return D3DX12_COM_PTR_ADDRESSOF(m_pRootSig); }
  693. D3DX12_COM_PTR<ID3D12RootSignature> m_pRootSig;
  694. };
  695. //------------------------------------------------------------------------------------------------
  696. class CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT
  697. : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
  698. {
  699. public:
  700. CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT() noexcept
  701. {
  702. Init();
  703. }
  704. CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
  705. {
  706. Init();
  707. AddToStateObject(ContainingStateObject);
  708. }
  709. void SetFlags(D3D12_STATE_OBJECT_FLAGS Flags) noexcept
  710. {
  711. m_Desc.Flags = Flags;
  712. }
  713. D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
  714. {
  715. return D3D12_STATE_SUBOBJECT_TYPE_STATE_OBJECT_CONFIG;
  716. }
  717. operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
  718. operator const D3D12_STATE_OBJECT_CONFIG&() const noexcept { return m_Desc; }
  719. private:
  720. void Init() noexcept
  721. {
  722. SUBOBJECT_HELPER_BASE::Init();
  723. m_Desc = {};
  724. }
  725. void* Data() noexcept override { return &m_Desc; }
  726. D3D12_STATE_OBJECT_CONFIG m_Desc;
  727. };
  728. //------------------------------------------------------------------------------------------------
  729. class CD3DX12_NODE_MASK_SUBOBJECT
  730. : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
  731. {
  732. public:
  733. CD3DX12_NODE_MASK_SUBOBJECT() noexcept
  734. {
  735. Init();
  736. }
  737. CD3DX12_NODE_MASK_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
  738. {
  739. Init();
  740. AddToStateObject(ContainingStateObject);
  741. }
  742. void SetNodeMask(UINT NodeMask) noexcept
  743. {
  744. m_Desc.NodeMask = NodeMask;
  745. }
  746. D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
  747. {
  748. return D3D12_STATE_SUBOBJECT_TYPE_NODE_MASK;
  749. }
  750. operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }
  751. operator const D3D12_NODE_MASK&() const noexcept { return m_Desc; }
  752. private:
  753. void Init() noexcept
  754. {
  755. SUBOBJECT_HELPER_BASE::Init();
  756. m_Desc = {};
  757. }
  758. void* Data() noexcept override { return &m_Desc; }
  759. D3D12_NODE_MASK m_Desc;
  760. };
  761. #undef D3DX12_COM_PTR
  762. #undef D3DX12_COM_PTR_GET
  763. #undef D3DX12_COM_PTR_ADDRESSOF