| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382 |
- //*********************************************************
- //
- // Copyright (c) Microsoft Corporation.
- // Licensed under the MIT License (MIT).
- //
- //*********************************************************
- #pragma once
- #ifndef __cplusplus
- #error D3DX12 requires C++
- #endif
- #include "d3dx12_default.h"
- #include "d3d12.h"
- #include "d3dx12_core.h"
- //================================================================================================
- // D3DX12 State Object Creation Helpers
- //
- // Helper classes for creating new style state objects out of an arbitrary set of subobjects.
- // Uses STL
- //
- // Start by instantiating CD3DX12_STATE_OBJECT_DESC (see its public methods).
- // One of its methods is CreateSubobject(), which has a comment showing a couple of options for
- // defining subobjects using the helper classes for each subobject (CD3DX12_DXIL_LIBRARY_SUBOBJECT
- // etc.). The subobject helpers each have methods specific to the subobject for configuring its
- // contents.
- //
- //================================================================================================
- #include <list>
- #include <forward_list>
- #include <vector>
- #include <memory>
- #include <string>
- #include <vector>
- #ifndef D3DX12_USE_ATL
- #include <wrl/client.h>
- #define D3DX12_COM_PTR Microsoft::WRL::ComPtr
- #define D3DX12_COM_PTR_GET(x) x.Get()
- #define D3DX12_COM_PTR_ADDRESSOF(x) x.GetAddressOf()
- #else
- #include <atlbase.h>
- #define D3DX12_COM_PTR ATL::CComPtr
- #define D3DX12_COM_PTR_GET(x) x.p
- #define D3DX12_COM_PTR_ADDRESSOF(x) &x.p
- #endif
- //------------------------------------------------------------------------------------------------
- class CD3DX12_STATE_OBJECT_DESC
- {
- public:
- CD3DX12_STATE_OBJECT_DESC() noexcept
- {
- Init(D3D12_STATE_OBJECT_TYPE_COLLECTION);
- }
- CD3DX12_STATE_OBJECT_DESC(D3D12_STATE_OBJECT_TYPE Type) noexcept
- {
- Init(Type);
- }
- void SetStateObjectType(D3D12_STATE_OBJECT_TYPE Type) noexcept { m_Desc.Type = Type; }
- CD3DX12_STATE_OBJECT_DESC(const CD3DX12_STATE_OBJECT_DESC& other) = delete;
- CD3DX12_STATE_OBJECT_DESC& operator=(const CD3DX12_STATE_OBJECT_DESC& other) = delete;
- CD3DX12_STATE_OBJECT_DESC(CD3DX12_STATE_OBJECT_DESC&& other) = default;
- CD3DX12_STATE_OBJECT_DESC& operator=(CD3DX12_STATE_OBJECT_DESC&& other) = default;
- operator const D3D12_STATE_OBJECT_DESC& ()
- {
- #if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 612)
- m_RepointedSubobjectVectors.clear();
- m_RepointedPrograms.clear();
- #endif
- m_RepointedAssociations.clear();
- m_SubobjectArray.clear();
- m_SubobjectArray.reserve(m_Desc.NumSubobjects);
- // Flatten subobjects into an array (each flattened subobject still has a
- // member that's a pointer to its desc that's not flattened)
- for (auto Iter = m_SubobjectList.begin();
- Iter != m_SubobjectList.end(); Iter++)
- {
- m_SubobjectArray.push_back(*Iter);
- // Store new location in array so we can redirect pointers contained in subobjects
- Iter->pSubobjectArrayLocation = &m_SubobjectArray.back();
- }
- // For subobjects with pointer fields, create a new copy of those subobject definitions
- // with fixed pointers
- for (UINT i = 0; i < m_Desc.NumSubobjects; i++)
- {
- if (m_SubobjectArray[i].Type == D3D12_STATE_SUBOBJECT_TYPE_SUBOBJECT_TO_EXPORTS_ASSOCIATION)
- {
- auto pOriginalSubobjectAssociation =
- static_cast<const D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION*>(m_SubobjectArray[i].pDesc);
- D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION Repointed = *pOriginalSubobjectAssociation;
- auto pWrapper =
- static_cast<const SUBOBJECT_WRAPPER*>(pOriginalSubobjectAssociation->pSubobjectToAssociate);
- Repointed.pSubobjectToAssociate = pWrapper->pSubobjectArrayLocation;
- m_RepointedAssociations.push_back(Repointed);
- m_SubobjectArray[i].pDesc = &m_RepointedAssociations.back();
- }
- #if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 612)
- else if (m_SubobjectArray[i].Type == D3D12_STATE_SUBOBJECT_TYPE_GENERIC_PROGRAM)
- {
- auto originalGenericProgramDesc =
- static_cast<const D3D12_GENERIC_PROGRAM_DESC*>(m_SubobjectArray[i].pDesc);
- D3D12_GENERIC_PROGRAM_DESC Repointed = *originalGenericProgramDesc;
- if (originalGenericProgramDesc->NumSubobjects > 0)
- {
- m_RepointedSubobjectVectors.emplace_back(std::vector<const D3D12_STATE_SUBOBJECT*>());
- std::vector<D3D12_STATE_SUBOBJECT const*>& repointedGenericProgramSubobjects = m_RepointedSubobjectVectors.back();
- repointedGenericProgramSubobjects.resize(originalGenericProgramDesc->NumSubobjects);
- for (UINT s = 0; s < originalGenericProgramDesc->NumSubobjects; s++)
- {
- auto pWrapper =
- static_cast<const SUBOBJECT_WRAPPER*>(originalGenericProgramDesc->ppSubobjects[s]);
- repointedGenericProgramSubobjects[s] = pWrapper->pSubobjectArrayLocation;
- }
- // Below: using ugly way to get pointer in case .data() is not defined
- Repointed.ppSubobjects = &repointedGenericProgramSubobjects[0];
- }
- m_RepointedPrograms.push_back(Repointed);
- m_SubobjectArray[i].pDesc = &m_RepointedPrograms.back();
- }
- #endif
- }
- // Below: using ugly way to get pointer in case .data() is not defined
- m_Desc.pSubobjects = m_Desc.NumSubobjects ? &m_SubobjectArray[0] : nullptr;
- return m_Desc;
- }
- operator const D3D12_STATE_OBJECT_DESC* ()
- {
- // Cast calls the above final preparation work
- return &static_cast<const D3D12_STATE_OBJECT_DESC&>(*this);
- }
- // CreateSubobject creates a sububject helper (e.g. CD3DX12_HIT_GROUP_SUBOBJECT)
- // whose lifetime is owned by this class.
- // e.g.
- //
- // CD3DX12_STATE_OBJECT_DESC Collection1(D3D12_STATE_OBJECT_TYPE_COLLECTION);
- // auto Lib0 = Collection1.CreateSubobject<CD3DX12_DXIL_LIBRARY_SUBOBJECT>();
- // Lib0->SetDXILLibrary(&pMyAppDxilLibs[0]);
- // Lib0->DefineExport(L"rayGenShader0"); // in practice these export listings might be
- // // data/engine driven
- // etc.
- //
- // Alternatively, users can instantiate sububject helpers explicitly, such as via local
- // variables instead, passing the state object desc that should point to it into the helper
- // constructor (or call mySubobjectHelper.AddToStateObject(Collection1)).
- // In this alternative scenario, the user must keep the subobject alive as long as the state
- // object it is associated with is alive, else its pointer references will be stale.
- // e.g.
- //
- // CD3DX12_STATE_OBJECT_DESC RaytracingState2(D3D12_STATE_OBJECT_TYPE_RAYTRACING_PIPELINE);
- // CD3DX12_DXIL_LIBRARY_SUBOBJECT LibA(RaytracingState2);
- // LibA.SetDXILLibrary(&pMyAppDxilLibs[4]); // not manually specifying exports
- // // - meaning all exports in the libraries
- // // are exported
- // etc.
- template<typename T>
- T* CreateSubobject()
- {
- T* pSubobject = new T(*this);
- m_OwnedSubobjectHelpers.emplace_back(pSubobject);
- return pSubobject;
- }
- template<typename T, typename U>
- T* CreateSubobject(U&& arg)
- {
- T* pSubobject = new T(std::forward<U>(arg), *this);
- m_OwnedSubobjectHelpers.emplace_back(pSubobject);
- return pSubobject;
- }
- private:
- D3D12_STATE_SUBOBJECT* TrackSubobject(D3D12_STATE_SUBOBJECT_TYPE Type, void* pDesc)
- {
- SUBOBJECT_WRAPPER Subobject;
- Subobject.pSubobjectArrayLocation = nullptr;
- Subobject.Type = Type;
- Subobject.pDesc = pDesc;
- m_SubobjectList.push_back(Subobject);
- m_Desc.NumSubobjects++;
- return &m_SubobjectList.back();
- }
- void Init(D3D12_STATE_OBJECT_TYPE Type) noexcept
- {
- SetStateObjectType(Type);
- m_Desc.pSubobjects = nullptr;
- m_Desc.NumSubobjects = 0;
- m_SubobjectList.clear();
- m_SubobjectArray.clear();
- m_RepointedAssociations.clear();
- #if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 612)
- m_RepointedSubobjectVectors.clear();
- m_RepointedPrograms.clear();
- #endif
- }
- typedef struct SUBOBJECT_WRAPPER : public D3D12_STATE_SUBOBJECT
- {
- D3D12_STATE_SUBOBJECT* pSubobjectArrayLocation; // new location when flattened into array
- // for repointing pointers in subobjects
- } SUBOBJECT_WRAPPER;
- D3D12_STATE_OBJECT_DESC m_Desc;
- std::list<SUBOBJECT_WRAPPER> m_SubobjectList; // Pointers to list nodes handed out so
- // these can be edited live
- std::vector<D3D12_STATE_SUBOBJECT> m_SubobjectArray; // Built at the end, copying list contents
- std::list<D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION>
- m_RepointedAssociations; // subobject type that contains pointers to other subobjects,
- // repointed to flattened array
- #if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 612)
- std::list<std::vector<D3D12_STATE_SUBOBJECT const*>>
- m_RepointedSubobjectVectors;
- std::list<D3D12_GENERIC_PROGRAM_DESC>
- m_RepointedPrograms;
- #endif
- template<typename CStr, typename StdStr>
- class StringContainer
- {
- public:
- CStr LocalCopy(CStr string, bool bSingleString = false)
- {
- if (string)
- {
- if (bSingleString)
- {
- m_Strings.clear();
- m_Strings.push_back(string);
- }
- else
- {
- m_Strings.push_back(string);
- }
- return m_Strings.back().c_str();
- }
- else
- {
- return nullptr;
- }
- }
- void clear() noexcept { m_Strings.clear(); }
- private:
- std::list<StdStr> m_Strings;
- };
- public:
- class SUBOBJECT_HELPER_BASE
- {
- public:
- SUBOBJECT_HELPER_BASE() noexcept { Init(); }
- virtual ~SUBOBJECT_HELPER_BASE() = default;
- virtual D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept = 0;
- SUBOBJECT_HELPER_BASE(const SUBOBJECT_HELPER_BASE& other) = delete;
- SUBOBJECT_HELPER_BASE& operator=(const SUBOBJECT_HELPER_BASE& other) = delete;
- SUBOBJECT_HELPER_BASE(SUBOBJECT_HELPER_BASE&& other) = default;
- SUBOBJECT_HELPER_BASE& operator=(SUBOBJECT_HELPER_BASE&& other) = default;
- void AddToStateObject(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- {
- m_pSubobject = ContainingStateObject.TrackSubobject(Type(), Data());
- }
- operator const D3D12_STATE_SUBOBJECT& () const noexcept { return *m_pSubobject; }
- protected:
- virtual void* Data() noexcept = 0;
- void Init() noexcept { m_pSubobject = nullptr; }
- D3D12_STATE_SUBOBJECT* m_pSubobject;
- };
- private:
- std::list<std::unique_ptr<SUBOBJECT_HELPER_BASE>> m_OwnedSubobjectHelpers;
- friend class CD3DX12_DXIL_LIBRARY_SUBOBJECT;
- friend class CD3DX12_EXISTING_COLLECTION_SUBOBJECT;
- friend class CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT;
- friend class CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION;
- friend class CD3DX12_HIT_GROUP_SUBOBJECT;
- friend class CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT;
- friend class CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT;
- friend class CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT;
- friend class CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT;
- friend class CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT;
- friend class CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT;
- friend class CD3DX12_NODE_MASK_SUBOBJECT;
- //TODO: SDK Version check should include all the newly added subobject type for the public release.
- // The SDK version check will be changed based on when we release state objects.
- #if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 612)
- friend class CD3DX12_GENERIC_PROGRAM_SUBOBJECT;
- friend class CD3DX12_WORK_GRAPH_SUBOBJECT;
- friend class CD3DX12_STREAM_OUTPUT_SUBOBJECT;
- friend class CD3DX12_BLEND_SUBOBJECT;
- friend class CD3DX12_RASTERIZER_SUBOBJECT;
- friend class CD3DX12_DEPTH_STENCIL2_SUBOBJECT;
- friend class CD3DX12_INPUT_LAYOUT_SUBOBJECT;
- friend class CD3DX12_IB_STRIP_CUT_VALUE_SUBOBJECT;
- friend class CD3DX12_PRIMITIVE_TOPOLOGY_SUBOBJECT;
- friend class CD3DX12_RENDER_TARGET_FORMATS_SUBOBJECT;
- friend class CD3DX12_DEPTH_STENCIL_FORMAT_SUBOBJECT;
- friend class CD3DX12_SAMPLE_DESC_SUBOBJECT;
- friend class CD3DX12_FLAGS_SUBOBJECT;
- friend class CD3DX12_VIEW_INSTANCING_SUBOBJECT;
- friend class CD3DX12_DEPTH_STENCIL_SUBOBJECT;
- friend class CD3DX12_DEPTH_STENCIL1_SUBOBJECT;
- friend class CD3DX12_SAMPLE_MASK_SUBOBJECT;
- friend class CD3DX12_NODE_OUTPUT_OVERRIDES;
- friend class CD3DX12_NODE_HELPER_BASE;
- friend class CD3DX12_SHADER_NODE;
- friend class CD3DX12_BROADCASTING_LAUNCH_NODE_OVERRIDES;
- friend class CD3DX12_COALESCING_LAUNCH_NODE_OVERRIDES;
- friend class CD3DX12_THREAD_LAUNCH_NODE_OVERRIDES;
- friend class CD3DX12_COMMON_COMPUTE_NODE_OVERRIDES;
- #endif // D3D12_SDK_VERSION >= 612
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_DXIL_LIBRARY_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_DXIL_LIBRARY_SUBOBJECT() noexcept
- {
- Init();
- }
- CD3DX12_DXIL_LIBRARY_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_DXIL_LIBRARY_SUBOBJECT(const CD3DX12_DXIL_LIBRARY_SUBOBJECT& other) = delete;
- CD3DX12_DXIL_LIBRARY_SUBOBJECT& operator=(const CD3DX12_DXIL_LIBRARY_SUBOBJECT& other) = delete;
- CD3DX12_DXIL_LIBRARY_SUBOBJECT(CD3DX12_DXIL_LIBRARY_SUBOBJECT&& other) = default;
- CD3DX12_DXIL_LIBRARY_SUBOBJECT& operator=(CD3DX12_DXIL_LIBRARY_SUBOBJECT&& other) = default;
- void SetDXILLibrary(const D3D12_SHADER_BYTECODE* pCode) noexcept
- {
- static const D3D12_SHADER_BYTECODE Default = {};
- m_Desc.DXILLibrary = pCode ? *pCode : Default;
- }
- void DefineExport(
- LPCWSTR Name,
- LPCWSTR ExportToRename = nullptr,
- D3D12_EXPORT_FLAGS Flags = D3D12_EXPORT_FLAG_NONE)
- {
- D3D12_EXPORT_DESC Export;
- Export.Name = m_Strings.LocalCopy(Name);
- Export.ExportToRename = m_Strings.LocalCopy(ExportToRename);
- Export.Flags = Flags;
- m_Exports.push_back(Export);
- m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined
- m_Desc.NumExports = static_cast<UINT>(m_Exports.size());
- }
- template<size_t N>
- void DefineExports(LPCWSTR(&Exports)[N])
- {
- for (UINT i = 0; i < N; i++)
- {
- DefineExport(Exports[i]);
- }
- }
- void DefineExports(const LPCWSTR* Exports, UINT N)
- {
- for (UINT i = 0; i < N; i++)
- {
- DefineExport(Exports[i]);
- }
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_DXIL_LIBRARY;
- }
- operator const D3D12_DXIL_LIBRARY_DESC&() const noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- m_Desc = {};
- m_Strings.clear();
- m_Exports.clear();
- }
- void* Data() noexcept override { return &m_Desc; }
- D3D12_DXIL_LIBRARY_DESC m_Desc;
- CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring> m_Strings;
- std::vector<D3D12_EXPORT_DESC> m_Exports;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_EXISTING_COLLECTION_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_EXISTING_COLLECTION_SUBOBJECT() noexcept
- {
- Init();
- }
- CD3DX12_EXISTING_COLLECTION_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_EXISTING_COLLECTION_SUBOBJECT(const CD3DX12_EXISTING_COLLECTION_SUBOBJECT& other) = delete;
- CD3DX12_EXISTING_COLLECTION_SUBOBJECT& operator=(const CD3DX12_EXISTING_COLLECTION_SUBOBJECT& other) = delete;
- CD3DX12_EXISTING_COLLECTION_SUBOBJECT(CD3DX12_EXISTING_COLLECTION_SUBOBJECT&& other) = default;
- CD3DX12_EXISTING_COLLECTION_SUBOBJECT& operator=(CD3DX12_EXISTING_COLLECTION_SUBOBJECT&& other) = default;
- void SetExistingCollection(ID3D12StateObject*pExistingCollection) noexcept
- {
- m_Desc.pExistingCollection = pExistingCollection;
- m_CollectionRef = pExistingCollection;
- }
- void DefineExport(
- LPCWSTR Name,
- LPCWSTR ExportToRename = nullptr,
- D3D12_EXPORT_FLAGS Flags = D3D12_EXPORT_FLAG_NONE)
- {
- D3D12_EXPORT_DESC Export;
- Export.Name = m_Strings.LocalCopy(Name);
- Export.ExportToRename = m_Strings.LocalCopy(ExportToRename);
- Export.Flags = Flags;
- m_Exports.push_back(Export);
- m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined
- m_Desc.NumExports = static_cast<UINT>(m_Exports.size());
- }
- template<size_t N>
- void DefineExports(LPCWSTR(&Exports)[N])
- {
- for (UINT i = 0; i < N; i++)
- {
- DefineExport(Exports[i]);
- }
- }
- void DefineExports(const LPCWSTR* Exports, UINT N)
- {
- for (UINT i = 0; i < N; i++)
- {
- DefineExport(Exports[i]);
- }
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_EXISTING_COLLECTION;
- }
- operator const D3D12_EXISTING_COLLECTION_DESC&() const noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- m_Desc = {};
- m_CollectionRef = nullptr;
- m_Strings.clear();
- m_Exports.clear();
- }
- void* Data() noexcept override { return &m_Desc; }
- D3D12_EXISTING_COLLECTION_DESC m_Desc;
- D3DX12_COM_PTR<ID3D12StateObject> m_CollectionRef;
- CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring> m_Strings;
- std::vector<D3D12_EXPORT_DESC> m_Exports;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT() noexcept
- {
- Init();
- }
- CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT(const CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT& other) = delete;
- CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT& operator=(const CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT& other) = delete;
- CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT(CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT&& other) = default;
- CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT& operator=(CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT&& other) = default;
- void SetSubobjectToAssociate(const D3D12_STATE_SUBOBJECT& SubobjectToAssociate) noexcept
- {
- m_Desc.pSubobjectToAssociate = &SubobjectToAssociate;
- }
- void AddExport(LPCWSTR Export)
- {
- m_Desc.NumExports++;
- m_Exports.push_back(m_Strings.LocalCopy(Export));
- m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined
- }
- template<size_t N>
- void AddExports(LPCWSTR (&Exports)[N])
- {
- for (UINT i = 0; i < N; i++)
- {
- AddExport(Exports[i]);
- }
- }
- void AddExports(const LPCWSTR* Exports, UINT N)
- {
- for (UINT i = 0; i < N; i++)
- {
- AddExport(Exports[i]);
- }
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_SUBOBJECT_TO_EXPORTS_ASSOCIATION;
- }
- operator const D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION&() const noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- m_Desc = {};
- m_Strings.clear();
- m_Exports.clear();
- }
- void* Data() noexcept override { return &m_Desc; }
- D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION m_Desc;
- CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring> m_Strings;
- std::vector<LPCWSTR> m_Exports;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION() noexcept
- {
- Init();
- }
- CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION(const CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION& other) = delete;
- CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION& operator=(const CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION& other) = delete;
- CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION(CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION&& other) = default;
- CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION& operator=(CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION&& other) = default;
- void SetSubobjectNameToAssociate(LPCWSTR SubobjectToAssociate)
- {
- m_Desc.SubobjectToAssociate = m_SubobjectName.LocalCopy(SubobjectToAssociate, true);
- }
- void AddExport(LPCWSTR Export)
- {
- m_Desc.NumExports++;
- m_Exports.push_back(m_Strings.LocalCopy(Export));
- m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined
- }
- template<size_t N>
- void AddExports(LPCWSTR (&Exports)[N])
- {
- for (UINT i = 0; i < N; i++)
- {
- AddExport(Exports[i]);
- }
- }
- void AddExports(const LPCWSTR* Exports, UINT N)
- {
- for (UINT i = 0; i < N; i++)
- {
- AddExport(Exports[i]);
- }
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION;
- }
- operator const D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION&() const noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- m_Desc = {};
- m_Strings.clear();
- m_SubobjectName.clear();
- m_Exports.clear();
- }
- void* Data() noexcept override { return &m_Desc; }
- D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION m_Desc;
- CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring> m_Strings;
- CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring> m_SubobjectName;
- std::vector<LPCWSTR> m_Exports;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_HIT_GROUP_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_HIT_GROUP_SUBOBJECT() noexcept
- {
- Init();
- }
- CD3DX12_HIT_GROUP_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_HIT_GROUP_SUBOBJECT(const CD3DX12_HIT_GROUP_SUBOBJECT& other) = delete;
- CD3DX12_HIT_GROUP_SUBOBJECT& operator=(const CD3DX12_HIT_GROUP_SUBOBJECT& other) = delete;
- CD3DX12_HIT_GROUP_SUBOBJECT(CD3DX12_HIT_GROUP_SUBOBJECT&& other) = default;
- CD3DX12_HIT_GROUP_SUBOBJECT& operator=(CD3DX12_HIT_GROUP_SUBOBJECT&& other) = default;
- void SetHitGroupExport(LPCWSTR exportName)
- {
- m_Desc.HitGroupExport = m_Strings[0].LocalCopy(exportName, true);
- }
- void SetHitGroupType(D3D12_HIT_GROUP_TYPE Type) noexcept { m_Desc.Type = Type; }
- void SetAnyHitShaderImport(LPCWSTR importName)
- {
- m_Desc.AnyHitShaderImport = m_Strings[1].LocalCopy(importName, true);
- }
- void SetClosestHitShaderImport(LPCWSTR importName)
- {
- m_Desc.ClosestHitShaderImport = m_Strings[2].LocalCopy(importName, true);
- }
- void SetIntersectionShaderImport(LPCWSTR importName)
- {
- m_Desc.IntersectionShaderImport = m_Strings[3].LocalCopy(importName, true);
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_HIT_GROUP;
- }
- operator const D3D12_HIT_GROUP_DESC&() const noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- m_Desc = {};
- for (UINT i = 0; i < m_NumStrings; i++)
- {
- m_Strings[i].clear();
- }
- }
- void* Data() noexcept override { return &m_Desc; }
- D3D12_HIT_GROUP_DESC m_Desc;
- static constexpr UINT m_NumStrings = 4;
- CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring>
- m_Strings[m_NumStrings]; // one string for every entrypoint name
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT() noexcept
- : m_Desc({})
- {
- Init();
- }
- CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc({})
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT(const D3D12_RAYTRACING_SHADER_CONFIG &desc)
- : m_Desc(desc)
- {
- Init();
- }
- CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT(const D3D12_RAYTRACING_SHADER_CONFIG &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(desc)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT(const CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT& other) = delete;
- CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT& operator=(const CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT& other) = delete;
- CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT(CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT&& other) = default;
- CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT& operator=(CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT&& other) = default;
- void Config(UINT MaxPayloadSizeInBytes, UINT MaxAttributeSizeInBytes) noexcept
- {
- m_Desc.MaxPayloadSizeInBytes = MaxPayloadSizeInBytes;
- m_Desc.MaxAttributeSizeInBytes = MaxAttributeSizeInBytes;
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_SHADER_CONFIG;
- }
- operator const D3D12_RAYTRACING_SHADER_CONFIG&() const noexcept { return m_Desc; }
- operator D3D12_RAYTRACING_SHADER_CONFIG&() noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- }
- void* Data() noexcept override { return &m_Desc; }
- D3D12_RAYTRACING_SHADER_CONFIG m_Desc;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT() noexcept
- : m_Desc({})
- {
- Init();
- }
- CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc({})
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT(const D3D12_RAYTRACING_PIPELINE_CONFIG &desc)
- : m_Desc(desc)
- {
- Init();
- }
- CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT(const D3D12_RAYTRACING_PIPELINE_CONFIG &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(desc)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT(const CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT& other) = delete;
- CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT& operator=(const CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT& other) = delete;
- CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT(CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT&& other) = default;
- CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT& operator=(CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT&& other) = default;
- void Config(UINT MaxTraceRecursionDepth) noexcept
- {
- m_Desc.MaxTraceRecursionDepth = MaxTraceRecursionDepth;
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_PIPELINE_CONFIG;
- }
- operator const D3D12_RAYTRACING_PIPELINE_CONFIG&() const noexcept { return m_Desc; }
- operator D3D12_RAYTRACING_PIPELINE_CONFIG&() noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- }
- void* Data() noexcept override { return &m_Desc; }
- D3D12_RAYTRACING_PIPELINE_CONFIG m_Desc;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT() noexcept
- : m_Desc({})
- {
- Init();
- }
- CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc({})
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT(const D3D12_RAYTRACING_PIPELINE_CONFIG1 &desc)
- : m_Desc(desc)
- {
- Init();
- }
- CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT(const D3D12_RAYTRACING_PIPELINE_CONFIG1 &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(desc)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT(const CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT& other) = delete;
- CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT& operator=(const CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT& other) = delete;
- CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT(CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT&& other) = default;
- CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT& operator=(CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT&& other) = default;
- void Config(UINT MaxTraceRecursionDepth, D3D12_RAYTRACING_PIPELINE_FLAGS Flags) noexcept
- {
- m_Desc.MaxTraceRecursionDepth = MaxTraceRecursionDepth;
- m_Desc.Flags = Flags;
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_PIPELINE_CONFIG1;
- }
- operator const D3D12_RAYTRACING_PIPELINE_CONFIG1&() const noexcept { return m_Desc; }
- operator D3D12_RAYTRACING_PIPELINE_CONFIG1&() noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- }
- void* Data() noexcept override { return &m_Desc; }
- D3D12_RAYTRACING_PIPELINE_CONFIG1 m_Desc;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT() noexcept
- {
- Init();
- }
- CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT(const CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT& other) = delete;
- CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT& operator=(const CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT& other) = delete;
- CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT(CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT&& other) = default;
- CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT& operator=(CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT&& other) = default;
- void SetRootSignature(ID3D12RootSignature* pRootSig) noexcept
- {
- m_pRootSig = pRootSig;
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_GLOBAL_ROOT_SIGNATURE;
- }
- operator ID3D12RootSignature*() const noexcept { return D3DX12_COM_PTR_GET(m_pRootSig); }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- m_pRootSig = nullptr;
- }
- void* Data() noexcept override { return D3DX12_COM_PTR_ADDRESSOF(m_pRootSig); }
- D3DX12_COM_PTR<ID3D12RootSignature> m_pRootSig;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT() noexcept
- {
- Init();
- }
- CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT(const CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT& other) = delete;
- CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT& operator=(const CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT& other) = delete;
- CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT(CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT&& other) = default;
- CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT& operator=(CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT&& other) = default;
- void SetRootSignature(ID3D12RootSignature* pRootSig) noexcept
- {
- m_pRootSig = pRootSig;
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_LOCAL_ROOT_SIGNATURE;
- }
- operator ID3D12RootSignature*() const noexcept { return D3DX12_COM_PTR_GET(m_pRootSig); }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- m_pRootSig = nullptr;
- }
- void* Data() noexcept override { return D3DX12_COM_PTR_ADDRESSOF(m_pRootSig); }
- D3DX12_COM_PTR<ID3D12RootSignature> m_pRootSig;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT() noexcept
- : m_Desc({})
- {
- Init();
- }
- CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc({})
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT(const D3D12_STATE_OBJECT_CONFIG &desc) noexcept
- : m_Desc(desc)
- {
- Init();
- }
- CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT(const D3D12_STATE_OBJECT_CONFIG &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(desc)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT(const CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT& other) = delete;
- CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT& operator=(const CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT& other) = delete;
- CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT(CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT&& other) = default;
- CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT& operator=(CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT&& other) = default;
- void SetFlags(D3D12_STATE_OBJECT_FLAGS Flags) noexcept
- {
- m_Desc.Flags = Flags;
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_STATE_OBJECT_CONFIG;
- }
- operator const D3D12_STATE_OBJECT_CONFIG&() const noexcept { return m_Desc; }
- operator D3D12_STATE_OBJECT_CONFIG&() noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- }
- void* Data() noexcept override { return &m_Desc; }
- D3D12_STATE_OBJECT_CONFIG m_Desc;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_NODE_MASK_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_NODE_MASK_SUBOBJECT() noexcept
- : m_Desc({})
- {
- Init();
- }
- CD3DX12_NODE_MASK_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc({})
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_NODE_MASK_SUBOBJECT(const D3D12_NODE_MASK &desc) noexcept
- : m_Desc(desc)
- {
- Init();
- }
- CD3DX12_NODE_MASK_SUBOBJECT(const D3D12_NODE_MASK &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(desc)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_NODE_MASK_SUBOBJECT(const CD3DX12_NODE_MASK_SUBOBJECT& other) = delete;
- CD3DX12_NODE_MASK_SUBOBJECT& operator=(const CD3DX12_NODE_MASK_SUBOBJECT& other) = delete;
- CD3DX12_NODE_MASK_SUBOBJECT(CD3DX12_NODE_MASK_SUBOBJECT&& other) = default;
- CD3DX12_NODE_MASK_SUBOBJECT& operator=(CD3DX12_NODE_MASK_SUBOBJECT&& other) = default;
- void SetNodeMask(UINT NodeMask) noexcept
- {
- m_Desc.NodeMask = NodeMask;
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_NODE_MASK;
- }
- operator const D3D12_NODE_MASK&() const noexcept { return m_Desc; }
- operator D3D12_NODE_MASK&() noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- }
- void* Data() noexcept override { return &m_Desc; }
- D3D12_NODE_MASK m_Desc;
- };
- #if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 612)
- //------------------------------------------------------------------------------------------------
- class CD3DX12_STREAM_OUTPUT_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_STREAM_OUTPUT_SUBOBJECT()
- {
- Init();
- }
- CD3DX12_STREAM_OUTPUT_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- void AddSODeclEntry(const D3D12_SO_DECLARATION_ENTRY &entry)
- {
- m_soDecalEntries.emplace_back(D3D12_SO_DECLARATION_ENTRY{
- entry.Stream,
- m_Strings.LocalCopy(entry.SemanticName),
- entry.SemanticIndex,
- entry.StartComponent,
- entry.ComponentCount,
- entry.OutputSlot
- });
- m_Desc.NumEntries++;
- // Below: using ugly way to get pointer in case .data() is not defined
- m_Desc.pSODeclaration = &m_soDecalEntries[0];
- }
- void SetSODeclEntries(const D3D12_SO_DECLARATION_ENTRY* soDeclEntries, UINT numEntries)
- {
- m_soDecalEntries.resize(numEntries);
- for (UINT i = 0; i < numEntries; i++)
- {
- m_soDecalEntries[i] = D3D12_SO_DECLARATION_ENTRY{
- soDeclEntries[i].Stream,
- m_Strings.LocalCopy(soDeclEntries[i].SemanticName),
- soDeclEntries[i].SemanticIndex,
- soDeclEntries[i].StartComponent,
- soDeclEntries[i].ComponentCount,
- soDeclEntries[i].OutputSlot
- };
- }
- m_Desc.NumEntries = numEntries;
- // Below: using ugly way to get pointer in case .data() is not defined
- if (numEntries > 0)
- {
- m_Desc.pSODeclaration = &m_soDecalEntries[0];
- }
- }
- void SetBufferStrides(const UINT* bufferStrides, UINT numStrides)
- {
- for (UINT i = 0; i < numStrides; ++i)
- {
- m_Strides[i] = bufferStrides[i];
- }
- m_Desc.pBufferStrides = m_Strides;
- m_Desc.NumStrides = numStrides;
- }
- void SetRasterizedStream(UINT rasterizedStream)
- {
- m_Desc.RasterizedStream = rasterizedStream;
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_STREAM_OUTPUT;
- }
- operator const D3D12_STREAM_OUTPUT_DESC& () const noexcept { return m_Desc; }
- private:
- void Init()
- {
- SUBOBJECT_HELPER_BASE::Init();
- m_Desc = {};
- }
- void* Data() noexcept override { return &m_Desc; }
- D3D12_STREAM_OUTPUT_DESC m_Desc;
- CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCSTR, std::string> m_Strings;
- std::vector<D3D12_SO_DECLARATION_ENTRY> m_soDecalEntries;
- UINT m_Strides[D3D12_SO_STREAM_COUNT];
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_BLEND_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_BLEND_SUBOBJECT()
- : m_Desc(CD3DX12_BLEND_DESC(D3D12_DEFAULT))
- {
- Init();
- }
- CD3DX12_BLEND_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(CD3DX12_BLEND_DESC(D3D12_DEFAULT))
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_BLEND_SUBOBJECT(const D3D12_BLEND_DESC &desc)
- : m_Desc(desc)
- {
- Init();
- }
- CD3DX12_BLEND_SUBOBJECT(const D3D12_BLEND_DESC &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(desc)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- void SetAlphaToCoverageEnable(bool alphaToCoverageEnable)
- {
- m_Desc.AlphaToCoverageEnable = alphaToCoverageEnable;
- }
- void SetIndependentBlendEnable(bool independentBlendEnable)
- {
- m_Desc.IndependentBlendEnable = independentBlendEnable;
- }
- void SetRenderTarget(UINT renderTargetIndex, const D3D12_RENDER_TARGET_BLEND_DESC& renderTargetBlendDesc)
- {
- m_Desc.RenderTarget[renderTargetIndex].BlendEnable = renderTargetBlendDesc.BlendEnable;
- m_Desc.RenderTarget[renderTargetIndex].BlendOp = renderTargetBlendDesc.BlendOp;
- m_Desc.RenderTarget[renderTargetIndex].BlendOpAlpha = renderTargetBlendDesc.BlendOpAlpha;
- m_Desc.RenderTarget[renderTargetIndex].DestBlend = renderTargetBlendDesc.DestBlend;
- m_Desc.RenderTarget[renderTargetIndex].DestBlendAlpha = renderTargetBlendDesc.DestBlendAlpha;
- m_Desc.RenderTarget[renderTargetIndex].LogicOp = renderTargetBlendDesc.LogicOp;
- m_Desc.RenderTarget[renderTargetIndex].LogicOpEnable = renderTargetBlendDesc.LogicOpEnable;
- m_Desc.RenderTarget[renderTargetIndex].RenderTargetWriteMask = renderTargetBlendDesc.RenderTargetWriteMask;
- m_Desc.RenderTarget[renderTargetIndex].SrcBlend = renderTargetBlendDesc.SrcBlend;
- m_Desc.RenderTarget[renderTargetIndex].SrcBlendAlpha = renderTargetBlendDesc.SrcBlendAlpha;
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_BLEND;
- }
- operator const D3D12_BLEND_DESC& () const noexcept { return m_Desc; }
- operator D3D12_BLEND_DESC& () noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- }
- void* Data() noexcept override { return &m_Desc; }
- CD3DX12_BLEND_DESC m_Desc;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_RASTERIZER_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_RASTERIZER_SUBOBJECT()
- : m_Desc(CD3DX12_RASTERIZER_DESC2(D3D12_DEFAULT))
- {
- Init();
- }
- CD3DX12_RASTERIZER_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(CD3DX12_RASTERIZER_DESC2(D3D12_DEFAULT))
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_RASTERIZER_SUBOBJECT(const D3D12_RASTERIZER_DESC2 &desc)
- : m_Desc(desc)
- {
- Init();
- }
- CD3DX12_RASTERIZER_SUBOBJECT(const D3D12_RASTERIZER_DESC2 &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(desc)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- void SetFillMode(D3D12_FILL_MODE fillMode)
- {
- m_Desc.FillMode = fillMode;
- }
- void SetCullMode(D3D12_CULL_MODE cullMode)
- {
- m_Desc.CullMode = cullMode;
- }
- void SetFrontCounterClockwise(BOOL frontCounterClockwise)
- {
- m_Desc.FrontCounterClockwise = frontCounterClockwise;
- }
- void SetDepthBias(FLOAT depthBias)
- {
- m_Desc.DepthBias = depthBias;
- }
- void SetDepthBiasClamp(FLOAT depthBiasClamp)
- {
- m_Desc.DepthBiasClamp = depthBiasClamp;
- }
- void SetSlopeScaledDepthBias(FLOAT slopeScaledDepthBias)
- {
- m_Desc.SlopeScaledDepthBias = slopeScaledDepthBias;
- }
- void SetDepthClipEnable(BOOL depthClipEnable)
- {
- m_Desc.DepthClipEnable = depthClipEnable;
- }
- void SetLineRasterizationMode(D3D12_LINE_RASTERIZATION_MODE lineRasterizationMode)
- {
- m_Desc.LineRasterizationMode = lineRasterizationMode;
- }
- void SetForcedSampleCount(UINT forcedSampleCount)
- {
- m_Desc.ForcedSampleCount = forcedSampleCount;
- }
- void SetConservativeRaster(D3D12_CONSERVATIVE_RASTERIZATION_MODE conservativeRaster)
- {
- m_Desc.ConservativeRaster = conservativeRaster;
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_RASTERIZER;
- }
- operator const D3D12_RASTERIZER_DESC2& () const noexcept { return m_Desc; }
- operator D3D12_RASTERIZER_DESC2& () noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- }
- void* Data() noexcept override { return &m_Desc; }
- CD3DX12_RASTERIZER_DESC2 m_Desc;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_DEPTH_STENCIL2_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_DEPTH_STENCIL2_SUBOBJECT()
- : m_Desc(CD3DX12_DEPTH_STENCIL_DESC2(D3D12_DEFAULT))
- {
- Init();
- }
- CD3DX12_DEPTH_STENCIL2_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(CD3DX12_DEPTH_STENCIL_DESC2(D3D12_DEFAULT))
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_DEPTH_STENCIL2_SUBOBJECT(const D3D12_DEPTH_STENCIL_DESC2 &desc)
- : m_Desc(desc)
- {
- Init();
- }
- CD3DX12_DEPTH_STENCIL2_SUBOBJECT(const D3D12_DEPTH_STENCIL_DESC2 &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(desc)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- void SetDepthEnable(BOOL depthEnable)
- {
- m_Desc.DepthEnable = depthEnable;
- }
- void SetDepthWriteMask(D3D12_DEPTH_WRITE_MASK depthWriteMask)
- {
- m_Desc.DepthWriteMask = depthWriteMask;
- }
- void SetDepthFunc(D3D12_COMPARISON_FUNC depthFunc)
- {
- m_Desc.DepthFunc = depthFunc;
- }
- void SetStencilEnable(BOOL stencilEnable)
- {
- m_Desc.StencilEnable = stencilEnable;
- }
- void SetFrontFace(D3D12_DEPTH_STENCILOP_DESC1 frontFace)
- {
- m_Desc.FrontFace = {
- frontFace.StencilFailOp,
- frontFace.StencilDepthFailOp,
- frontFace.StencilPassOp,
- frontFace.StencilFunc,
- frontFace.StencilReadMask,
- frontFace.StencilWriteMask
- };
- }
- void SetBackFace(D3D12_DEPTH_STENCILOP_DESC1 backFace)
- {
- m_Desc.BackFace = {
- backFace.StencilFailOp,
- backFace.StencilDepthFailOp,
- backFace.StencilPassOp,
- backFace.StencilFunc,
- backFace.StencilReadMask,
- backFace.StencilWriteMask
- };
- }
- void SetDepthBoundsTestEnable(BOOL depthBoundsTestEnable)
- {
- m_Desc.DepthBoundsTestEnable = depthBoundsTestEnable;
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL2;
- }
- operator const D3D12_DEPTH_STENCIL_DESC2& () const noexcept { return m_Desc; }
- operator D3D12_DEPTH_STENCIL_DESC2& () noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- }
- void* Data() noexcept override { return &m_Desc; }
- CD3DX12_DEPTH_STENCIL_DESC2 m_Desc;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_INPUT_LAYOUT_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_INPUT_LAYOUT_SUBOBJECT()
- {
- Init();
- }
- CD3DX12_INPUT_LAYOUT_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- void AddInputLayoutElementDesc(D3D12_INPUT_ELEMENT_DESC inputLayoutElementDesc)
- {
- m_inputLayoutElements.emplace_back(
- D3D12_INPUT_ELEMENT_DESC{
- m_Strings.LocalCopy(inputLayoutElementDesc.SemanticName),
- inputLayoutElementDesc.SemanticIndex,
- inputLayoutElementDesc.Format,
- inputLayoutElementDesc.InputSlot,
- inputLayoutElementDesc.AlignedByteOffset,
- inputLayoutElementDesc.InputSlotClass,
- inputLayoutElementDesc.InstanceDataStepRate
- });
- ++m_Desc.NumElements;
- // Below: using ugly way to get pointer in case .data() is not defined
- m_Desc.pInputElementDescs = &m_inputLayoutElements[0];
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_INPUT_LAYOUT;
- }
- operator const D3D12_INPUT_LAYOUT_DESC& () const noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- m_Desc = {};
- m_inputLayoutElements.clear();
- }
- void* Data() noexcept override { return &m_Desc; }
- D3D12_INPUT_LAYOUT_DESC m_Desc;
- std::vector<D3D12_INPUT_ELEMENT_DESC> m_inputLayoutElements;
- CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCSTR, std::string> m_Strings;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_IB_STRIP_CUT_VALUE_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_IB_STRIP_CUT_VALUE_SUBOBJECT()
- : m_Desc(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_DISABLED)
- {
- Init();
- }
- CD3DX12_IB_STRIP_CUT_VALUE_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_DISABLED)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_IB_STRIP_CUT_VALUE_SUBOBJECT(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE desc)
- : m_Desc(desc)
- {
- Init();
- }
- CD3DX12_IB_STRIP_CUT_VALUE_SUBOBJECT(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(desc)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- void SetIBStripCutValue(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE ibStripCutValue)
- {
- m_Desc = ibStripCutValue;
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_IB_STRIP_CUT_VALUE;
- }
- operator const D3D12_INDEX_BUFFER_STRIP_CUT_VALUE& () const noexcept { return m_Desc; }
- operator D3D12_INDEX_BUFFER_STRIP_CUT_VALUE& () noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- }
- void* Data() noexcept override { return &m_Desc; }
- D3D12_INDEX_BUFFER_STRIP_CUT_VALUE m_Desc;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_PRIMITIVE_TOPOLOGY_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_PRIMITIVE_TOPOLOGY_SUBOBJECT()
- : m_Desc(D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED)
- {
- Init();
- }
- CD3DX12_PRIMITIVE_TOPOLOGY_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_PRIMITIVE_TOPOLOGY_SUBOBJECT(D3D12_PRIMITIVE_TOPOLOGY_TYPE desc)
- : m_Desc(desc)
- {
- Init();
- }
- CD3DX12_PRIMITIVE_TOPOLOGY_SUBOBJECT(D3D12_PRIMITIVE_TOPOLOGY_TYPE desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(desc)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- void SetPrimitiveTopologyType(D3D12_PRIMITIVE_TOPOLOGY_TYPE primitiveTopologytype)
- {
- m_Desc = primitiveTopologytype;
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY;
- }
- operator const D3D12_PRIMITIVE_TOPOLOGY_TYPE& () const noexcept { return m_Desc; }
- operator D3D12_PRIMITIVE_TOPOLOGY_TYPE& () noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- }
- void* Data() noexcept override { return &m_Desc; }
- D3D12_PRIMITIVE_TOPOLOGY_TYPE m_Desc;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_RENDER_TARGET_FORMATS_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_RENDER_TARGET_FORMATS_SUBOBJECT()
- : m_Desc({})
- {
- Init();
- }
- CD3DX12_RENDER_TARGET_FORMATS_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc({})
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_RENDER_TARGET_FORMATS_SUBOBJECT(const D3D12_RT_FORMAT_ARRAY &desc)
- : m_Desc(desc)
- {
- Init();
- }
- CD3DX12_RENDER_TARGET_FORMATS_SUBOBJECT(const D3D12_RT_FORMAT_ARRAY &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(desc)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- void SetNumRenderTargets(UINT numRenderTargets)
- {
- m_Desc.NumRenderTargets = numRenderTargets;
- }
- void SetRenderTargetFormat(UINT renderTarget, DXGI_FORMAT renderTargetFormat)
- {
- m_Desc.RTFormats[renderTarget] = renderTargetFormat;
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_RENDER_TARGET_FORMATS;
- }
- operator const D3D12_RT_FORMAT_ARRAY& () const noexcept { return m_Desc; }
- operator D3D12_RT_FORMAT_ARRAY& () noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- }
- void* Data() noexcept override { return &m_Desc; }
- D3D12_RT_FORMAT_ARRAY m_Desc;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_DEPTH_STENCIL_FORMAT_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_DEPTH_STENCIL_FORMAT_SUBOBJECT()
- : m_Desc(DXGI_FORMAT_UNKNOWN)
- {
- Init();
- }
- CD3DX12_DEPTH_STENCIL_FORMAT_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(DXGI_FORMAT_UNKNOWN)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_DEPTH_STENCIL_FORMAT_SUBOBJECT(DXGI_FORMAT desc)
- : m_Desc(desc)
- {
- Init();
- }
- CD3DX12_DEPTH_STENCIL_FORMAT_SUBOBJECT(DXGI_FORMAT desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(desc)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- void SetDepthStencilFormat(DXGI_FORMAT depthStencilFormat)
- {
- m_Desc = depthStencilFormat;
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL_FORMAT;
- }
- operator const DXGI_FORMAT& () const noexcept { return m_Desc; }
- operator DXGI_FORMAT& () noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- }
- void* Data() noexcept override { return &m_Desc; }
- DXGI_FORMAT m_Desc;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_SAMPLE_DESC_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_SAMPLE_DESC_SUBOBJECT()
- : m_Desc({1, 0})
- {
- Init();
- }
- CD3DX12_SAMPLE_DESC_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc({1, 0})
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_SAMPLE_DESC_SUBOBJECT(const DXGI_SAMPLE_DESC &desc)
- : m_Desc(desc)
- {
- Init();
- }
- CD3DX12_SAMPLE_DESC_SUBOBJECT(const DXGI_SAMPLE_DESC &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(desc)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- void SetCount(UINT count)
- {
- m_Desc.Count = count;
- }
- void SetQuality(UINT quality)
- {
- m_Desc.Quality = quality;
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_SAMPLE_DESC;
- }
- operator const DXGI_SAMPLE_DESC& () const noexcept { return m_Desc; }
- operator DXGI_SAMPLE_DESC& () noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- m_Desc = {};
- }
- void* Data() noexcept override { return &m_Desc; }
- DXGI_SAMPLE_DESC m_Desc;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_FLAGS_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_FLAGS_SUBOBJECT()
- : m_Desc(D3D12_PIPELINE_STATE_FLAG_NONE)
- {
- Init();
- }
- CD3DX12_FLAGS_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(D3D12_PIPELINE_STATE_FLAG_NONE)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_FLAGS_SUBOBJECT(D3D12_PIPELINE_STATE_FLAGS desc)
- : m_Desc(desc)
- {
- Init();
- }
- CD3DX12_FLAGS_SUBOBJECT(D3D12_PIPELINE_STATE_FLAGS desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(desc)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- void SetFlags(D3D12_PIPELINE_STATE_FLAGS flags)
- {
- m_Desc = flags;
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_FLAGS;
- }
- operator const D3D12_PIPELINE_STATE_FLAGS& () const noexcept { return m_Desc; }
- operator D3D12_PIPELINE_STATE_FLAGS& () noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- }
- void* Data() noexcept override { return &m_Desc; }
- D3D12_PIPELINE_STATE_FLAGS m_Desc;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_VIEW_INSTANCING_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_VIEW_INSTANCING_SUBOBJECT()
- {
- Init();
- }
- CD3DX12_VIEW_INSTANCING_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- void AddViewInstanceLocation(D3D12_VIEW_INSTANCE_LOCATION viewInstanceLocation)
- {
- m_Desc.ViewInstanceCount++;
- m_viewInstanceLocations.emplace_back(
- D3D12_VIEW_INSTANCE_LOCATION
- {
- viewInstanceLocation.ViewportArrayIndex,
- viewInstanceLocation.RenderTargetArrayIndex
- }
- );
- // Below: using ugly way to get pointer in case .data() is not defined
- m_Desc.pViewInstanceLocations = &m_viewInstanceLocations[0];
- }
- void SetFlags(D3D12_VIEW_INSTANCING_FLAGS flags)
- {
- m_Desc.Flags = flags;
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_VIEW_INSTANCING;
- }
- operator const D3D12_VIEW_INSTANCING_DESC& () const noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- m_Desc = CD3DX12_VIEW_INSTANCING_DESC(D3D12_DEFAULT);
- m_viewInstanceLocations.clear();
- }
- void* Data() noexcept override { return &m_Desc; }
- CD3DX12_VIEW_INSTANCING_DESC m_Desc;
- std::vector<D3D12_VIEW_INSTANCE_LOCATION> m_viewInstanceLocations;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_DEPTH_STENCIL_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_DEPTH_STENCIL_SUBOBJECT()
- : m_Desc(CD3DX12_DEPTH_STENCIL_DESC(D3D12_DEFAULT))
- {
- Init();
- }
- CD3DX12_DEPTH_STENCIL_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(CD3DX12_DEPTH_STENCIL_DESC(D3D12_DEFAULT))
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_DEPTH_STENCIL_SUBOBJECT(const D3D12_DEPTH_STENCIL_DESC &desc)
- : m_Desc(desc)
- {
- Init();
- }
- CD3DX12_DEPTH_STENCIL_SUBOBJECT(const D3D12_DEPTH_STENCIL_DESC &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(desc)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- void SetDepthEnable(BOOL depthEnable)
- {
- m_Desc.DepthEnable = depthEnable;
- }
- void SetDepthWriteMask(D3D12_DEPTH_WRITE_MASK depthWriteMask)
- {
- m_Desc.DepthWriteMask = depthWriteMask;
- }
- void SetDepthFunc(D3D12_COMPARISON_FUNC depthFunc)
- {
- m_Desc.DepthFunc = depthFunc;
- }
- void SetStencilEnable(BOOL stencilEnable)
- {
- m_Desc.StencilEnable = stencilEnable;
- }
- void SetStencilReadMask(UINT8 stencilReadMask)
- {
- m_Desc.StencilReadMask = stencilReadMask;
- }
- void SetStencilWriteMask(UINT8 stencilWriteMask)
- {
- m_Desc.StencilWriteMask = stencilWriteMask;
- }
- void SetFrontFace(D3D12_DEPTH_STENCILOP_DESC frontFace)
- {
- m_Desc.FrontFace = {
- frontFace.StencilFailOp,
- frontFace.StencilDepthFailOp,
- frontFace.StencilPassOp,
- frontFace.StencilFunc
- };
- }
- void SetBackFace(D3D12_DEPTH_STENCILOP_DESC backFace)
- {
- m_Desc.BackFace = {
- backFace.StencilFailOp,
- backFace.StencilDepthFailOp,
- backFace.StencilPassOp,
- backFace.StencilFunc
- };
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL;
- }
- operator const D3D12_DEPTH_STENCIL_DESC& () const noexcept { return m_Desc; }
- operator D3D12_DEPTH_STENCIL_DESC& () noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- }
- void* Data() noexcept override { return &m_Desc; }
- CD3DX12_DEPTH_STENCIL_DESC m_Desc;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_DEPTH_STENCIL1_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_DEPTH_STENCIL1_SUBOBJECT()
- : m_Desc(CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEFAULT))
- {
- Init();
- }
- CD3DX12_DEPTH_STENCIL1_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEFAULT))
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_DEPTH_STENCIL1_SUBOBJECT(const D3D12_DEPTH_STENCIL_DESC1 &desc)
- : m_Desc(desc)
- {
- Init();
- }
- CD3DX12_DEPTH_STENCIL1_SUBOBJECT(const D3D12_DEPTH_STENCIL_DESC1 &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(desc)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- void SetDepthEnable(BOOL depthEnable)
- {
- m_Desc.DepthEnable = depthEnable;
- }
- void SetDepthWriteMask(D3D12_DEPTH_WRITE_MASK depthWriteMask)
- {
- m_Desc.DepthWriteMask = depthWriteMask;
- }
- void SetDepthFunc(D3D12_COMPARISON_FUNC depthFunc)
- {
- m_Desc.DepthFunc = depthFunc;
- }
- void SetStencilEnable(BOOL stencilEnable)
- {
- m_Desc.StencilEnable = stencilEnable;
- }
- void SetStencilReadMask(UINT8 stencilReadMask)
- {
- m_Desc.StencilReadMask = stencilReadMask;
- }
- void SetStencilWriteMask(UINT8 stencilWriteMask)
- {
- m_Desc.StencilWriteMask = stencilWriteMask;
- }
- void SetFrontFace(D3D12_DEPTH_STENCILOP_DESC frontFace)
- {
- m_Desc.FrontFace = {
- frontFace.StencilFailOp,
- frontFace.StencilDepthFailOp,
- frontFace.StencilPassOp,
- frontFace.StencilFunc
- };
- }
- void SetBackFace(D3D12_DEPTH_STENCILOP_DESC backFace)
- {
- m_Desc.BackFace = {
- backFace.StencilFailOp,
- backFace.StencilDepthFailOp,
- backFace.StencilPassOp,
- backFace.StencilFunc
- };
- }
- void SetDepthBoundsTestEnable(BOOL depthBoundsTestEnable)
- {
- m_Desc.DepthBoundsTestEnable = depthBoundsTestEnable;
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL1;
- }
- operator const D3D12_DEPTH_STENCIL_DESC1& () const noexcept { return m_Desc; }
- operator D3D12_DEPTH_STENCIL_DESC1& () noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- }
- void* Data() noexcept override { return &m_Desc; }
- CD3DX12_DEPTH_STENCIL_DESC1 m_Desc;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_SAMPLE_MASK_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_SAMPLE_MASK_SUBOBJECT()
- : m_Desc(0xffffffffu)
- {
- Init();
- }
- CD3DX12_SAMPLE_MASK_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(0xffffffffu)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- CD3DX12_SAMPLE_MASK_SUBOBJECT(UINT desc)
- : m_Desc(desc)
- {
- Init();
- }
- CD3DX12_SAMPLE_MASK_SUBOBJECT(UINT desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- : m_Desc(desc)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- void SetSampleMask(UINT sampleMask)
- {
- m_Desc = sampleMask;
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_SAMPLE_MASK;
- }
- operator const UINT& () const noexcept { return m_Desc; }
- operator UINT& () noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- }
- void* Data() noexcept override { return &m_Desc; }
- UINT m_Desc;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_GENERIC_PROGRAM_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_GENERIC_PROGRAM_SUBOBJECT()
- {
- Init();
- }
- CD3DX12_GENERIC_PROGRAM_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- void SetProgramName(LPCWSTR ProgramName)
- {
- m_Desc.ProgramName = m_Strings.LocalCopy(ProgramName);
- }
- void AddExport(LPCWSTR exportName)
- {
- m_Exports.emplace_back(m_Strings.LocalCopy(exportName));
- m_Desc.NumExports++;
- // Below: using ugly way to get pointer in case .data() is not defined
- m_Desc.pExports = &m_Exports[0];
- }
- void AddSubobject(const D3D12_STATE_SUBOBJECT& subobject)
- {
- m_Subobjects.emplace_back(&subobject);
- m_Desc.NumSubobjects++;
- // Below: using ugly way to get pointer in case .data() is not defined
- m_Desc.ppSubobjects = &m_Subobjects[0];
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_GENERIC_PROGRAM;
- }
- operator const D3D12_GENERIC_PROGRAM_DESC& () const noexcept { return m_Desc; }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- m_Desc = {};
- }
- void* Data() noexcept override { return &m_Desc; }
- D3D12_GENERIC_PROGRAM_DESC m_Desc;
- std::vector<LPCWSTR> m_Exports;
- std::vector<D3D12_STATE_SUBOBJECT const*> m_Subobjects;
- CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring> m_Strings;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_NODE_OUTPUT_OVERRIDES
- {
- public:
- CD3DX12_NODE_OUTPUT_OVERRIDES(const D3D12_NODE_OUTPUT_OVERRIDES** ppOwner, UINT* pNumOutputOverrides) noexcept
- {
- m_Desc.clear();
- m_ppOwner = ppOwner;
- *m_ppOwner = nullptr;
- m_pNumOutputOverrides = pNumOutputOverrides;
- *m_pNumOutputOverrides = 0;
- }
- void NewOutputOverride()
- {
- m_Desc.emplace_back(D3D12_NODE_OUTPUT_OVERRIDES{});
- *m_ppOwner = m_Desc.data();
- (*m_pNumOutputOverrides)++;
- }
- void OutputIndex(UINT index)
- {
- m_Desc.back().OutputIndex = index;
- }
- void NewName(LPCWSTR Name, UINT ArrayIndex = 0)
- {
- m_NodeIDs.emplace_front(D3D12_NODE_ID{ m_Strings.LocalCopy(Name),ArrayIndex });
- m_Desc.back().pNewName = &m_NodeIDs.front();
- }
- void AllowSparseNodes(BOOL bAllow)
- {
- m_UINTs.emplace_front((UINT)bAllow);
- m_Desc.back().pAllowSparseNodes = (BOOL*)&m_UINTs.front();
- }
- void MaxOutputRecords(UINT maxOutputRecords) noexcept
- {
- m_UINTs.emplace_front(maxOutputRecords);
- m_Desc.back().pMaxRecords = &m_UINTs.front();
- }
- void MaxOutputRecordsSharedWith(UINT outputIndex) noexcept
- {
- m_UINTs.emplace_front(outputIndex);
- m_Desc.back().pMaxRecordsSharedWithOutputIndex = &m_UINTs.front();
- }
- private:
- std::vector<D3D12_NODE_OUTPUT_OVERRIDES> m_Desc;
- // Cached parameters
- CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring> m_Strings;
- std::forward_list<UINT> m_UINTs;
- std::forward_list<D3D12_NODE_ID> m_NodeIDs;
- const D3D12_NODE_OUTPUT_OVERRIDES** m_ppOwner;
- UINT* m_pNumOutputOverrides;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_WORK_GRAPH_SUBOBJECT;
- //------------------------------------------------------------------------------------------------
- class CD3DX12_NODE_HELPER_BASE
- {
- protected:
- struct Backreference
- {
- CD3DX12_WORK_GRAPH_SUBOBJECT *m_pGraph;
- UINT m_NodeIndex;
- };
- public:
- CD3DX12_NODE_HELPER_BASE(const Backreference &BackRef)
- : m_BackRef(BackRef)
- {
- }
- virtual ~CD3DX12_NODE_HELPER_BASE() = default;
- protected:
- D3D12_NODE *GetNode() const;
- const Backreference m_BackRef;
- CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring> m_Strings;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_SHADER_NODE // Not specifying launch mode.
- // Don't need to distinguish if no parameter overriding is happening
- : public CD3DX12_NODE_HELPER_BASE
- {
- public:
- CD3DX12_SHADER_NODE(
- const Backreference &BackRef,
- LPCWSTR _Shader = nullptr)
- : CD3DX12_NODE_HELPER_BASE(BackRef)
- {
- GetNode()->NodeType = D3D12_NODE_TYPE_SHADER;
- Shader(_Shader);
- }
- void Shader(LPCWSTR _Shader)
- {
- GetNode()->Shader.Shader = m_Strings.LocalCopy(_Shader);
- }
- LPCWSTR GetShaderName() const { return GetNode()->Shader.Shader; }
- };
- //------------------------------------------------------------------------------------------------
- // Use this class when defining a broadcasting launch node where configuration parameters
- // need to be overridden. If overrides are not needed, just use CD3DX12_COMPUTE_SHADER_NODE
- class CD3DX12_BROADCASTING_LAUNCH_NODE_OVERRIDES
- : public CD3DX12_NODE_HELPER_BASE
- {
- public:
- CD3DX12_BROADCASTING_LAUNCH_NODE_OVERRIDES(
- const Backreference &BackRef,
- LPCWSTR _Shader = nullptr) :
- CD3DX12_NODE_HELPER_BASE(BackRef),
- m_NodeOutputOverrides(&Overrides.pOutputOverrides, &Overrides.NumOutputOverrides)
- {
- Overrides = {};
- D3D12_NODE *pNode = GetNode();
- pNode->NodeType = D3D12_NODE_TYPE_SHADER;
- pNode->Shader.OverridesType = D3D12_NODE_OVERRIDES_TYPE_BROADCASTING_LAUNCH;
- pNode->Shader.pBroadcastingLaunchOverrides = &Overrides;
- Shader(_Shader);
- }
- void Shader(LPCWSTR _Shader)
- {
- GetNode()->Shader.Shader = m_Strings.LocalCopy(_Shader);
- }
- LPCWSTR GetShaderName() const { return GetNode()->Shader.Shader; }
- void LocalRootArgumentsTableIndex(UINT index)
- {
- m_UINTs.emplace_front(index);
- Overrides.pLocalRootArgumentsTableIndex = &m_UINTs.front();
- }
- void ProgramEntry(BOOL bIsProgramEntry)
- {
- m_UINTs.emplace_front(bIsProgramEntry);
- Overrides.pProgramEntry = (BOOL*)&m_UINTs.front();
- }
- void NewName(D3D12_NODE_ID NodeID)
- {
- m_NodeIDs.emplace_front(D3D12_NODE_ID{ m_Strings.LocalCopy(NodeID.Name),NodeID.ArrayIndex });
- Overrides.pNewName = &m_NodeIDs.front();
- }
- void ShareInputOf(D3D12_NODE_ID NodeID)
- {
- m_NodeIDs.emplace_front(D3D12_NODE_ID{ m_Strings.LocalCopy(NodeID.Name),NodeID.ArrayIndex });
- Overrides.pShareInputOf = &m_NodeIDs.front();
- }
- void DispatchGrid(UINT x, UINT y, UINT z)
- {
- m_UINT3s.emplace_front(UINT3{ x,y,z });
- Overrides.pDispatchGrid = (UINT*)&m_UINT3s.front();
- }
- void MaxDispatchGrid(UINT x, UINT y, UINT z)
- {
- m_UINT3s.emplace_front(UINT3{x,y,z});
- Overrides.pMaxDispatchGrid = (UINT*)&m_UINT3s.front();
- }
- CD3DX12_NODE_OUTPUT_OVERRIDES& NodeOutputOverrides()
- {
- return m_NodeOutputOverrides;
- }
- D3D12_BROADCASTING_LAUNCH_OVERRIDES Overrides;
- private:
- // Cached parameters
- std::forward_list<UINT> m_UINTs;
- struct UINT3
- {
- UINT x;
- UINT y;
- UINT z;
- };
- std::forward_list<UINT3> m_UINT3s;
- std::forward_list<D3D12_NODE_ID> m_NodeIDs;
- CD3DX12_NODE_OUTPUT_OVERRIDES m_NodeOutputOverrides;
- };
- //------------------------------------------------------------------------------------------------
- // Use this class when defining a coalescing launch node where configuration parameters
- // need to be overridden. If overrides are not needed, just use CD3DX12_COMPUTE_SHADER_NODE
- class CD3DX12_COALESCING_LAUNCH_NODE_OVERRIDES
- : public CD3DX12_NODE_HELPER_BASE
- {
- public:
- CD3DX12_COALESCING_LAUNCH_NODE_OVERRIDES(
- const Backreference &BackRef,
- LPCWSTR _Shader = nullptr) :
- CD3DX12_NODE_HELPER_BASE(BackRef),
- m_NodeOutputOverrides(&Overrides.pOutputOverrides, &Overrides.NumOutputOverrides)
- {
- Overrides = {};
- D3D12_NODE *pNode = GetNode();
- pNode->NodeType = D3D12_NODE_TYPE_SHADER;
- pNode->Shader.OverridesType = D3D12_NODE_OVERRIDES_TYPE_COALESCING_LAUNCH;
- pNode->Shader.pCoalescingLaunchOverrides = &Overrides;
- Shader(_Shader);
- }
- void Shader(LPCWSTR _Shader)
- {
- GetNode()->Shader.Shader = m_Strings.LocalCopy(_Shader);
- }
- LPCWSTR GetShaderName() const { return GetNode()->Shader.Shader; }
- void LocalRootArgumentsTableIndex(UINT index)
- {
- m_UINTs.emplace_front(index);
- Overrides.pLocalRootArgumentsTableIndex = &m_UINTs.front();
- }
- void ProgramEntry(BOOL bIsProgramEntry)
- {
- m_UINTs.emplace_front(bIsProgramEntry);
- Overrides.pProgramEntry = (BOOL*)&m_UINTs.front();
- }
- void NewName(D3D12_NODE_ID NodeID)
- {
- m_NodeIDs.emplace_front(D3D12_NODE_ID{ m_Strings.LocalCopy(NodeID.Name),NodeID.ArrayIndex });
- Overrides.pNewName = &m_NodeIDs.front();
- }
- void ShareInputOf(D3D12_NODE_ID NodeID)
- {
- m_NodeIDs.emplace_front(D3D12_NODE_ID{ m_Strings.LocalCopy(NodeID.Name),NodeID.ArrayIndex });
- Overrides.pShareInputOf = &m_NodeIDs.front();
- }
- CD3DX12_NODE_OUTPUT_OVERRIDES& NodeOutputOverrides()
- {
- return m_NodeOutputOverrides;
- }
- D3D12_COALESCING_LAUNCH_OVERRIDES Overrides;
- private:
- // Cached parameters
- std::forward_list<UINT> m_UINTs;
- struct UINT3
- {
- UINT x;
- UINT y;
- UINT z;
- };
- std::forward_list<UINT3> m_UINT3s;
- std::forward_list<D3D12_NODE_ID> m_NodeIDs;
- CD3DX12_NODE_OUTPUT_OVERRIDES m_NodeOutputOverrides;
- };
- //------------------------------------------------------------------------------------------------
- // Use this class when defining a thread launch node where configuration parameters
- // need to be overridden. If overrides are not needed, just use CD3DX12_COMPUTE_SHADER_NODE
- class CD3DX12_THREAD_LAUNCH_NODE_OVERRIDES
- : public CD3DX12_NODE_HELPER_BASE
- {
- public:
- CD3DX12_THREAD_LAUNCH_NODE_OVERRIDES(
- const Backreference &BackRef,
- LPCWSTR _Shader = nullptr) :
- CD3DX12_NODE_HELPER_BASE(BackRef),
- m_NodeOutputOverrides(&Overrides.pOutputOverrides, &Overrides.NumOutputOverrides)
- {
- Overrides = {};
- D3D12_NODE *pNode = GetNode();
- pNode->NodeType = D3D12_NODE_TYPE_SHADER;
- pNode->Shader.OverridesType = D3D12_NODE_OVERRIDES_TYPE_THREAD_LAUNCH;
- pNode->Shader.pThreadLaunchOverrides = &Overrides;
- Shader(_Shader);
- }
- void Shader(LPCWSTR _Shader)
- {
- GetNode()->Shader.Shader = m_Strings.LocalCopy(_Shader);
- }
- LPCWSTR GetShaderName() const { return GetNode()->Shader.Shader; }
- void LocalRootArgumentsTableIndex(UINT index)
- {
- m_UINTs.emplace_front(index);
- Overrides.pLocalRootArgumentsTableIndex = &m_UINTs.front();
- }
- void ProgramEntry(BOOL bIsProgramEntry)
- {
- m_UINTs.emplace_front(bIsProgramEntry);
- Overrides.pProgramEntry = (BOOL*)&m_UINTs.front();
- }
- void NewName(D3D12_NODE_ID NodeID)
- {
- m_NodeIDs.emplace_front(D3D12_NODE_ID{ m_Strings.LocalCopy(NodeID.Name),NodeID.ArrayIndex });
- Overrides.pNewName = &m_NodeIDs.front();
- }
- void ShareInputOf(D3D12_NODE_ID NodeID)
- {
- m_NodeIDs.emplace_front(D3D12_NODE_ID{ m_Strings.LocalCopy(NodeID.Name),NodeID.ArrayIndex });
- Overrides.pShareInputOf = &m_NodeIDs.front();
- }
- CD3DX12_NODE_OUTPUT_OVERRIDES& NodeOutputOverrides()
- {
- return m_NodeOutputOverrides;
- }
- D3D12_THREAD_LAUNCH_OVERRIDES Overrides;
- private:
- // Cached parameters
- std::forward_list<UINT> m_UINTs;
- std::forward_list<D3D12_NODE_ID> m_NodeIDs;
- CD3DX12_NODE_OUTPUT_OVERRIDES m_NodeOutputOverrides;
- };
- //------------------------------------------------------------------------------------------------
- // Use this class when defining a node where configuration parameters
- // need to be overridden for parameters that are common to all launch node types.
- // This option is a convenience if you don't want to determine what the launch mode is
- // and just want to override a setting that isn't specific to launch mode.
- // If overrides are not needed, just use CD3DX12_COMPUTE_SHADER_NODE
- class CD3DX12_COMMON_COMPUTE_NODE_OVERRIDES
- : public CD3DX12_NODE_HELPER_BASE
- {
- public:
- CD3DX12_COMMON_COMPUTE_NODE_OVERRIDES(
- const Backreference &BackRef,
- LPCWSTR _Shader = nullptr) :
- CD3DX12_NODE_HELPER_BASE(BackRef),
- m_NodeOutputOverrides(&Overrides.pOutputOverrides, &Overrides.NumOutputOverrides)
- {
- Overrides = {};
- D3D12_NODE *pNode = GetNode();
- pNode->NodeType = D3D12_NODE_TYPE_SHADER;
- pNode->Shader.OverridesType = D3D12_NODE_OVERRIDES_TYPE_COMMON_COMPUTE;
- pNode->Shader.pThreadLaunchOverrides = &Overrides;
- Shader(_Shader);
- }
- void Shader(LPCWSTR _Shader)
- {
- GetNode()->Shader.Shader = m_Strings.LocalCopy(_Shader);
- }
- LPCWSTR GetShaderName() const { return GetNode()->Shader.Shader; }
- void LocalRootArgumentsTableIndex(UINT index)
- {
- m_UINTs.emplace_front(index);
- Overrides.pLocalRootArgumentsTableIndex = &m_UINTs.front();
- }
- void ProgramEntry(BOOL bIsProgramEntry)
- {
- m_UINTs.emplace_front(bIsProgramEntry);
- Overrides.pProgramEntry = (BOOL*)&m_UINTs.front();
- }
- void NewName(D3D12_NODE_ID NodeID)
- {
- m_NodeIDs.emplace_front(D3D12_NODE_ID{ m_Strings.LocalCopy(NodeID.Name),NodeID.ArrayIndex });
- Overrides.pNewName = &m_NodeIDs.front();
- }
- void ShareInputOf(D3D12_NODE_ID NodeID)
- {
- m_NodeIDs.emplace_front(D3D12_NODE_ID{ m_Strings.LocalCopy(NodeID.Name),NodeID.ArrayIndex });
- Overrides.pShareInputOf = &m_NodeIDs.front();
- }
- CD3DX12_NODE_OUTPUT_OVERRIDES& NodeOutputOverrides()
- {
- return m_NodeOutputOverrides;
- }
- D3D12_THREAD_LAUNCH_OVERRIDES Overrides;
- private:
- // Cached parameters
- std::forward_list<UINT> m_UINTs;
- std::forward_list<D3D12_NODE_ID> m_NodeIDs;
- CD3DX12_NODE_OUTPUT_OVERRIDES m_NodeOutputOverrides;
- };
- //------------------------------------------------------------------------------------------------
- class CD3DX12_WORK_GRAPH_SUBOBJECT
- : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
- {
- public:
- CD3DX12_WORK_GRAPH_SUBOBJECT() noexcept
- {
- Init();
- }
- CD3DX12_WORK_GRAPH_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
- {
- Init();
- AddToStateObject(ContainingStateObject);
- }
- D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
- {
- return D3D12_STATE_SUBOBJECT_TYPE_WORK_GRAPH;
- }
- void IncludeAllAvailableNodes()
- {
- m_Desc.Flags |= D3D12_WORK_GRAPH_FLAG_INCLUDE_ALL_AVAILABLE_NODES;
- }
- void SetProgramName(LPCWSTR ProgramName)
- {
- m_Desc.ProgramName = m_Strings.LocalCopy(ProgramName);
- }
- void AddEntrypoint(D3D12_NODE_ID Entrypoint)
- {
- m_Entrypoints.emplace_back(D3D12_NODE_ID{ m_Strings.LocalCopy(Entrypoint.Name),Entrypoint.ArrayIndex });
- m_Desc.NumEntrypoints++;
- m_Desc.pEntrypoints = m_Entrypoints.data();
- }
- template<typename T>
- T* CreateNode()
- {
- m_NodeDescs.push_back({});
- m_Desc.NumExplicitlyDefinedNodes++;
- m_Desc.pExplicitlyDefinedNodes = m_NodeDescs.data();
- T* pNodeHelper = new T({this, (UINT)m_NodeDescs.size() - 1});
- m_OwnedNodeHelpers.emplace_back(pNodeHelper);
- return pNodeHelper;
- }
- CD3DX12_SHADER_NODE* CreateShaderNode(LPCWSTR Shader = nullptr)
- {
- auto pNode = CreateNode<CD3DX12_SHADER_NODE>();
- pNode->Shader(Shader);
- return pNode;
- }
- CD3DX12_BROADCASTING_LAUNCH_NODE_OVERRIDES* CreateBroadcastingLaunchNodeOverrides(LPCWSTR Shader = nullptr)
- {
- auto pNode = CreateNode<CD3DX12_BROADCASTING_LAUNCH_NODE_OVERRIDES>();
- pNode->Shader(Shader);
- return pNode;
- }
- CD3DX12_COALESCING_LAUNCH_NODE_OVERRIDES* CreateCoalescingLaunchNodeOverrides(LPCWSTR Shader = nullptr)
- {
- auto pNode = CreateNode<CD3DX12_COALESCING_LAUNCH_NODE_OVERRIDES>();
- pNode->Shader(Shader);
- return pNode;
- }
- CD3DX12_THREAD_LAUNCH_NODE_OVERRIDES* CreateThreadLaunchNodeOverrides(LPCWSTR Shader = nullptr)
- {
- auto pNode = CreateNode<CD3DX12_THREAD_LAUNCH_NODE_OVERRIDES>();
- pNode->Shader(Shader);
- return pNode;
- }
- CD3DX12_COMMON_COMPUTE_NODE_OVERRIDES* CreateCommonComputeNodeOverrides(LPCWSTR Shader = nullptr)
- {
- auto pNode = CreateNode<CD3DX12_COMMON_COMPUTE_NODE_OVERRIDES>();
- pNode->Shader(Shader);
- return pNode;
- }
- operator const D3D12_WORK_GRAPH_DESC& () noexcept
- {
- return m_Desc;
- }
- private:
- void Init() noexcept
- {
- SUBOBJECT_HELPER_BASE::Init();
- m_Desc = {};
- m_Entrypoints.clear();
- m_NodeDescs.clear();
- }
- void* Data() noexcept override { return &m_Desc; }
- D3D12_WORK_GRAPH_DESC m_Desc;
- std::vector<D3D12_NODE_ID> m_Entrypoints;
- std::vector<D3D12_NODE> m_NodeDescs;
- CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring> m_Strings;
- std::vector<std::unique_ptr<const CD3DX12_NODE_HELPER_BASE>> m_OwnedNodeHelpers;
- friend class CD3DX12_NODE_HELPER_BASE;
- };
- inline D3D12_NODE * CD3DX12_NODE_HELPER_BASE::GetNode() const
- {
- return &m_BackRef.m_pGraph->m_NodeDescs[m_BackRef.m_NodeIndex];
- }
- #endif // D3D12_SDK_VERSION >= 612
- #undef D3DX12_COM_PTR
- #undef D3DX12_COM_PTR_GET
- #undef D3DX12_COM_PTR_ADDRESSOF
|