Path: blob/master/thirdparty/directx_headers/include/directx/d3dx12_state_object.h
9906 views
//*********************************************************1//2// Copyright (c) Microsoft Corporation.3// Licensed under the MIT License (MIT).4//5//*********************************************************67#pragma once89#ifndef __cplusplus10#error D3DX12 requires C++11#endif1213#include "d3d12.h"1415//================================================================================================16// D3DX12 State Object Creation Helpers17//18// Helper classes for creating new style state objects out of an arbitrary set of subobjects.19// Uses STL20//21// Start by instantiating CD3DX12_STATE_OBJECT_DESC (see its public methods).22// One of its methods is CreateSubobject(), which has a comment showing a couple of options for23// defining subobjects using the helper classes for each subobject (CD3DX12_DXIL_LIBRARY_SUBOBJECT24// etc.). The subobject helpers each have methods specific to the subobject for configuring its25// contents.26//27//================================================================================================28#include <list>29#include <memory>30#include <string>31#include <vector>32#ifndef D3DX12_USE_ATL33#include <wrl/client.h>34#define D3DX12_COM_PTR Microsoft::WRL::ComPtr35#define D3DX12_COM_PTR_GET(x) x.Get()36#define D3DX12_COM_PTR_ADDRESSOF(x) x.GetAddressOf()37#else38#include <atlbase.h>39#define D3DX12_COM_PTR ATL::CComPtr40#define D3DX12_COM_PTR_GET(x) x.p41#define D3DX12_COM_PTR_ADDRESSOF(x) &x.p42#endif4344//------------------------------------------------------------------------------------------------45class CD3DX12_STATE_OBJECT_DESC46{47public:48CD3DX12_STATE_OBJECT_DESC() noexcept49{50Init(D3D12_STATE_OBJECT_TYPE_COLLECTION);51}52CD3DX12_STATE_OBJECT_DESC(D3D12_STATE_OBJECT_TYPE Type) noexcept53{54Init(Type);55}56void SetStateObjectType(D3D12_STATE_OBJECT_TYPE Type) noexcept { m_Desc.Type = Type; }57operator const D3D12_STATE_OBJECT_DESC&()58{59// Do final preparation work60m_RepointedAssociations.clear();61m_SubobjectArray.clear();62m_SubobjectArray.reserve(m_Desc.NumSubobjects);63// Flatten subobjects into an array (each flattened subobject still has a64// member that's a pointer to its desc that's not flattened)65for (auto Iter = m_SubobjectList.begin();66Iter != m_SubobjectList.end(); Iter++)67{68m_SubobjectArray.push_back(*Iter);69// Store new location in array so we can redirect pointers contained in subobjects70Iter->pSubobjectArrayLocation = &m_SubobjectArray.back();71}72// For subobjects with pointer fields, create a new copy of those subobject definitions73// with fixed pointers74for (UINT i = 0; i < m_Desc.NumSubobjects; i++)75{76if (m_SubobjectArray[i].Type == D3D12_STATE_SUBOBJECT_TYPE_SUBOBJECT_TO_EXPORTS_ASSOCIATION)77{78auto pOriginalSubobjectAssociation =79static_cast<const D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION*>(m_SubobjectArray[i].pDesc);80D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION Repointed = *pOriginalSubobjectAssociation;81auto pWrapper =82static_cast<const SUBOBJECT_WRAPPER*>(pOriginalSubobjectAssociation->pSubobjectToAssociate);83Repointed.pSubobjectToAssociate = pWrapper->pSubobjectArrayLocation;84m_RepointedAssociations.push_back(Repointed);85m_SubobjectArray[i].pDesc = &m_RepointedAssociations.back();86}87}88// Below: using ugly way to get pointer in case .data() is not defined89m_Desc.pSubobjects = m_Desc.NumSubobjects ? &m_SubobjectArray[0] : nullptr;90return m_Desc;91}92operator const D3D12_STATE_OBJECT_DESC*()93{94// Cast calls the above final preparation work95return &static_cast<const D3D12_STATE_OBJECT_DESC&>(*this);96}9798// CreateSubobject creates a sububject helper (e.g. CD3DX12_HIT_GROUP_SUBOBJECT)99// whose lifetime is owned by this class.100// e.g.101//102// CD3DX12_STATE_OBJECT_DESC Collection1(D3D12_STATE_OBJECT_TYPE_COLLECTION);103// auto Lib0 = Collection1.CreateSubobject<CD3DX12_DXIL_LIBRARY_SUBOBJECT>();104// Lib0->SetDXILLibrary(&pMyAppDxilLibs[0]);105// Lib0->DefineExport(L"rayGenShader0"); // in practice these export listings might be106// // data/engine driven107// etc.108//109// Alternatively, users can instantiate sububject helpers explicitly, such as via local110// variables instead, passing the state object desc that should point to it into the helper111// constructor (or call mySubobjectHelper.AddToStateObject(Collection1)).112// In this alternative scenario, the user must keep the subobject alive as long as the state113// object it is associated with is alive, else its pointer references will be stale.114// e.g.115//116// CD3DX12_STATE_OBJECT_DESC RaytracingState2(D3D12_STATE_OBJECT_TYPE_RAYTRACING_PIPELINE);117// CD3DX12_DXIL_LIBRARY_SUBOBJECT LibA(RaytracingState2);118// LibA.SetDXILLibrary(&pMyAppDxilLibs[4]); // not manually specifying exports119// // - meaning all exports in the libraries120// // are exported121// etc.122123template<typename T>124T* CreateSubobject()125{126T* pSubobject = new T(*this);127m_OwnedSubobjectHelpers.emplace_back(pSubobject);128return pSubobject;129}130131private:132D3D12_STATE_SUBOBJECT* TrackSubobject(D3D12_STATE_SUBOBJECT_TYPE Type, void* pDesc)133{134SUBOBJECT_WRAPPER Subobject;135Subobject.pSubobjectArrayLocation = nullptr;136Subobject.Type = Type;137Subobject.pDesc = pDesc;138m_SubobjectList.push_back(Subobject);139m_Desc.NumSubobjects++;140return &m_SubobjectList.back();141}142void Init(D3D12_STATE_OBJECT_TYPE Type) noexcept143{144SetStateObjectType(Type);145m_Desc.pSubobjects = nullptr;146m_Desc.NumSubobjects = 0;147m_SubobjectList.clear();148m_SubobjectArray.clear();149m_RepointedAssociations.clear();150}151typedef struct SUBOBJECT_WRAPPER : public D3D12_STATE_SUBOBJECT152{153D3D12_STATE_SUBOBJECT* pSubobjectArrayLocation; // new location when flattened into array154// for repointing pointers in subobjects155} SUBOBJECT_WRAPPER;156D3D12_STATE_OBJECT_DESC m_Desc;157std::list<SUBOBJECT_WRAPPER> m_SubobjectList; // Pointers to list nodes handed out so158// these can be edited live159std::vector<D3D12_STATE_SUBOBJECT> m_SubobjectArray; // Built at the end, copying list contents160161std::list<D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION>162m_RepointedAssociations; // subobject type that contains pointers to other subobjects,163// repointed to flattened array164165class StringContainer166{167public:168LPCWSTR LocalCopy(LPCWSTR string, bool bSingleString = false)169{170if (string)171{172if (bSingleString)173{174m_Strings.clear();175m_Strings.push_back(string);176}177else178{179m_Strings.push_back(string);180}181return m_Strings.back().c_str();182}183else184{185return nullptr;186}187}188void clear() noexcept { m_Strings.clear(); }189private:190std::list<std::wstring> m_Strings;191};192193class SUBOBJECT_HELPER_BASE194{195public:196SUBOBJECT_HELPER_BASE() noexcept { Init(); }197virtual ~SUBOBJECT_HELPER_BASE() = default;198virtual D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept = 0;199void AddToStateObject(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)200{201m_pSubobject = ContainingStateObject.TrackSubobject(Type(), Data());202}203protected:204virtual void* Data() noexcept = 0;205void Init() noexcept { m_pSubobject = nullptr; }206D3D12_STATE_SUBOBJECT* m_pSubobject;207};208209#if(__cplusplus >= 201103L)210std::list<std::unique_ptr<const SUBOBJECT_HELPER_BASE>> m_OwnedSubobjectHelpers;211#else212class OWNED_HELPER213{214public:215OWNED_HELPER(const SUBOBJECT_HELPER_BASE* pHelper) noexcept { m_pHelper = pHelper; }216~OWNED_HELPER() { delete m_pHelper; }217const SUBOBJECT_HELPER_BASE* m_pHelper;218};219220std::list<OWNED_HELPER> m_OwnedSubobjectHelpers;221#endif222223friend class CD3DX12_DXIL_LIBRARY_SUBOBJECT;224friend class CD3DX12_EXISTING_COLLECTION_SUBOBJECT;225friend class CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT;226friend class CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION;227friend class CD3DX12_HIT_GROUP_SUBOBJECT;228friend class CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT;229friend class CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT;230friend class CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT;231friend class CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT;232friend class CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT;233friend class CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT;234friend class CD3DX12_NODE_MASK_SUBOBJECT;235};236237//------------------------------------------------------------------------------------------------238class CD3DX12_DXIL_LIBRARY_SUBOBJECT239: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE240{241public:242CD3DX12_DXIL_LIBRARY_SUBOBJECT() noexcept243{244Init();245}246CD3DX12_DXIL_LIBRARY_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)247{248Init();249AddToStateObject(ContainingStateObject);250}251void SetDXILLibrary(const D3D12_SHADER_BYTECODE* pCode) noexcept252{253static const D3D12_SHADER_BYTECODE Default = {};254m_Desc.DXILLibrary = pCode ? *pCode : Default;255}256void DefineExport(257LPCWSTR Name,258LPCWSTR ExportToRename = nullptr,259D3D12_EXPORT_FLAGS Flags = D3D12_EXPORT_FLAG_NONE)260{261D3D12_EXPORT_DESC Export;262Export.Name = m_Strings.LocalCopy(Name);263Export.ExportToRename = m_Strings.LocalCopy(ExportToRename);264Export.Flags = Flags;265m_Exports.push_back(Export);266m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined267m_Desc.NumExports = static_cast<UINT>(m_Exports.size());268}269template<size_t N>270void DefineExports(LPCWSTR(&Exports)[N])271{272for (UINT i = 0; i < N; i++)273{274DefineExport(Exports[i]);275}276}277void DefineExports(const LPCWSTR* Exports, UINT N)278{279for (UINT i = 0; i < N; i++)280{281DefineExport(Exports[i]);282}283}284D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override285{286return D3D12_STATE_SUBOBJECT_TYPE_DXIL_LIBRARY;287}288operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }289operator const D3D12_DXIL_LIBRARY_DESC&() const noexcept { return m_Desc; }290private:291void Init() noexcept292{293SUBOBJECT_HELPER_BASE::Init();294m_Desc = {};295m_Strings.clear();296m_Exports.clear();297}298void* Data() noexcept override { return &m_Desc; }299D3D12_DXIL_LIBRARY_DESC m_Desc;300CD3DX12_STATE_OBJECT_DESC::StringContainer m_Strings;301std::vector<D3D12_EXPORT_DESC> m_Exports;302};303304//------------------------------------------------------------------------------------------------305class CD3DX12_EXISTING_COLLECTION_SUBOBJECT306: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE307{308public:309CD3DX12_EXISTING_COLLECTION_SUBOBJECT() noexcept310{311Init();312}313CD3DX12_EXISTING_COLLECTION_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)314{315Init();316AddToStateObject(ContainingStateObject);317}318void SetExistingCollection(ID3D12StateObject*pExistingCollection) noexcept319{320m_Desc.pExistingCollection = pExistingCollection;321m_CollectionRef = pExistingCollection;322}323void DefineExport(324LPCWSTR Name,325LPCWSTR ExportToRename = nullptr,326D3D12_EXPORT_FLAGS Flags = D3D12_EXPORT_FLAG_NONE)327{328D3D12_EXPORT_DESC Export;329Export.Name = m_Strings.LocalCopy(Name);330Export.ExportToRename = m_Strings.LocalCopy(ExportToRename);331Export.Flags = Flags;332m_Exports.push_back(Export);333m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined334m_Desc.NumExports = static_cast<UINT>(m_Exports.size());335}336template<size_t N>337void DefineExports(LPCWSTR(&Exports)[N])338{339for (UINT i = 0; i < N; i++)340{341DefineExport(Exports[i]);342}343}344void DefineExports(const LPCWSTR* Exports, UINT N)345{346for (UINT i = 0; i < N; i++)347{348DefineExport(Exports[i]);349}350}351D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override352{353return D3D12_STATE_SUBOBJECT_TYPE_EXISTING_COLLECTION;354}355operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }356operator const D3D12_EXISTING_COLLECTION_DESC&() const noexcept { return m_Desc; }357private:358void Init() noexcept359{360SUBOBJECT_HELPER_BASE::Init();361m_Desc = {};362m_CollectionRef = nullptr;363m_Strings.clear();364m_Exports.clear();365}366void* Data() noexcept override { return &m_Desc; }367D3D12_EXISTING_COLLECTION_DESC m_Desc;368D3DX12_COM_PTR<ID3D12StateObject> m_CollectionRef;369CD3DX12_STATE_OBJECT_DESC::StringContainer m_Strings;370std::vector<D3D12_EXPORT_DESC> m_Exports;371};372373//------------------------------------------------------------------------------------------------374class CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT375: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE376{377public:378CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT() noexcept379{380Init();381}382CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)383{384Init();385AddToStateObject(ContainingStateObject);386}387void SetSubobjectToAssociate(const D3D12_STATE_SUBOBJECT& SubobjectToAssociate) noexcept388{389m_Desc.pSubobjectToAssociate = &SubobjectToAssociate;390}391void AddExport(LPCWSTR Export)392{393m_Desc.NumExports++;394m_Exports.push_back(m_Strings.LocalCopy(Export));395m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined396}397template<size_t N>398void AddExports(LPCWSTR (&Exports)[N])399{400for (UINT i = 0; i < N; i++)401{402AddExport(Exports[i]);403}404}405void AddExports(const LPCWSTR* Exports, UINT N)406{407for (UINT i = 0; i < N; i++)408{409AddExport(Exports[i]);410}411}412D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override413{414return D3D12_STATE_SUBOBJECT_TYPE_SUBOBJECT_TO_EXPORTS_ASSOCIATION;415}416operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }417operator const D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION&() const noexcept { return m_Desc; }418private:419void Init() noexcept420{421SUBOBJECT_HELPER_BASE::Init();422m_Desc = {};423m_Strings.clear();424m_Exports.clear();425}426void* Data() noexcept override { return &m_Desc; }427D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION m_Desc;428CD3DX12_STATE_OBJECT_DESC::StringContainer m_Strings;429std::vector<LPCWSTR> m_Exports;430};431432//------------------------------------------------------------------------------------------------433class CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION434: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE435{436public:437CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION() noexcept438{439Init();440}441CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)442{443Init();444AddToStateObject(ContainingStateObject);445}446void SetSubobjectNameToAssociate(LPCWSTR SubobjectToAssociate)447{448m_Desc.SubobjectToAssociate = m_SubobjectName.LocalCopy(SubobjectToAssociate, true);449}450void AddExport(LPCWSTR Export)451{452m_Desc.NumExports++;453m_Exports.push_back(m_Strings.LocalCopy(Export));454m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined455}456template<size_t N>457void AddExports(LPCWSTR (&Exports)[N])458{459for (UINT i = 0; i < N; i++)460{461AddExport(Exports[i]);462}463}464void AddExports(const LPCWSTR* Exports, UINT N)465{466for (UINT i = 0; i < N; i++)467{468AddExport(Exports[i]);469}470}471D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override472{473return D3D12_STATE_SUBOBJECT_TYPE_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION;474}475operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }476operator const D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION&() const noexcept { return m_Desc; }477private:478void Init() noexcept479{480SUBOBJECT_HELPER_BASE::Init();481m_Desc = {};482m_Strings.clear();483m_SubobjectName.clear();484m_Exports.clear();485}486void* Data() noexcept override { return &m_Desc; }487D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION m_Desc;488CD3DX12_STATE_OBJECT_DESC::StringContainer m_Strings;489CD3DX12_STATE_OBJECT_DESC::StringContainer m_SubobjectName;490std::vector<LPCWSTR> m_Exports;491};492493//------------------------------------------------------------------------------------------------494class CD3DX12_HIT_GROUP_SUBOBJECT495: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE496{497public:498CD3DX12_HIT_GROUP_SUBOBJECT() noexcept499{500Init();501}502CD3DX12_HIT_GROUP_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)503{504Init();505AddToStateObject(ContainingStateObject);506}507void SetHitGroupExport(LPCWSTR exportName)508{509m_Desc.HitGroupExport = m_Strings[0].LocalCopy(exportName, true);510}511void SetHitGroupType(D3D12_HIT_GROUP_TYPE Type) noexcept { m_Desc.Type = Type; }512void SetAnyHitShaderImport(LPCWSTR importName)513{514m_Desc.AnyHitShaderImport = m_Strings[1].LocalCopy(importName, true);515}516void SetClosestHitShaderImport(LPCWSTR importName)517{518m_Desc.ClosestHitShaderImport = m_Strings[2].LocalCopy(importName, true);519}520void SetIntersectionShaderImport(LPCWSTR importName)521{522m_Desc.IntersectionShaderImport = m_Strings[3].LocalCopy(importName, true);523}524D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override525{526return D3D12_STATE_SUBOBJECT_TYPE_HIT_GROUP;527}528operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }529operator const D3D12_HIT_GROUP_DESC&() const noexcept { return m_Desc; }530private:531void Init() noexcept532{533SUBOBJECT_HELPER_BASE::Init();534m_Desc = {};535for (UINT i = 0; i < m_NumStrings; i++)536{537m_Strings[i].clear();538}539}540void* Data() noexcept override { return &m_Desc; }541D3D12_HIT_GROUP_DESC m_Desc;542static constexpr UINT m_NumStrings = 4;543CD3DX12_STATE_OBJECT_DESC::StringContainer544m_Strings[m_NumStrings]; // one string for every entrypoint name545};546547//------------------------------------------------------------------------------------------------548class CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT549: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE550{551public:552CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT() noexcept553{554Init();555}556CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)557{558Init();559AddToStateObject(ContainingStateObject);560}561void Config(UINT MaxPayloadSizeInBytes, UINT MaxAttributeSizeInBytes) noexcept562{563m_Desc.MaxPayloadSizeInBytes = MaxPayloadSizeInBytes;564m_Desc.MaxAttributeSizeInBytes = MaxAttributeSizeInBytes;565}566D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override567{568return D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_SHADER_CONFIG;569}570operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }571operator const D3D12_RAYTRACING_SHADER_CONFIG&() const noexcept { return m_Desc; }572private:573void Init() noexcept574{575SUBOBJECT_HELPER_BASE::Init();576m_Desc = {};577}578void* Data() noexcept override { return &m_Desc; }579D3D12_RAYTRACING_SHADER_CONFIG m_Desc;580};581582//------------------------------------------------------------------------------------------------583class CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT584: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE585{586public:587CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT() noexcept588{589Init();590}591CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)592{593Init();594AddToStateObject(ContainingStateObject);595}596void Config(UINT MaxTraceRecursionDepth) noexcept597{598m_Desc.MaxTraceRecursionDepth = MaxTraceRecursionDepth;599}600D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override601{602return D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_PIPELINE_CONFIG;603}604operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }605operator const D3D12_RAYTRACING_PIPELINE_CONFIG&() const noexcept { return m_Desc; }606private:607void Init() noexcept608{609SUBOBJECT_HELPER_BASE::Init();610m_Desc = {};611}612void* Data() noexcept override { return &m_Desc; }613D3D12_RAYTRACING_PIPELINE_CONFIG m_Desc;614};615616//------------------------------------------------------------------------------------------------617class CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT618: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE619{620public:621CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT() noexcept622{623Init();624}625CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)626{627Init();628AddToStateObject(ContainingStateObject);629}630void Config(UINT MaxTraceRecursionDepth, D3D12_RAYTRACING_PIPELINE_FLAGS Flags) noexcept631{632m_Desc.MaxTraceRecursionDepth = MaxTraceRecursionDepth;633m_Desc.Flags = Flags;634}635D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override636{637return D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_PIPELINE_CONFIG1;638}639operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }640operator const D3D12_RAYTRACING_PIPELINE_CONFIG1&() const noexcept { return m_Desc; }641private:642void Init() noexcept643{644SUBOBJECT_HELPER_BASE::Init();645m_Desc = {};646}647void* Data() noexcept override { return &m_Desc; }648D3D12_RAYTRACING_PIPELINE_CONFIG1 m_Desc;649};650651//------------------------------------------------------------------------------------------------652class CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT653: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE654{655public:656CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT() noexcept657{658Init();659}660CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)661{662Init();663AddToStateObject(ContainingStateObject);664}665void SetRootSignature(ID3D12RootSignature* pRootSig) noexcept666{667m_pRootSig = pRootSig;668}669D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override670{671return D3D12_STATE_SUBOBJECT_TYPE_GLOBAL_ROOT_SIGNATURE;672}673operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }674operator ID3D12RootSignature*() const noexcept { return D3DX12_COM_PTR_GET(m_pRootSig); }675private:676void Init() noexcept677{678SUBOBJECT_HELPER_BASE::Init();679m_pRootSig = nullptr;680}681void* Data() noexcept override { return D3DX12_COM_PTR_ADDRESSOF(m_pRootSig); }682D3DX12_COM_PTR<ID3D12RootSignature> m_pRootSig;683};684685//------------------------------------------------------------------------------------------------686class CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT687: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE688{689public:690CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT() noexcept691{692Init();693}694CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)695{696Init();697AddToStateObject(ContainingStateObject);698}699void SetRootSignature(ID3D12RootSignature* pRootSig) noexcept700{701m_pRootSig = pRootSig;702}703D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override704{705return D3D12_STATE_SUBOBJECT_TYPE_LOCAL_ROOT_SIGNATURE;706}707operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }708operator ID3D12RootSignature*() const noexcept { return D3DX12_COM_PTR_GET(m_pRootSig); }709private:710void Init() noexcept711{712SUBOBJECT_HELPER_BASE::Init();713m_pRootSig = nullptr;714}715void* Data() noexcept override { return D3DX12_COM_PTR_ADDRESSOF(m_pRootSig); }716D3DX12_COM_PTR<ID3D12RootSignature> m_pRootSig;717};718719//------------------------------------------------------------------------------------------------720class CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT721: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE722{723public:724CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT() noexcept725{726Init();727}728CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)729{730Init();731AddToStateObject(ContainingStateObject);732}733void SetFlags(D3D12_STATE_OBJECT_FLAGS Flags) noexcept734{735m_Desc.Flags = Flags;736}737D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override738{739return D3D12_STATE_SUBOBJECT_TYPE_STATE_OBJECT_CONFIG;740}741operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }742operator const D3D12_STATE_OBJECT_CONFIG&() const noexcept { return m_Desc; }743private:744void Init() noexcept745{746SUBOBJECT_HELPER_BASE::Init();747m_Desc = {};748}749void* Data() noexcept override { return &m_Desc; }750D3D12_STATE_OBJECT_CONFIG m_Desc;751};752753//------------------------------------------------------------------------------------------------754class CD3DX12_NODE_MASK_SUBOBJECT755: public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE756{757public:758CD3DX12_NODE_MASK_SUBOBJECT() noexcept759{760Init();761}762CD3DX12_NODE_MASK_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)763{764Init();765AddToStateObject(ContainingStateObject);766}767void SetNodeMask(UINT NodeMask) noexcept768{769m_Desc.NodeMask = NodeMask;770}771D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override772{773return D3D12_STATE_SUBOBJECT_TYPE_NODE_MASK;774}775operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; }776operator const D3D12_NODE_MASK&() const noexcept { return m_Desc; }777private:778void Init() noexcept779{780SUBOBJECT_HELPER_BASE::Init();781m_Desc = {};782}783void* Data() noexcept override { return &m_Desc; }784D3D12_NODE_MASK m_Desc;785};786787#undef D3DX12_COM_PTR788#undef D3DX12_COM_PTR_GET789#undef D3DX12_COM_PTR_ADDRESSOF790791792