Path: blob/master/thirdparty/directx_headers/include/directx/d3dx12_pipeline_state_stream.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"14#include "d3dx12_default.h"15#include "d3dx12_core.h"1617//------------------------------------------------------------------------------------------------18// Pipeline State Stream Helpers19//------------------------------------------------------------------------------------------------2021//------------------------------------------------------------------------------------------------22// Stream Subobjects, i.e. elements of a stream2324struct DefaultSampleMask { operator UINT() noexcept { return UINT_MAX; } };25struct DefaultSampleDesc { operator DXGI_SAMPLE_DESC() noexcept { return DXGI_SAMPLE_DESC{1, 0}; } };2627#if defined(_MSC_VER)28#pragma warning(push)29#pragma warning(disable : 4324)30#endif31template <typename InnerStructType, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE Type, typename DefaultArg = InnerStructType>32class alignas(void*) CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT33{34private:35D3D12_PIPELINE_STATE_SUBOBJECT_TYPE pssType;36InnerStructType pssInner;37public:38CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT() noexcept : pssType(Type), pssInner(DefaultArg()) {}39CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT(InnerStructType const& i) noexcept : pssType(Type), pssInner(i) {}40CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT& operator=(InnerStructType const& i) noexcept { pssType = Type; pssInner = i; return *this; }41operator InnerStructType const&() const noexcept { return pssInner; }42operator InnerStructType&() noexcept { return pssInner; }43InnerStructType* operator&() noexcept { return &pssInner; }44InnerStructType const* operator&() const noexcept { return &pssInner; }45};46#if defined(_MSC_VER)47#pragma warning(pop)48#endif49typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_PIPELINE_STATE_FLAGS, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_FLAGS> CD3DX12_PIPELINE_STATE_STREAM_FLAGS;50typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< UINT, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_NODE_MASK> CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK;51typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< ID3D12RootSignature*, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_ROOT_SIGNATURE> CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE;52typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_INPUT_LAYOUT_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_INPUT_LAYOUT> CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT;53typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_INDEX_BUFFER_STRIP_CUT_VALUE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_IB_STRIP_CUT_VALUE> CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE;54typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_PRIMITIVE_TOPOLOGY_TYPE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY> CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY;55typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VS> CD3DX12_PIPELINE_STATE_STREAM_VS;56typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_GS> CD3DX12_PIPELINE_STATE_STREAM_GS;57typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_STREAM_OUTPUT_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_STREAM_OUTPUT> CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT;58typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_HS> CD3DX12_PIPELINE_STATE_STREAM_HS;59typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DS> CD3DX12_PIPELINE_STATE_STREAM_DS;60typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PS> CD3DX12_PIPELINE_STATE_STREAM_PS;61typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_AS> CD3DX12_PIPELINE_STATE_STREAM_AS;62typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MS> CD3DX12_PIPELINE_STATE_STREAM_MS;63typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CS> CD3DX12_PIPELINE_STATE_STREAM_CS;64typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_BLEND_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_BLEND, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC;65typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_DEPTH_STENCIL_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL;66typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_DEPTH_STENCIL_DESC1, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL1, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1;67#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)68typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_DEPTH_STENCIL_DESC2, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL2, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL2;69#endif70typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< DXGI_FORMAT, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL_FORMAT> CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT;71typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_RASTERIZER_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER;72#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)73typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_RASTERIZER_DESC1, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER1, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER1;74#endif75#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)76typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_RASTERIZER_DESC2, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER2, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER2;77#endif78typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_RT_FORMAT_ARRAY, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RENDER_TARGET_FORMATS> CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS;79typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< DXGI_SAMPLE_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_DESC, DefaultSampleDesc> CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC;80typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< UINT, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_MASK, DefaultSampleMask> CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK;81typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_CACHED_PIPELINE_STATE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CACHED_PSO> CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO;82typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_VIEW_INSTANCING_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VIEW_INSTANCING, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING;8384//------------------------------------------------------------------------------------------------85// Stream Parser Helpers8687struct ID3DX12PipelineParserCallbacks88{89// Subobject Callbacks90virtual void FlagsCb(D3D12_PIPELINE_STATE_FLAGS) {}91virtual void NodeMaskCb(UINT) {}92virtual void RootSignatureCb(ID3D12RootSignature*) {}93virtual void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC&) {}94virtual void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE) {}95virtual void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE) {}96virtual void VSCb(const D3D12_SHADER_BYTECODE&) {}97virtual void GSCb(const D3D12_SHADER_BYTECODE&) {}98virtual void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC&) {}99virtual void HSCb(const D3D12_SHADER_BYTECODE&) {}100virtual void DSCb(const D3D12_SHADER_BYTECODE&) {}101virtual void PSCb(const D3D12_SHADER_BYTECODE&) {}102virtual void CSCb(const D3D12_SHADER_BYTECODE&) {}103virtual void ASCb(const D3D12_SHADER_BYTECODE&) {}104virtual void MSCb(const D3D12_SHADER_BYTECODE&) {}105virtual void BlendStateCb(const D3D12_BLEND_DESC&) {}106virtual void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC&) {}107virtual void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1&) {}108#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)109virtual void DepthStencilState2Cb(const D3D12_DEPTH_STENCIL_DESC2&) {}110#endif111virtual void DSVFormatCb(DXGI_FORMAT) {}112virtual void RasterizerStateCb(const D3D12_RASTERIZER_DESC&) {}113#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)114virtual void RasterizerState1Cb(const D3D12_RASTERIZER_DESC1&) {}115#endif116#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)117virtual void RasterizerState2Cb(const D3D12_RASTERIZER_DESC2&) {}118#endif119virtual void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY&) {}120virtual void SampleDescCb(const DXGI_SAMPLE_DESC&) {}121virtual void SampleMaskCb(UINT) {}122virtual void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC&) {}123virtual void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE&) {}124125// Error Callbacks126virtual void ErrorBadInputParameter(UINT /*ParameterIndex*/) {}127virtual void ErrorDuplicateSubobject(D3D12_PIPELINE_STATE_SUBOBJECT_TYPE /*DuplicateType*/) {}128virtual void ErrorUnknownSubobject(UINT /*UnknownTypeValue*/) {}129130virtual ~ID3DX12PipelineParserCallbacks() = default;131};132133struct D3DX12_MESH_SHADER_PIPELINE_STATE_DESC134{135ID3D12RootSignature* pRootSignature;136D3D12_SHADER_BYTECODE AS;137D3D12_SHADER_BYTECODE MS;138D3D12_SHADER_BYTECODE PS;139D3D12_BLEND_DESC BlendState;140UINT SampleMask;141D3D12_RASTERIZER_DESC RasterizerState;142D3D12_DEPTH_STENCIL_DESC DepthStencilState;143D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType;144UINT NumRenderTargets;145DXGI_FORMAT RTVFormats[ D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT ];146DXGI_FORMAT DSVFormat;147DXGI_SAMPLE_DESC SampleDesc;148UINT NodeMask;149D3D12_CACHED_PIPELINE_STATE CachedPSO;150D3D12_PIPELINE_STATE_FLAGS Flags;151};152153#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)154// Use CD3DX12_PIPELINE_STATE_STREAM5 for D3D12_RASTERIZER_DESC2 when CheckFeatureSupport returns true for Options19::RasterizerDesc2Supported is true155// Use CD3DX12_PIPELINE_STATE_STREAM4 for D3D12_RASTERIZER_DESC1 when CheckFeatureSupport returns true for Options16::DynamicDepthBiasSupported is true156// Use CD3DX12_PIPELINE_STATE_STREAM3 for D3D12_DEPTH_STENCIL_DESC2 when CheckFeatureSupport returns true for Options14::IndependentFrontAndBackStencilSupported is true157// Use CD3DX12_PIPELINE_STATE_STREAM2 for OS Build 19041+ (where there is a new mesh shader pipeline).158// Use CD3DX12_PIPELINE_STATE_STREAM1 for OS Build 16299+ (where there is a new view instancing subobject).159// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.160struct CD3DX12_PIPELINE_STATE_STREAM5161{162CD3DX12_PIPELINE_STATE_STREAM5() = default;163// Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC164CD3DX12_PIPELINE_STATE_STREAM5(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept165: Flags(Desc.Flags)166, NodeMask(Desc.NodeMask)167, pRootSignature(Desc.pRootSignature)168, InputLayout(Desc.InputLayout)169, IBStripCutValue(Desc.IBStripCutValue)170, PrimitiveTopologyType(Desc.PrimitiveTopologyType)171, VS(Desc.VS)172, GS(Desc.GS)173, StreamOutput(Desc.StreamOutput)174, HS(Desc.HS)175, DS(Desc.DS)176, PS(Desc.PS)177, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))178, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))179, DSVFormat(Desc.DSVFormat)180, RasterizerState(CD3DX12_RASTERIZER_DESC2(Desc.RasterizerState))181, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))182, SampleDesc(Desc.SampleDesc)183, SampleMask(Desc.SampleMask)184, CachedPSO(Desc.CachedPSO)185, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))186{}187CD3DX12_PIPELINE_STATE_STREAM5(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept188: Flags(Desc.Flags)189, NodeMask(Desc.NodeMask)190, pRootSignature(Desc.pRootSignature)191, PrimitiveTopologyType(Desc.PrimitiveTopologyType)192, PS(Desc.PS)193, AS(Desc.AS)194, MS(Desc.MS)195, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))196, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))197, DSVFormat(Desc.DSVFormat)198, RasterizerState(CD3DX12_RASTERIZER_DESC2(Desc.RasterizerState))199, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))200, SampleDesc(Desc.SampleDesc)201, SampleMask(Desc.SampleMask)202, CachedPSO(Desc.CachedPSO)203, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))204{}205CD3DX12_PIPELINE_STATE_STREAM5(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept206: Flags(Desc.Flags)207, NodeMask(Desc.NodeMask)208, pRootSignature(Desc.pRootSignature)209, CS(CD3DX12_SHADER_BYTECODE(Desc.CS))210, CachedPSO(Desc.CachedPSO)211{212static_cast<D3D12_DEPTH_STENCIL_DESC2&>(DepthStencilState).DepthEnable = false;213}214CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;215CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;216CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;217CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;218CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;219CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;220CD3DX12_PIPELINE_STATE_STREAM_VS VS;221CD3DX12_PIPELINE_STATE_STREAM_GS GS;222CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;223CD3DX12_PIPELINE_STATE_STREAM_HS HS;224CD3DX12_PIPELINE_STATE_STREAM_DS DS;225CD3DX12_PIPELINE_STATE_STREAM_PS PS;226CD3DX12_PIPELINE_STATE_STREAM_AS AS;227CD3DX12_PIPELINE_STATE_STREAM_MS MS;228CD3DX12_PIPELINE_STATE_STREAM_CS CS;229CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;230CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL2 DepthStencilState;231CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;232CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER2 RasterizerState;233CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;234CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;235CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;236CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;237CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;238239D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept240{241D3D12_GRAPHICS_PIPELINE_STATE_DESC D;242D.Flags = this->Flags;243D.NodeMask = this->NodeMask;244D.pRootSignature = this->pRootSignature;245D.InputLayout = this->InputLayout;246D.IBStripCutValue = this->IBStripCutValue;247D.PrimitiveTopologyType = this->PrimitiveTopologyType;248D.VS = this->VS;249D.GS = this->GS;250D.StreamOutput = this->StreamOutput;251D.HS = this->HS;252D.DS = this->DS;253D.PS = this->PS;254D.BlendState = this->BlendState;255D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(D3D12_DEPTH_STENCIL_DESC2(this->DepthStencilState));256D.DSVFormat = this->DSVFormat;257D.RasterizerState = CD3DX12_RASTERIZER_DESC2(D3D12_RASTERIZER_DESC2(this->RasterizerState));258D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;259memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));260D.SampleDesc = this->SampleDesc;261D.SampleMask = this->SampleMask;262D.CachedPSO = this->CachedPSO;263return D;264}265D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept266{267D3D12_COMPUTE_PIPELINE_STATE_DESC D;268D.Flags = this->Flags;269D.NodeMask = this->NodeMask;270D.pRootSignature = this->pRootSignature;271D.CS = this->CS;272D.CachedPSO = this->CachedPSO;273return D;274}275};276#endif // D3D12_SDK_VERSION >= 610277278#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)279// Use CD3DX12_PIPELINE_STATE_STREAM4 for D3D12_RASTERIZER_DESC1 when CheckFeatureSupport returns true for Options16::DynamicDepthBiasSupported is true280// Use CD3DX12_PIPELINE_STATE_STREAM3 for D3D12_DEPTH_STENCIL_DESC2 when CheckFeatureSupport returns true for Options14::IndependentFrontAndBackStencilSupported is true281// Use CD3DX12_PIPELINE_STATE_STREAM2 for OS Build 19041+ (where there is a new mesh shader pipeline).282// Use CD3DX12_PIPELINE_STATE_STREAM1 for OS Build 16299+ (where there is a new view instancing subobject).283// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.284struct CD3DX12_PIPELINE_STATE_STREAM4285{286CD3DX12_PIPELINE_STATE_STREAM4() = default;287// Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC288CD3DX12_PIPELINE_STATE_STREAM4(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept289: Flags(Desc.Flags)290, NodeMask(Desc.NodeMask)291, pRootSignature(Desc.pRootSignature)292, InputLayout(Desc.InputLayout)293, IBStripCutValue(Desc.IBStripCutValue)294, PrimitiveTopologyType(Desc.PrimitiveTopologyType)295, VS(Desc.VS)296, GS(Desc.GS)297, StreamOutput(Desc.StreamOutput)298, HS(Desc.HS)299, DS(Desc.DS)300, PS(Desc.PS)301, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))302, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))303, DSVFormat(Desc.DSVFormat)304, RasterizerState(CD3DX12_RASTERIZER_DESC1(Desc.RasterizerState))305, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))306, SampleDesc(Desc.SampleDesc)307, SampleMask(Desc.SampleMask)308, CachedPSO(Desc.CachedPSO)309, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))310{}311CD3DX12_PIPELINE_STATE_STREAM4(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept312: Flags(Desc.Flags)313, NodeMask(Desc.NodeMask)314, pRootSignature(Desc.pRootSignature)315, PrimitiveTopologyType(Desc.PrimitiveTopologyType)316, PS(Desc.PS)317, AS(Desc.AS)318, MS(Desc.MS)319, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))320, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))321, DSVFormat(Desc.DSVFormat)322, RasterizerState(CD3DX12_RASTERIZER_DESC1(Desc.RasterizerState))323, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))324, SampleDesc(Desc.SampleDesc)325, SampleMask(Desc.SampleMask)326, CachedPSO(Desc.CachedPSO)327, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))328{}329CD3DX12_PIPELINE_STATE_STREAM4(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept330: Flags(Desc.Flags)331, NodeMask(Desc.NodeMask)332, pRootSignature(Desc.pRootSignature)333, CS(CD3DX12_SHADER_BYTECODE(Desc.CS))334, CachedPSO(Desc.CachedPSO)335{336static_cast<D3D12_DEPTH_STENCIL_DESC2&>(DepthStencilState).DepthEnable = false;337}338CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;339CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;340CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;341CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;342CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;343CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;344CD3DX12_PIPELINE_STATE_STREAM_VS VS;345CD3DX12_PIPELINE_STATE_STREAM_GS GS;346CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;347CD3DX12_PIPELINE_STATE_STREAM_HS HS;348CD3DX12_PIPELINE_STATE_STREAM_DS DS;349CD3DX12_PIPELINE_STATE_STREAM_PS PS;350CD3DX12_PIPELINE_STATE_STREAM_AS AS;351CD3DX12_PIPELINE_STATE_STREAM_MS MS;352CD3DX12_PIPELINE_STATE_STREAM_CS CS;353CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;354CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL2 DepthStencilState;355CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;356CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER1 RasterizerState;357CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;358CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;359CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;360CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;361CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;362363D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept364{365D3D12_GRAPHICS_PIPELINE_STATE_DESC D;366D.Flags = this->Flags;367D.NodeMask = this->NodeMask;368D.pRootSignature = this->pRootSignature;369D.InputLayout = this->InputLayout;370D.IBStripCutValue = this->IBStripCutValue;371D.PrimitiveTopologyType = this->PrimitiveTopologyType;372D.VS = this->VS;373D.GS = this->GS;374D.StreamOutput = this->StreamOutput;375D.HS = this->HS;376D.DS = this->DS;377D.PS = this->PS;378D.BlendState = this->BlendState;379D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(D3D12_DEPTH_STENCIL_DESC2(this->DepthStencilState));380D.DSVFormat = this->DSVFormat;381D.RasterizerState = CD3DX12_RASTERIZER_DESC1(D3D12_RASTERIZER_DESC1(this->RasterizerState));382D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;383memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));384D.SampleDesc = this->SampleDesc;385D.SampleMask = this->SampleMask;386D.CachedPSO = this->CachedPSO;387return D;388}389D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept390{391D3D12_COMPUTE_PIPELINE_STATE_DESC D;392D.Flags = this->Flags;393D.NodeMask = this->NodeMask;394D.pRootSignature = this->pRootSignature;395D.CS = this->CS;396D.CachedPSO = this->CachedPSO;397return D;398}399};400#endif // D3D12_SDK_VERSION >= 608401402#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)403// Use CD3DX12_PIPELINE_STATE_STREAM3 for D3D12_DEPTH_STENCIL_DESC2 when CheckFeatureSupport returns true for Options14::IndependentFrontAndBackStencilSupported is true404// Use CD3DX12_PIPELINE_STATE_STREAM2 for OS Build 19041+ (where there is a new mesh shader pipeline).405// Use CD3DX12_PIPELINE_STATE_STREAM1 for OS Build 16299+ (where there is a new view instancing subobject).406// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.407struct CD3DX12_PIPELINE_STATE_STREAM3408{409CD3DX12_PIPELINE_STATE_STREAM3() = default;410// Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC411CD3DX12_PIPELINE_STATE_STREAM3(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept412: Flags(Desc.Flags)413, NodeMask(Desc.NodeMask)414, pRootSignature(Desc.pRootSignature)415, InputLayout(Desc.InputLayout)416, IBStripCutValue(Desc.IBStripCutValue)417, PrimitiveTopologyType(Desc.PrimitiveTopologyType)418, VS(Desc.VS)419, GS(Desc.GS)420, StreamOutput(Desc.StreamOutput)421, HS(Desc.HS)422, DS(Desc.DS)423, PS(Desc.PS)424, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))425, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))426, DSVFormat(Desc.DSVFormat)427, RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))428, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))429, SampleDesc(Desc.SampleDesc)430, SampleMask(Desc.SampleMask)431, CachedPSO(Desc.CachedPSO)432, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))433{}434CD3DX12_PIPELINE_STATE_STREAM3(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept435: Flags(Desc.Flags)436, NodeMask(Desc.NodeMask)437, pRootSignature(Desc.pRootSignature)438, PrimitiveTopologyType(Desc.PrimitiveTopologyType)439, PS(Desc.PS)440, AS(Desc.AS)441, MS(Desc.MS)442, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))443, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))444, DSVFormat(Desc.DSVFormat)445, RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))446, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))447, SampleDesc(Desc.SampleDesc)448, SampleMask(Desc.SampleMask)449, CachedPSO(Desc.CachedPSO)450, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))451{}452CD3DX12_PIPELINE_STATE_STREAM3(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept453: Flags(Desc.Flags)454, NodeMask(Desc.NodeMask)455, pRootSignature(Desc.pRootSignature)456, CS(CD3DX12_SHADER_BYTECODE(Desc.CS))457, CachedPSO(Desc.CachedPSO)458{459static_cast<D3D12_DEPTH_STENCIL_DESC2&>(DepthStencilState).DepthEnable = false;460}461CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;462CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;463CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;464CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;465CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;466CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;467CD3DX12_PIPELINE_STATE_STREAM_VS VS;468CD3DX12_PIPELINE_STATE_STREAM_GS GS;469CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;470CD3DX12_PIPELINE_STATE_STREAM_HS HS;471CD3DX12_PIPELINE_STATE_STREAM_DS DS;472CD3DX12_PIPELINE_STATE_STREAM_PS PS;473CD3DX12_PIPELINE_STATE_STREAM_AS AS;474CD3DX12_PIPELINE_STATE_STREAM_MS MS;475CD3DX12_PIPELINE_STATE_STREAM_CS CS;476CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;477CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL2 DepthStencilState;478CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;479CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;480CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;481CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;482CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;483CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;484CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;485486D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept487{488D3D12_GRAPHICS_PIPELINE_STATE_DESC D;489D.Flags = this->Flags;490D.NodeMask = this->NodeMask;491D.pRootSignature = this->pRootSignature;492D.InputLayout = this->InputLayout;493D.IBStripCutValue = this->IBStripCutValue;494D.PrimitiveTopologyType = this->PrimitiveTopologyType;495D.VS = this->VS;496D.GS = this->GS;497D.StreamOutput = this->StreamOutput;498D.HS = this->HS;499D.DS = this->DS;500D.PS = this->PS;501D.BlendState = this->BlendState;502D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(D3D12_DEPTH_STENCIL_DESC2(this->DepthStencilState));503D.DSVFormat = this->DSVFormat;504D.RasterizerState = this->RasterizerState;505D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;506memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));507D.SampleDesc = this->SampleDesc;508D.SampleMask = this->SampleMask;509D.CachedPSO = this->CachedPSO;510return D;511}512D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept513{514D3D12_COMPUTE_PIPELINE_STATE_DESC D;515D.Flags = this->Flags;516D.NodeMask = this->NodeMask;517D.pRootSignature = this->pRootSignature;518D.CS = this->CS;519D.CachedPSO = this->CachedPSO;520return D;521}522};523#endif // D3D12_SDK_VERSION >= 606524525// CD3DX12_PIPELINE_STATE_STREAM2 Works on OS Build 19041+ (where there is a new mesh shader pipeline).526// Use CD3DX12_PIPELINE_STATE_STREAM1 for OS Build 16299+ (where there is a new view instancing subobject).527// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.528struct CD3DX12_PIPELINE_STATE_STREAM2529{530CD3DX12_PIPELINE_STATE_STREAM2() = default;531// Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC532CD3DX12_PIPELINE_STATE_STREAM2(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept533: Flags(Desc.Flags)534, NodeMask(Desc.NodeMask)535, pRootSignature(Desc.pRootSignature)536, InputLayout(Desc.InputLayout)537, IBStripCutValue(Desc.IBStripCutValue)538, PrimitiveTopologyType(Desc.PrimitiveTopologyType)539, VS(Desc.VS)540, GS(Desc.GS)541, StreamOutput(Desc.StreamOutput)542, HS(Desc.HS)543, DS(Desc.DS)544, PS(Desc.PS)545, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))546, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))547, DSVFormat(Desc.DSVFormat)548, RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))549, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))550, SampleDesc(Desc.SampleDesc)551, SampleMask(Desc.SampleMask)552, CachedPSO(Desc.CachedPSO)553, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))554{}555CD3DX12_PIPELINE_STATE_STREAM2(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept556: Flags(Desc.Flags)557, NodeMask(Desc.NodeMask)558, pRootSignature(Desc.pRootSignature)559, PrimitiveTopologyType(Desc.PrimitiveTopologyType)560, PS(Desc.PS)561, AS(Desc.AS)562, MS(Desc.MS)563, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))564, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))565, DSVFormat(Desc.DSVFormat)566, RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))567, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))568, SampleDesc(Desc.SampleDesc)569, SampleMask(Desc.SampleMask)570, CachedPSO(Desc.CachedPSO)571, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))572{}573CD3DX12_PIPELINE_STATE_STREAM2(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept574: Flags(Desc.Flags)575, NodeMask(Desc.NodeMask)576, pRootSignature(Desc.pRootSignature)577, CS(CD3DX12_SHADER_BYTECODE(Desc.CS))578, CachedPSO(Desc.CachedPSO)579{580static_cast<D3D12_DEPTH_STENCIL_DESC1&>(DepthStencilState).DepthEnable = false;581}582CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;583CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;584CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;585CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;586CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;587CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;588CD3DX12_PIPELINE_STATE_STREAM_VS VS;589CD3DX12_PIPELINE_STATE_STREAM_GS GS;590CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;591CD3DX12_PIPELINE_STATE_STREAM_HS HS;592CD3DX12_PIPELINE_STATE_STREAM_DS DS;593CD3DX12_PIPELINE_STATE_STREAM_PS PS;594CD3DX12_PIPELINE_STATE_STREAM_AS AS;595CD3DX12_PIPELINE_STATE_STREAM_MS MS;596CD3DX12_PIPELINE_STATE_STREAM_CS CS;597CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;598CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState;599CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;600CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;601CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;602CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;603CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;604CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;605CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;606D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept607{608D3D12_GRAPHICS_PIPELINE_STATE_DESC D;609D.Flags = this->Flags;610D.NodeMask = this->NodeMask;611D.pRootSignature = this->pRootSignature;612D.InputLayout = this->InputLayout;613D.IBStripCutValue = this->IBStripCutValue;614D.PrimitiveTopologyType = this->PrimitiveTopologyType;615D.VS = this->VS;616D.GS = this->GS;617D.StreamOutput = this->StreamOutput;618D.HS = this->HS;619D.DS = this->DS;620D.PS = this->PS;621D.BlendState = this->BlendState;622D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState));623D.DSVFormat = this->DSVFormat;624D.RasterizerState = this->RasterizerState;625D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;626memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));627D.SampleDesc = this->SampleDesc;628D.SampleMask = this->SampleMask;629D.CachedPSO = this->CachedPSO;630return D;631}632D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept633{634D3D12_COMPUTE_PIPELINE_STATE_DESC D;635D.Flags = this->Flags;636D.NodeMask = this->NodeMask;637D.pRootSignature = this->pRootSignature;638D.CS = this->CS;639D.CachedPSO = this->CachedPSO;640return D;641}642};643644// CD3DX12_PIPELINE_STATE_STREAM1 Works on OS Build 16299+ (where there is a new view instancing subobject).645// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.646struct CD3DX12_PIPELINE_STATE_STREAM1647{648CD3DX12_PIPELINE_STATE_STREAM1() = default;649// Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC650CD3DX12_PIPELINE_STATE_STREAM1(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept651: Flags(Desc.Flags)652, NodeMask(Desc.NodeMask)653, pRootSignature(Desc.pRootSignature)654, InputLayout(Desc.InputLayout)655, IBStripCutValue(Desc.IBStripCutValue)656, PrimitiveTopologyType(Desc.PrimitiveTopologyType)657, VS(Desc.VS)658, GS(Desc.GS)659, StreamOutput(Desc.StreamOutput)660, HS(Desc.HS)661, DS(Desc.DS)662, PS(Desc.PS)663, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))664, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))665, DSVFormat(Desc.DSVFormat)666, RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))667, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))668, SampleDesc(Desc.SampleDesc)669, SampleMask(Desc.SampleMask)670, CachedPSO(Desc.CachedPSO)671, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))672{}673CD3DX12_PIPELINE_STATE_STREAM1(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept674: Flags(Desc.Flags)675, NodeMask(Desc.NodeMask)676, pRootSignature(Desc.pRootSignature)677, PrimitiveTopologyType(Desc.PrimitiveTopologyType)678, PS(Desc.PS)679, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))680, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))681, DSVFormat(Desc.DSVFormat)682, RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))683, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))684, SampleDesc(Desc.SampleDesc)685, SampleMask(Desc.SampleMask)686, CachedPSO(Desc.CachedPSO)687, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))688{}689CD3DX12_PIPELINE_STATE_STREAM1(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept690: Flags(Desc.Flags)691, NodeMask(Desc.NodeMask)692, pRootSignature(Desc.pRootSignature)693, CS(CD3DX12_SHADER_BYTECODE(Desc.CS))694, CachedPSO(Desc.CachedPSO)695{696static_cast<D3D12_DEPTH_STENCIL_DESC1&>(DepthStencilState).DepthEnable = false;697}698CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;699CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;700CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;701CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;702CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;703CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;704CD3DX12_PIPELINE_STATE_STREAM_VS VS;705CD3DX12_PIPELINE_STATE_STREAM_GS GS;706CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;707CD3DX12_PIPELINE_STATE_STREAM_HS HS;708CD3DX12_PIPELINE_STATE_STREAM_DS DS;709CD3DX12_PIPELINE_STATE_STREAM_PS PS;710CD3DX12_PIPELINE_STATE_STREAM_CS CS;711CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;712CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState;713CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;714CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;715CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;716CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;717CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;718CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;719CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;720D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept721{722D3D12_GRAPHICS_PIPELINE_STATE_DESC D;723D.Flags = this->Flags;724D.NodeMask = this->NodeMask;725D.pRootSignature = this->pRootSignature;726D.InputLayout = this->InputLayout;727D.IBStripCutValue = this->IBStripCutValue;728D.PrimitiveTopologyType = this->PrimitiveTopologyType;729D.VS = this->VS;730D.GS = this->GS;731D.StreamOutput = this->StreamOutput;732D.HS = this->HS;733D.DS = this->DS;734D.PS = this->PS;735D.BlendState = this->BlendState;736D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState));737D.DSVFormat = this->DSVFormat;738D.RasterizerState = this->RasterizerState;739D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;740memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));741D.SampleDesc = this->SampleDesc;742D.SampleMask = this->SampleMask;743D.CachedPSO = this->CachedPSO;744return D;745}746D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept747{748D3D12_COMPUTE_PIPELINE_STATE_DESC D;749D.Flags = this->Flags;750D.NodeMask = this->NodeMask;751D.pRootSignature = this->pRootSignature;752D.CS = this->CS;753D.CachedPSO = this->CachedPSO;754return D;755}756};757758759struct CD3DX12_PIPELINE_MESH_STATE_STREAM760{761CD3DX12_PIPELINE_MESH_STATE_STREAM() = default;762CD3DX12_PIPELINE_MESH_STATE_STREAM(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept763: Flags(Desc.Flags)764, NodeMask(Desc.NodeMask)765, pRootSignature(Desc.pRootSignature)766, PS(Desc.PS)767, AS(Desc.AS)768, MS(Desc.MS)769, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))770, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))771, DSVFormat(Desc.DSVFormat)772, RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))773, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))774, SampleDesc(Desc.SampleDesc)775, SampleMask(Desc.SampleMask)776, CachedPSO(Desc.CachedPSO)777, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))778{}779CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;780CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;781CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;782CD3DX12_PIPELINE_STATE_STREAM_PS PS;783CD3DX12_PIPELINE_STATE_STREAM_AS AS;784CD3DX12_PIPELINE_STATE_STREAM_MS MS;785CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;786CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState;787CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;788CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;789CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;790CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;791CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;792CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;793CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;794D3DX12_MESH_SHADER_PIPELINE_STATE_DESC MeshShaderDescV0() const noexcept795{796D3DX12_MESH_SHADER_PIPELINE_STATE_DESC D;797D.Flags = this->Flags;798D.NodeMask = this->NodeMask;799D.pRootSignature = this->pRootSignature;800D.PS = this->PS;801D.AS = this->AS;802D.MS = this->MS;803D.BlendState = this->BlendState;804D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState));805D.DSVFormat = this->DSVFormat;806D.RasterizerState = this->RasterizerState;807D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;808memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));809D.SampleDesc = this->SampleDesc;810D.SampleMask = this->SampleMask;811D.CachedPSO = this->CachedPSO;812return D;813}814};815816// CD3DX12_PIPELINE_STATE_STREAM works on OS Build 15063+ but does not support new subobject(s) added in OS Build 16299+.817// See CD3DX12_PIPELINE_STATE_STREAM1 for instance.818struct CD3DX12_PIPELINE_STATE_STREAM819{820CD3DX12_PIPELINE_STATE_STREAM() = default;821CD3DX12_PIPELINE_STATE_STREAM(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept822: Flags(Desc.Flags)823, NodeMask(Desc.NodeMask)824, pRootSignature(Desc.pRootSignature)825, InputLayout(Desc.InputLayout)826, IBStripCutValue(Desc.IBStripCutValue)827, PrimitiveTopologyType(Desc.PrimitiveTopologyType)828, VS(Desc.VS)829, GS(Desc.GS)830, StreamOutput(Desc.StreamOutput)831, HS(Desc.HS)832, DS(Desc.DS)833, PS(Desc.PS)834, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))835, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))836, DSVFormat(Desc.DSVFormat)837, RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))838, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))839, SampleDesc(Desc.SampleDesc)840, SampleMask(Desc.SampleMask)841, CachedPSO(Desc.CachedPSO)842{}843CD3DX12_PIPELINE_STATE_STREAM(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept844: Flags(Desc.Flags)845, NodeMask(Desc.NodeMask)846, pRootSignature(Desc.pRootSignature)847, CS(CD3DX12_SHADER_BYTECODE(Desc.CS))848, CachedPSO(Desc.CachedPSO)849{}850CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;851CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;852CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;853CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;854CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;855CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;856CD3DX12_PIPELINE_STATE_STREAM_VS VS;857CD3DX12_PIPELINE_STATE_STREAM_GS GS;858CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;859CD3DX12_PIPELINE_STATE_STREAM_HS HS;860CD3DX12_PIPELINE_STATE_STREAM_DS DS;861CD3DX12_PIPELINE_STATE_STREAM_PS PS;862CD3DX12_PIPELINE_STATE_STREAM_CS CS;863CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;864CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState;865CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;866CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;867CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;868CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;869CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;870CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;871D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept872{873D3D12_GRAPHICS_PIPELINE_STATE_DESC D;874D.Flags = this->Flags;875D.NodeMask = this->NodeMask;876D.pRootSignature = this->pRootSignature;877D.InputLayout = this->InputLayout;878D.IBStripCutValue = this->IBStripCutValue;879D.PrimitiveTopologyType = this->PrimitiveTopologyType;880D.VS = this->VS;881D.GS = this->GS;882D.StreamOutput = this->StreamOutput;883D.HS = this->HS;884D.DS = this->DS;885D.PS = this->PS;886D.BlendState = this->BlendState;887D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState));888D.DSVFormat = this->DSVFormat;889D.RasterizerState = this->RasterizerState;890D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;891memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));892D.SampleDesc = this->SampleDesc;893D.SampleMask = this->SampleMask;894D.CachedPSO = this->CachedPSO;895return D;896}897D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept898{899D3D12_COMPUTE_PIPELINE_STATE_DESC D;900D.Flags = this->Flags;901D.NodeMask = this->NodeMask;902D.pRootSignature = this->pRootSignature;903D.CS = this->CS;904D.CachedPSO = this->CachedPSO;905return D;906}907};908909struct CD3DX12_PIPELINE_STATE_STREAM2_PARSE_HELPER : public ID3DX12PipelineParserCallbacks910{911CD3DX12_PIPELINE_STATE_STREAM2 PipelineStream;912CD3DX12_PIPELINE_STATE_STREAM2_PARSE_HELPER() noexcept913: SeenDSS(false)914{915// Adjust defaults to account for absent members.916PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;917918// Depth disabled if no DSV format specified.919static_cast<D3D12_DEPTH_STENCIL_DESC1&>(PipelineStream.DepthStencilState).DepthEnable = false;920}921922// ID3DX12PipelineParserCallbacks923void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override {PipelineStream.Flags = Flags;}924void NodeMaskCb(UINT NodeMask) override {PipelineStream.NodeMask = NodeMask;}925void RootSignatureCb(ID3D12RootSignature* pRootSignature) override {PipelineStream.pRootSignature = pRootSignature;}926void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override {PipelineStream.InputLayout = InputLayout;}927void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override {PipelineStream.IBStripCutValue = IBStripCutValue;}928void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override {PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType;}929void VSCb(const D3D12_SHADER_BYTECODE& VS) override {PipelineStream.VS = VS;}930void GSCb(const D3D12_SHADER_BYTECODE& GS) override {PipelineStream.GS = GS;}931void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override {PipelineStream.StreamOutput = StreamOutput;}932void HSCb(const D3D12_SHADER_BYTECODE& HS) override {PipelineStream.HS = HS;}933void DSCb(const D3D12_SHADER_BYTECODE& DS) override {PipelineStream.DS = DS;}934void PSCb(const D3D12_SHADER_BYTECODE& PS) override {PipelineStream.PS = PS;}935void CSCb(const D3D12_SHADER_BYTECODE& CS) override {PipelineStream.CS = CS;}936void ASCb(const D3D12_SHADER_BYTECODE& AS) override {PipelineStream.AS = AS;}937void MSCb(const D3D12_SHADER_BYTECODE& MS) override {PipelineStream.MS = MS;}938void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override {PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState);}939void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override940{941PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(DepthStencilState);942SeenDSS = true;943}944void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override945{946PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(DepthStencilState);947SeenDSS = true;948}949void DSVFormatCb(DXGI_FORMAT DSVFormat) override950{951PipelineStream.DSVFormat = DSVFormat;952if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN)953{954// Re-enable depth for the default state.955static_cast<D3D12_DEPTH_STENCIL_DESC1&>(PipelineStream.DepthStencilState).DepthEnable = true;956}957}958void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override {PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC(RasterizerState);}959void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override {PipelineStream.RTVFormats = RTVFormats;}960void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override {PipelineStream.SampleDesc = SampleDesc;}961void SampleMaskCb(UINT SampleMask) override {PipelineStream.SampleMask = SampleMask;}962void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override {PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc);}963void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override {PipelineStream.CachedPSO = CachedPSO;}964965private:966bool SeenDSS;967};968969#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)970struct CD3DX12_PIPELINE_STATE_STREAM3_PARSE_HELPER : public ID3DX12PipelineParserCallbacks971{972CD3DX12_PIPELINE_STATE_STREAM3 PipelineStream;973CD3DX12_PIPELINE_STATE_STREAM3_PARSE_HELPER() noexcept974: SeenDSS(false)975{976// Adjust defaults to account for absent members.977PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;978979// Depth disabled if no DSV format specified.980static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = false;981}982983// ID3DX12PipelineParserCallbacks984void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override { PipelineStream.Flags = Flags; }985void NodeMaskCb(UINT NodeMask) override { PipelineStream.NodeMask = NodeMask; }986void RootSignatureCb(ID3D12RootSignature* pRootSignature) override { PipelineStream.pRootSignature = pRootSignature; }987void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override { PipelineStream.InputLayout = InputLayout; }988void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override { PipelineStream.IBStripCutValue = IBStripCutValue; }989void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override { PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType; }990void VSCb(const D3D12_SHADER_BYTECODE& VS) override { PipelineStream.VS = VS; }991void GSCb(const D3D12_SHADER_BYTECODE& GS) override { PipelineStream.GS = GS; }992void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override { PipelineStream.StreamOutput = StreamOutput; }993void HSCb(const D3D12_SHADER_BYTECODE& HS) override { PipelineStream.HS = HS; }994void DSCb(const D3D12_SHADER_BYTECODE& DS) override { PipelineStream.DS = DS; }995void PSCb(const D3D12_SHADER_BYTECODE& PS) override { PipelineStream.PS = PS; }996void CSCb(const D3D12_SHADER_BYTECODE& CS) override { PipelineStream.CS = CS; }997void ASCb(const D3D12_SHADER_BYTECODE& AS) override { PipelineStream.AS = AS; }998void MSCb(const D3D12_SHADER_BYTECODE& MS) override { PipelineStream.MS = MS; }999void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override { PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState); }1000void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override1001{1002PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);1003SeenDSS = true;1004}1005void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override1006{1007PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);1008SeenDSS = true;1009}1010void DepthStencilState2Cb(const D3D12_DEPTH_STENCIL_DESC2& DepthStencilState) override1011{1012PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);1013SeenDSS = true;1014}1015void DSVFormatCb(DXGI_FORMAT DSVFormat) override1016{1017PipelineStream.DSVFormat = DSVFormat;1018if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN)1019{1020// Re-enable depth for the default state.1021static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = true;1022}1023}1024void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC(RasterizerState); }1025void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override { PipelineStream.RTVFormats = RTVFormats; }1026void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override { PipelineStream.SampleDesc = SampleDesc; }1027void SampleMaskCb(UINT SampleMask) override { PipelineStream.SampleMask = SampleMask; }1028void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override { PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc); }1029void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override { PipelineStream.CachedPSO = CachedPSO; }10301031private:1032bool SeenDSS;1033};1034#endif // D3D12_SDK_VERSION >= 60610351036#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)1037struct CD3DX12_PIPELINE_STATE_STREAM4_PARSE_HELPER : public ID3DX12PipelineParserCallbacks1038{1039CD3DX12_PIPELINE_STATE_STREAM4 PipelineStream;1040CD3DX12_PIPELINE_STATE_STREAM4_PARSE_HELPER() noexcept1041: SeenDSS(false)1042{1043// Adjust defaults to account for absent members.1044PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;10451046// Depth disabled if no DSV format specified.1047static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = false;1048}10491050// ID3DX12PipelineParserCallbacks1051void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override { PipelineStream.Flags = Flags; }1052void NodeMaskCb(UINT NodeMask) override { PipelineStream.NodeMask = NodeMask; }1053void RootSignatureCb(ID3D12RootSignature* pRootSignature) override { PipelineStream.pRootSignature = pRootSignature; }1054void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override { PipelineStream.InputLayout = InputLayout; }1055void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override { PipelineStream.IBStripCutValue = IBStripCutValue; }1056void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override { PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType; }1057void VSCb(const D3D12_SHADER_BYTECODE& VS) override { PipelineStream.VS = VS; }1058void GSCb(const D3D12_SHADER_BYTECODE& GS) override { PipelineStream.GS = GS; }1059void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override { PipelineStream.StreamOutput = StreamOutput; }1060void HSCb(const D3D12_SHADER_BYTECODE& HS) override { PipelineStream.HS = HS; }1061void DSCb(const D3D12_SHADER_BYTECODE& DS) override { PipelineStream.DS = DS; }1062void PSCb(const D3D12_SHADER_BYTECODE& PS) override { PipelineStream.PS = PS; }1063void CSCb(const D3D12_SHADER_BYTECODE& CS) override { PipelineStream.CS = CS; }1064void ASCb(const D3D12_SHADER_BYTECODE& AS) override { PipelineStream.AS = AS; }1065void MSCb(const D3D12_SHADER_BYTECODE& MS) override { PipelineStream.MS = MS; }1066void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override { PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState); }1067void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override1068{1069PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);1070SeenDSS = true;1071}1072void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override1073{1074PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);1075SeenDSS = true;1076}1077void DepthStencilState2Cb(const D3D12_DEPTH_STENCIL_DESC2& DepthStencilState) override1078{1079PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);1080SeenDSS = true;1081}1082void DSVFormatCb(DXGI_FORMAT DSVFormat) override1083{1084PipelineStream.DSVFormat = DSVFormat;1085if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN)1086{1087// Re-enable depth for the default state.1088static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = true;1089}1090}1091void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC1(RasterizerState); }1092void RasterizerState1Cb(const D3D12_RASTERIZER_DESC1& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC1(RasterizerState); }1093void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override { PipelineStream.RTVFormats = RTVFormats; }1094void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override { PipelineStream.SampleDesc = SampleDesc; }1095void SampleMaskCb(UINT SampleMask) override { PipelineStream.SampleMask = SampleMask; }1096void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override { PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc); }1097void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override { PipelineStream.CachedPSO = CachedPSO; }10981099private:1100bool SeenDSS;1101};1102#endif // D3D12_SDK_VERSION >= 60811031104#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)1105struct CD3DX12_PIPELINE_STATE_STREAM5_PARSE_HELPER : public ID3DX12PipelineParserCallbacks1106{1107CD3DX12_PIPELINE_STATE_STREAM5 PipelineStream;1108CD3DX12_PIPELINE_STATE_STREAM5_PARSE_HELPER() noexcept1109: SeenDSS(false)1110{1111// Adjust defaults to account for absent members.1112PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;11131114// Depth disabled if no DSV format specified.1115static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = false;1116}11171118// ID3DX12PipelineParserCallbacks1119void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override { PipelineStream.Flags = Flags; }1120void NodeMaskCb(UINT NodeMask) override { PipelineStream.NodeMask = NodeMask; }1121void RootSignatureCb(ID3D12RootSignature* pRootSignature) override { PipelineStream.pRootSignature = pRootSignature; }1122void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override { PipelineStream.InputLayout = InputLayout; }1123void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override { PipelineStream.IBStripCutValue = IBStripCutValue; }1124void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override { PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType; }1125void VSCb(const D3D12_SHADER_BYTECODE& VS) override { PipelineStream.VS = VS; }1126void GSCb(const D3D12_SHADER_BYTECODE& GS) override { PipelineStream.GS = GS; }1127void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override { PipelineStream.StreamOutput = StreamOutput; }1128void HSCb(const D3D12_SHADER_BYTECODE& HS) override { PipelineStream.HS = HS; }1129void DSCb(const D3D12_SHADER_BYTECODE& DS) override { PipelineStream.DS = DS; }1130void PSCb(const D3D12_SHADER_BYTECODE& PS) override { PipelineStream.PS = PS; }1131void CSCb(const D3D12_SHADER_BYTECODE& CS) override { PipelineStream.CS = CS; }1132void ASCb(const D3D12_SHADER_BYTECODE& AS) override { PipelineStream.AS = AS; }1133void MSCb(const D3D12_SHADER_BYTECODE& MS) override { PipelineStream.MS = MS; }1134void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override { PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState); }1135void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override1136{1137PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);1138SeenDSS = true;1139}1140void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override1141{1142PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);1143SeenDSS = true;1144}1145void DepthStencilState2Cb(const D3D12_DEPTH_STENCIL_DESC2& DepthStencilState) override1146{1147PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);1148SeenDSS = true;1149}1150void DSVFormatCb(DXGI_FORMAT DSVFormat) override1151{1152PipelineStream.DSVFormat = DSVFormat;1153if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN)1154{1155// Re-enable depth for the default state.1156static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = true;1157}1158}1159void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }1160void RasterizerState1Cb(const D3D12_RASTERIZER_DESC1& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }1161void RasterizerState2Cb(const D3D12_RASTERIZER_DESC2& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }1162void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override { PipelineStream.RTVFormats = RTVFormats; }1163void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override { PipelineStream.SampleDesc = SampleDesc; }1164void SampleMaskCb(UINT SampleMask) override { PipelineStream.SampleMask = SampleMask; }1165void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override { PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc); }1166void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override { PipelineStream.CachedPSO = CachedPSO; }11671168private:1169bool SeenDSS;1170};1171#endif // D3D12_SDK_VERSION >= 61011721173struct CD3DX12_PIPELINE_STATE_STREAM_PARSE_HELPER : public ID3DX12PipelineParserCallbacks1174{1175CD3DX12_PIPELINE_STATE_STREAM1 PipelineStream;1176CD3DX12_PIPELINE_STATE_STREAM_PARSE_HELPER() noexcept1177: SeenDSS(false)1178{1179// Adjust defaults to account for absent members.1180PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;11811182// Depth disabled if no DSV format specified.1183static_cast<D3D12_DEPTH_STENCIL_DESC1&>(PipelineStream.DepthStencilState).DepthEnable = false;1184}11851186// ID3DX12PipelineParserCallbacks1187void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override {PipelineStream.Flags = Flags;}1188void NodeMaskCb(UINT NodeMask) override {PipelineStream.NodeMask = NodeMask;}1189void RootSignatureCb(ID3D12RootSignature* pRootSignature) override {PipelineStream.pRootSignature = pRootSignature;}1190void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override {PipelineStream.InputLayout = InputLayout;}1191void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override {PipelineStream.IBStripCutValue = IBStripCutValue;}1192void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override {PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType;}1193void VSCb(const D3D12_SHADER_BYTECODE& VS) override {PipelineStream.VS = VS;}1194void GSCb(const D3D12_SHADER_BYTECODE& GS) override {PipelineStream.GS = GS;}1195void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override {PipelineStream.StreamOutput = StreamOutput;}1196void HSCb(const D3D12_SHADER_BYTECODE& HS) override {PipelineStream.HS = HS;}1197void DSCb(const D3D12_SHADER_BYTECODE& DS) override {PipelineStream.DS = DS;}1198void PSCb(const D3D12_SHADER_BYTECODE& PS) override {PipelineStream.PS = PS;}1199void CSCb(const D3D12_SHADER_BYTECODE& CS) override {PipelineStream.CS = CS;}1200void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override {PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState);}1201void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override1202{1203PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(DepthStencilState);1204SeenDSS = true;1205}1206void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override1207{1208PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(DepthStencilState);1209SeenDSS = true;1210}1211void DSVFormatCb(DXGI_FORMAT DSVFormat) override1212{1213PipelineStream.DSVFormat = DSVFormat;1214if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN)1215{1216// Re-enable depth for the default state.1217static_cast<D3D12_DEPTH_STENCIL_DESC1&>(PipelineStream.DepthStencilState).DepthEnable = true;1218}1219}1220void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override {PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC(RasterizerState);}1221void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override {PipelineStream.RTVFormats = RTVFormats;}1222void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override {PipelineStream.SampleDesc = SampleDesc;}1223void SampleMaskCb(UINT SampleMask) override {PipelineStream.SampleMask = SampleMask;}1224void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override {PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc);}1225void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override {PipelineStream.CachedPSO = CachedPSO;}12261227private:1228bool SeenDSS;1229};12301231inline D3D12_PIPELINE_STATE_SUBOBJECT_TYPE D3DX12GetBaseSubobjectType(D3D12_PIPELINE_STATE_SUBOBJECT_TYPE SubobjectType) noexcept1232{1233switch (SubobjectType)1234{1235case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL1:1236return D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL;1237#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)1238case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL2:1239return D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL;1240#endif1241#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)1242case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER1:1243return D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER;1244#endif1245default:1246return SubobjectType;1247}1248}12491250inline HRESULT D3DX12ParsePipelineStream(const D3D12_PIPELINE_STATE_STREAM_DESC& Desc, ID3DX12PipelineParserCallbacks* pCallbacks)1251{1252if (pCallbacks == nullptr)1253{1254return E_INVALIDARG;1255}12561257if (Desc.SizeInBytes == 0 || Desc.pPipelineStateSubobjectStream == nullptr)1258{1259pCallbacks->ErrorBadInputParameter(1); // first parameter issue1260return E_INVALIDARG;1261}12621263bool SubobjectSeen[D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MAX_VALID] = {};1264for (SIZE_T CurOffset = 0, SizeOfSubobject = 0; CurOffset < Desc.SizeInBytes; CurOffset += SizeOfSubobject)1265{1266BYTE* pStream = static_cast<BYTE*>(Desc.pPipelineStateSubobjectStream)+CurOffset;1267auto SubobjectType = *reinterpret_cast<D3D12_PIPELINE_STATE_SUBOBJECT_TYPE*>(pStream);1268if (SubobjectType < 0 || SubobjectType >= D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MAX_VALID)1269{1270pCallbacks->ErrorUnknownSubobject(SubobjectType);1271return E_INVALIDARG;1272}1273if (SubobjectSeen[D3DX12GetBaseSubobjectType(SubobjectType)])1274{1275pCallbacks->ErrorDuplicateSubobject(SubobjectType);1276return E_INVALIDARG; // disallow subobject duplicates in a stream1277}1278SubobjectSeen[SubobjectType] = true;1279switch (SubobjectType)1280{1281case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_ROOT_SIGNATURE:1282pCallbacks->RootSignatureCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::pRootSignature)*>(pStream));1283SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::pRootSignature);1284break;1285case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VS:1286pCallbacks->VSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::VS)*>(pStream));1287SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::VS);1288break;1289case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PS:1290pCallbacks->PSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::PS)*>(pStream));1291SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::PS);1292break;1293case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DS:1294pCallbacks->DSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::DS)*>(pStream));1295SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::DS);1296break;1297case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_HS:1298pCallbacks->HSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::HS)*>(pStream));1299SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::HS);1300break;1301case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_GS:1302pCallbacks->GSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::GS)*>(pStream));1303SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::GS);1304break;1305case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CS:1306pCallbacks->CSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::CS)*>(pStream));1307SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::CS);1308break;1309case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_AS:1310pCallbacks->ASCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM2::AS)*>(pStream));1311SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM2::AS);1312break;1313case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MS:1314pCallbacks->MSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM2::MS)*>(pStream));1315SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM2::MS);1316break;1317case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_STREAM_OUTPUT:1318pCallbacks->StreamOutputCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::StreamOutput)*>(pStream));1319SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::StreamOutput);1320break;1321case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_BLEND:1322pCallbacks->BlendStateCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::BlendState)*>(pStream));1323SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::BlendState);1324break;1325case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_MASK:1326pCallbacks->SampleMaskCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::SampleMask)*>(pStream));1327SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::SampleMask);1328break;1329case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER:1330pCallbacks->RasterizerStateCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::RasterizerState)*>(pStream));1331SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::RasterizerState);1332break;1333#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)1334case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER1:1335pCallbacks->RasterizerState1Cb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM4::RasterizerState)*>(pStream));1336SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM4::RasterizerState);1337break;1338#endif1339#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)1340case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER2:1341pCallbacks->RasterizerState2Cb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM5::RasterizerState)*>(pStream));1342SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM5::RasterizerState);1343break;1344#endif1345case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL:1346pCallbacks->DepthStencilStateCb(*reinterpret_cast<CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL*>(pStream));1347SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL);1348break;1349case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL1:1350pCallbacks->DepthStencilState1Cb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::DepthStencilState)*>(pStream));1351SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::DepthStencilState);1352break;1353#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)1354case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL2:1355pCallbacks->DepthStencilState2Cb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM3::DepthStencilState)*>(pStream));1356SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM3::DepthStencilState);1357break;1358#endif1359case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_INPUT_LAYOUT:1360pCallbacks->InputLayoutCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::InputLayout)*>(pStream));1361SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::InputLayout);1362break;1363case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_IB_STRIP_CUT_VALUE:1364pCallbacks->IBStripCutValueCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::IBStripCutValue)*>(pStream));1365SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::IBStripCutValue);1366break;1367case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY:1368pCallbacks->PrimitiveTopologyTypeCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::PrimitiveTopologyType)*>(pStream));1369SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::PrimitiveTopologyType);1370break;1371case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RENDER_TARGET_FORMATS:1372pCallbacks->RTVFormatsCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::RTVFormats)*>(pStream));1373SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::RTVFormats);1374break;1375case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL_FORMAT:1376pCallbacks->DSVFormatCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::DSVFormat)*>(pStream));1377SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::DSVFormat);1378break;1379case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_DESC:1380pCallbacks->SampleDescCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::SampleDesc)*>(pStream));1381SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::SampleDesc);1382break;1383case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_NODE_MASK:1384pCallbacks->NodeMaskCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::NodeMask)*>(pStream));1385SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::NodeMask);1386break;1387case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CACHED_PSO:1388pCallbacks->CachedPSOCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::CachedPSO)*>(pStream));1389SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::CachedPSO);1390break;1391case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_FLAGS:1392pCallbacks->FlagsCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::Flags)*>(pStream));1393SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::Flags);1394break;1395case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VIEW_INSTANCING:1396pCallbacks->ViewInstancingCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM1::ViewInstancingDesc)*>(pStream));1397SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM1::ViewInstancingDesc);1398break;1399default:1400pCallbacks->ErrorUnknownSubobject(SubobjectType);1401return E_INVALIDARG;1402}1403}14041405return S_OK;1406}140714081409