aboutsummaryrefslogtreecommitdiff
path: root/contrib/microsoft.direct3d.d3d12.1.618.4/build/native/include/d3dx12/d3dx12_pipeline_state_stream.h
diff options
context:
space:
mode:
author3gg <3gg@shellblade.net>2025-12-02 16:39:36 -0800
committer3gg <3gg@shellblade.net>2025-12-02 16:39:36 -0800
commit6c8ae19be66cee247980a48e736a4e05d14de179 (patch)
treed860767907bf0cbe17ec66422e11bea700cf56d9 /contrib/microsoft.direct3d.d3d12.1.618.4/build/native/include/d3dx12/d3dx12_pipeline_state_stream.h
parent8f594c8ebd11f0e5f8a0c6369c3fe7383d250cbe (diff)
Immediate-mode renderer, triangle demo, shader compilation in cmake, Agility SDKHEADmain
Diffstat (limited to 'contrib/microsoft.direct3d.d3d12.1.618.4/build/native/include/d3dx12/d3dx12_pipeline_state_stream.h')
-rw-r--r--contrib/microsoft.direct3d.d3d12.1.618.4/build/native/include/d3dx12/d3dx12_pipeline_state_stream.h1718
1 files changed, 1718 insertions, 0 deletions
diff --git a/contrib/microsoft.direct3d.d3d12.1.618.4/build/native/include/d3dx12/d3dx12_pipeline_state_stream.h b/contrib/microsoft.direct3d.d3d12.1.618.4/build/native/include/d3dx12/d3dx12_pipeline_state_stream.h
new file mode 100644
index 0000000..456583b
--- /dev/null
+++ b/contrib/microsoft.direct3d.d3d12.1.618.4/build/native/include/d3dx12/d3dx12_pipeline_state_stream.h
@@ -0,0 +1,1718 @@
1//*********************************************************
2//
3// Copyright (c) Microsoft Corporation.
4// Licensed under the MIT License (MIT).
5//
6//*********************************************************
7
8#pragma once
9
10#ifndef __cplusplus
11#error D3DX12 requires C++
12#endif
13
14#include "d3dx12_default.h"
15#include "d3d12.h"
16#include "d3dx12_core.h"
17
18//------------------------------------------------------------------------------------------------
19// Pipeline State Stream Helpers
20//------------------------------------------------------------------------------------------------
21
22//------------------------------------------------------------------------------------------------
23// Stream Subobjects, i.e. elements of a stream
24
25struct DefaultSampleMask { operator UINT() noexcept { return UINT_MAX; } };
26struct DefaultSampleDesc { operator DXGI_SAMPLE_DESC() noexcept { return DXGI_SAMPLE_DESC{1, 0}; } };
27
28#ifdef _MSC_VER
29#pragma warning(push)
30#pragma warning(disable : 4324)
31#endif
32template <typename InnerStructType, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE Type, typename DefaultArg = InnerStructType>
33class alignas(void*) CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT
34{
35private:
36 D3D12_PIPELINE_STATE_SUBOBJECT_TYPE pssType;
37 InnerStructType pssInner;
38public:
39 CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT() noexcept : pssType(Type), pssInner(DefaultArg()) {}
40 CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT(InnerStructType const& i) noexcept : pssType(Type), pssInner(i) {}
41 CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT& operator=(InnerStructType const& i) noexcept { pssType = Type; pssInner = i; return *this; }
42 operator InnerStructType const&() const noexcept { return pssInner; }
43 operator InnerStructType&() noexcept { return pssInner; }
44 InnerStructType* operator&() noexcept { return &pssInner; }
45 InnerStructType const* operator&() const noexcept { return &pssInner; }
46};
47#ifdef _MSC_VER
48#pragma warning(pop)
49#endif
50typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_PIPELINE_STATE_FLAGS, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_FLAGS> CD3DX12_PIPELINE_STATE_STREAM_FLAGS;
51typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< UINT, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_NODE_MASK> CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK;
52typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< ID3D12RootSignature*, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_ROOT_SIGNATURE> CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE;
53typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_INPUT_LAYOUT_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_INPUT_LAYOUT> CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT;
54typedef 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;
55typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_PRIMITIVE_TOPOLOGY_TYPE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY> CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY;
56typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VS> CD3DX12_PIPELINE_STATE_STREAM_VS;
57typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_GS> CD3DX12_PIPELINE_STATE_STREAM_GS;
58typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_STREAM_OUTPUT_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_STREAM_OUTPUT> CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT;
59typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_HS> CD3DX12_PIPELINE_STATE_STREAM_HS;
60typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DS> CD3DX12_PIPELINE_STATE_STREAM_DS;
61typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PS> CD3DX12_PIPELINE_STATE_STREAM_PS;
62typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_AS> CD3DX12_PIPELINE_STATE_STREAM_AS;
63typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MS> CD3DX12_PIPELINE_STATE_STREAM_MS;
64typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CS> CD3DX12_PIPELINE_STATE_STREAM_CS;
65typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_BLEND_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_BLEND, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC;
66typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_DEPTH_STENCIL_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL;
67typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_DEPTH_STENCIL_DESC1, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL1, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1;
68#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
69typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_DEPTH_STENCIL_DESC2, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL2, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL2;
70#endif
71typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< DXGI_FORMAT, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL_FORMAT> CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT;
72typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_RASTERIZER_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER;
73#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
74typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_RASTERIZER_DESC1, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER1, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER1;
75#endif
76#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
77typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_RASTERIZER_DESC2, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER2, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER2;
78#endif
79typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_RT_FORMAT_ARRAY, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RENDER_TARGET_FORMATS> CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS;
80typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< DXGI_SAMPLE_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_DESC, DefaultSampleDesc> CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC;
81typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< UINT, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_MASK, DefaultSampleMask> CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK;
82typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_CACHED_PIPELINE_STATE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CACHED_PSO> CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO;
83typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_VIEW_INSTANCING_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VIEW_INSTANCING, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING;
84#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 618)
85typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<CD3DX12_SERIALIZED_ROOT_SIGNATURE_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SERIALIZED_ROOT_SIGNATURE> CD3DX12_PIPELINE_STATE_STREAM_SERIALIZED_ROOT_SIGNATURE;
86#endif
87
88//------------------------------------------------------------------------------------------------
89// Stream Parser Helpers
90
91struct ID3DX12PipelineParserCallbacks
92{
93 // Subobject Callbacks
94 virtual void FlagsCb(D3D12_PIPELINE_STATE_FLAGS) {}
95 virtual void NodeMaskCb(UINT) {}
96 virtual void RootSignatureCb(ID3D12RootSignature*) {}
97 virtual void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC&) {}
98 virtual void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE) {}
99 virtual void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE) {}
100 virtual void VSCb(const D3D12_SHADER_BYTECODE&) {}
101 virtual void GSCb(const D3D12_SHADER_BYTECODE&) {}
102 virtual void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC&) {}
103 virtual void HSCb(const D3D12_SHADER_BYTECODE&) {}
104 virtual void DSCb(const D3D12_SHADER_BYTECODE&) {}
105 virtual void PSCb(const D3D12_SHADER_BYTECODE&) {}
106 virtual void CSCb(const D3D12_SHADER_BYTECODE&) {}
107 virtual void ASCb(const D3D12_SHADER_BYTECODE&) {}
108 virtual void MSCb(const D3D12_SHADER_BYTECODE&) {}
109 virtual void BlendStateCb(const D3D12_BLEND_DESC&) {}
110 virtual void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC&) {}
111 virtual void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1&) {}
112#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
113 virtual void DepthStencilState2Cb(const D3D12_DEPTH_STENCIL_DESC2&) {}
114#endif
115 virtual void DSVFormatCb(DXGI_FORMAT) {}
116 virtual void RasterizerStateCb(const D3D12_RASTERIZER_DESC&) {}
117#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
118 virtual void RasterizerState1Cb(const D3D12_RASTERIZER_DESC1&) {}
119#endif
120#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
121 virtual void RasterizerState2Cb(const D3D12_RASTERIZER_DESC2&) {}
122#endif
123 virtual void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY&) {}
124 virtual void SampleDescCb(const DXGI_SAMPLE_DESC&) {}
125 virtual void SampleMaskCb(UINT) {}
126 virtual void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC&) {}
127 virtual void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE&) {}
128#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 618)
129 virtual void SerializedRootSignatureCb(const D3D12_SERIALIZED_ROOT_SIGNATURE_DESC&) {}
130#endif
131
132 // Error Callbacks
133 virtual void ErrorBadInputParameter(UINT /*ParameterIndex*/) {}
134 virtual void ErrorDuplicateSubobject(D3D12_PIPELINE_STATE_SUBOBJECT_TYPE /*DuplicateType*/) {}
135 virtual void ErrorUnknownSubobject(UINT /*UnknownTypeValue*/) {}
136#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 613)
137 virtual void FinalizeCb() {}
138#endif
139
140 virtual ~ID3DX12PipelineParserCallbacks() = default;
141};
142
143struct D3DX12_MESH_SHADER_PIPELINE_STATE_DESC
144{
145 ID3D12RootSignature* pRootSignature;
146 D3D12_SHADER_BYTECODE AS;
147 D3D12_SHADER_BYTECODE MS;
148 D3D12_SHADER_BYTECODE PS;
149 D3D12_BLEND_DESC BlendState;
150 UINT SampleMask;
151 D3D12_RASTERIZER_DESC RasterizerState;
152 D3D12_DEPTH_STENCIL_DESC DepthStencilState;
153 D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType;
154 UINT NumRenderTargets;
155 DXGI_FORMAT RTVFormats[ D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT ];
156 DXGI_FORMAT DSVFormat;
157 DXGI_SAMPLE_DESC SampleDesc;
158 UINT NodeMask;
159 D3D12_CACHED_PIPELINE_STATE CachedPSO;
160 D3D12_PIPELINE_STATE_FLAGS Flags;
161};
162
163#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 618)
164struct CD3DX12_PIPELINE_STATE_STREAM6
165{
166 CD3DX12_PIPELINE_STATE_STREAM6() = default;
167 // Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC
168 CD3DX12_PIPELINE_STATE_STREAM6(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept
169 : Flags(Desc.Flags)
170 , NodeMask(Desc.NodeMask)
171 , pRootSignature(Desc.pRootSignature)
172 , InputLayout(Desc.InputLayout)
173 , IBStripCutValue(Desc.IBStripCutValue)
174 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
175 , VS(Desc.VS)
176 , GS(Desc.GS)
177 , StreamOutput(Desc.StreamOutput)
178 , HS(Desc.HS)
179 , DS(Desc.DS)
180 , PS(Desc.PS)
181 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
182 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))
183 , DSVFormat(Desc.DSVFormat)
184 , RasterizerState(CD3DX12_RASTERIZER_DESC2(Desc.RasterizerState))
185 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
186 , SampleDesc(Desc.SampleDesc)
187 , SampleMask(Desc.SampleMask)
188 , CachedPSO(Desc.CachedPSO)
189 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
190 , SerializedRootSignature(CD3DX12_SERIALIZED_ROOT_SIGNATURE_DESC(CD3DX12_DEFAULT()))
191 {
192 }
193 CD3DX12_PIPELINE_STATE_STREAM6(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept
194 : Flags(Desc.Flags)
195 , NodeMask(Desc.NodeMask)
196 , pRootSignature(Desc.pRootSignature)
197 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
198 , PS(Desc.PS)
199 , AS(Desc.AS)
200 , MS(Desc.MS)
201 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
202 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))
203 , DSVFormat(Desc.DSVFormat)
204 , RasterizerState(CD3DX12_RASTERIZER_DESC2(Desc.RasterizerState))
205 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
206 , SampleDesc(Desc.SampleDesc)
207 , SampleMask(Desc.SampleMask)
208 , CachedPSO(Desc.CachedPSO)
209 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
210 , SerializedRootSignature(CD3DX12_SERIALIZED_ROOT_SIGNATURE_DESC(CD3DX12_DEFAULT()))
211 {
212 }
213 CD3DX12_PIPELINE_STATE_STREAM6(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept
214 : Flags(Desc.Flags)
215 , NodeMask(Desc.NodeMask)
216 , pRootSignature(Desc.pRootSignature)
217 , CS(CD3DX12_SHADER_BYTECODE(Desc.CS))
218 , CachedPSO(Desc.CachedPSO)
219 , SerializedRootSignature(CD3DX12_SERIALIZED_ROOT_SIGNATURE_DESC(CD3DX12_DEFAULT()))
220 {
221 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(DepthStencilState).DepthEnable = false;
222 }
223 CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
224 CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
225 CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
226 CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;
227 CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;
228 CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
229 CD3DX12_PIPELINE_STATE_STREAM_VS VS;
230 CD3DX12_PIPELINE_STATE_STREAM_GS GS;
231 CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;
232 CD3DX12_PIPELINE_STATE_STREAM_HS HS;
233 CD3DX12_PIPELINE_STATE_STREAM_DS DS;
234 CD3DX12_PIPELINE_STATE_STREAM_PS PS;
235 CD3DX12_PIPELINE_STATE_STREAM_AS AS;
236 CD3DX12_PIPELINE_STATE_STREAM_MS MS;
237 CD3DX12_PIPELINE_STATE_STREAM_CS CS;
238 CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
239 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL2 DepthStencilState;
240 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
241 CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER2 RasterizerState;
242 CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
243 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
244 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
245 CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
246 CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;
247 CD3DX12_PIPELINE_STATE_STREAM_SERIALIZED_ROOT_SIGNATURE SerializedRootSignature;
248
249 D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept
250 {
251 D3D12_GRAPHICS_PIPELINE_STATE_DESC D;
252 D.Flags = this->Flags;
253 D.NodeMask = this->NodeMask;
254 D.pRootSignature = this->pRootSignature;
255 D.InputLayout = this->InputLayout;
256 D.IBStripCutValue = this->IBStripCutValue;
257 D.PrimitiveTopologyType = this->PrimitiveTopologyType;
258 D.VS = this->VS;
259 D.GS = this->GS;
260 D.StreamOutput = this->StreamOutput;
261 D.HS = this->HS;
262 D.DS = this->DS;
263 D.PS = this->PS;
264 D.BlendState = this->BlendState;
265 D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(D3D12_DEPTH_STENCIL_DESC2(this->DepthStencilState));
266 D.DSVFormat = this->DSVFormat;
267 D.RasterizerState = CD3DX12_RASTERIZER_DESC2(D3D12_RASTERIZER_DESC2(this->RasterizerState));
268 D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
269 memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
270 D.SampleDesc = this->SampleDesc;
271 D.SampleMask = this->SampleMask;
272 D.CachedPSO = this->CachedPSO;
273 return D;
274 }
275 D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept
276 {
277 D3D12_COMPUTE_PIPELINE_STATE_DESC D;
278 D.Flags = this->Flags;
279 D.NodeMask = this->NodeMask;
280 D.pRootSignature = this->pRootSignature;
281 D.CS = this->CS;
282 D.CachedPSO = this->CachedPSO;
283 return D;
284 }
285};
286#endif
287
288#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
289// Use CD3DX12_PIPELINE_STATE_STREAM5 for D3D12_RASTERIZER_DESC2 when CheckFeatureSupport returns true for Options19::RasterizerDesc2Supported is true
290// Use CD3DX12_PIPELINE_STATE_STREAM4 for D3D12_RASTERIZER_DESC1 when CheckFeatureSupport returns true for Options16::DynamicDepthBiasSupported is true
291// Use CD3DX12_PIPELINE_STATE_STREAM3 for D3D12_DEPTH_STENCIL_DESC2 when CheckFeatureSupport returns true for Options14::IndependentFrontAndBackStencilSupported is true
292// Use CD3DX12_PIPELINE_STATE_STREAM2 for OS Build 19041+ (where there is a new mesh shader pipeline).
293// Use CD3DX12_PIPELINE_STATE_STREAM1 for OS Build 16299+ (where there is a new view instancing subobject).
294// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.
295struct CD3DX12_PIPELINE_STATE_STREAM5
296{
297 CD3DX12_PIPELINE_STATE_STREAM5() = default;
298 // Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC
299 CD3DX12_PIPELINE_STATE_STREAM5(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept
300 : Flags(Desc.Flags)
301 , NodeMask(Desc.NodeMask)
302 , pRootSignature(Desc.pRootSignature)
303 , InputLayout(Desc.InputLayout)
304 , IBStripCutValue(Desc.IBStripCutValue)
305 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
306 , VS(Desc.VS)
307 , GS(Desc.GS)
308 , StreamOutput(Desc.StreamOutput)
309 , HS(Desc.HS)
310 , DS(Desc.DS)
311 , PS(Desc.PS)
312 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
313 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))
314 , DSVFormat(Desc.DSVFormat)
315 , RasterizerState(CD3DX12_RASTERIZER_DESC2(Desc.RasterizerState))
316 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
317 , SampleDesc(Desc.SampleDesc)
318 , SampleMask(Desc.SampleMask)
319 , CachedPSO(Desc.CachedPSO)
320 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
321 {}
322 CD3DX12_PIPELINE_STATE_STREAM5(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept
323 : Flags(Desc.Flags)
324 , NodeMask(Desc.NodeMask)
325 , pRootSignature(Desc.pRootSignature)
326 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
327 , PS(Desc.PS)
328 , AS(Desc.AS)
329 , MS(Desc.MS)
330 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
331 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))
332 , DSVFormat(Desc.DSVFormat)
333 , RasterizerState(CD3DX12_RASTERIZER_DESC2(Desc.RasterizerState))
334 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
335 , SampleDesc(Desc.SampleDesc)
336 , SampleMask(Desc.SampleMask)
337 , CachedPSO(Desc.CachedPSO)
338 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
339 {}
340 CD3DX12_PIPELINE_STATE_STREAM5(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept
341 : Flags(Desc.Flags)
342 , NodeMask(Desc.NodeMask)
343 , pRootSignature(Desc.pRootSignature)
344 , CS(CD3DX12_SHADER_BYTECODE(Desc.CS))
345 , CachedPSO(Desc.CachedPSO)
346 {
347 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(DepthStencilState).DepthEnable = false;
348 }
349 CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
350 CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
351 CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
352 CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;
353 CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;
354 CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
355 CD3DX12_PIPELINE_STATE_STREAM_VS VS;
356 CD3DX12_PIPELINE_STATE_STREAM_GS GS;
357 CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;
358 CD3DX12_PIPELINE_STATE_STREAM_HS HS;
359 CD3DX12_PIPELINE_STATE_STREAM_DS DS;
360 CD3DX12_PIPELINE_STATE_STREAM_PS PS;
361 CD3DX12_PIPELINE_STATE_STREAM_AS AS;
362 CD3DX12_PIPELINE_STATE_STREAM_MS MS;
363 CD3DX12_PIPELINE_STATE_STREAM_CS CS;
364 CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
365 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL2 DepthStencilState;
366 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
367 CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER2 RasterizerState;
368 CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
369 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
370 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
371 CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
372 CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;
373
374 D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept
375 {
376 D3D12_GRAPHICS_PIPELINE_STATE_DESC D;
377 D.Flags = this->Flags;
378 D.NodeMask = this->NodeMask;
379 D.pRootSignature = this->pRootSignature;
380 D.InputLayout = this->InputLayout;
381 D.IBStripCutValue = this->IBStripCutValue;
382 D.PrimitiveTopologyType = this->PrimitiveTopologyType;
383 D.VS = this->VS;
384 D.GS = this->GS;
385 D.StreamOutput = this->StreamOutput;
386 D.HS = this->HS;
387 D.DS = this->DS;
388 D.PS = this->PS;
389 D.BlendState = this->BlendState;
390 D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(D3D12_DEPTH_STENCIL_DESC2(this->DepthStencilState));
391 D.DSVFormat = this->DSVFormat;
392 D.RasterizerState = CD3DX12_RASTERIZER_DESC2(D3D12_RASTERIZER_DESC2(this->RasterizerState));
393 D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
394 memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
395 D.SampleDesc = this->SampleDesc;
396 D.SampleMask = this->SampleMask;
397 D.CachedPSO = this->CachedPSO;
398 return D;
399 }
400 D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept
401 {
402 D3D12_COMPUTE_PIPELINE_STATE_DESC D;
403 D.Flags = this->Flags;
404 D.NodeMask = this->NodeMask;
405 D.pRootSignature = this->pRootSignature;
406 D.CS = this->CS;
407 D.CachedPSO = this->CachedPSO;
408 return D;
409 }
410};
411#endif // D3D12_SDK_VERSION >= 610
412
413#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
414// Use CD3DX12_PIPELINE_STATE_STREAM4 for D3D12_RASTERIZER_DESC1 when CheckFeatureSupport returns true for Options16::DynamicDepthBiasSupported is true
415// Use CD3DX12_PIPELINE_STATE_STREAM3 for D3D12_DEPTH_STENCIL_DESC2 when CheckFeatureSupport returns true for Options14::IndependentFrontAndBackStencilSupported is true
416// Use CD3DX12_PIPELINE_STATE_STREAM2 for OS Build 19041+ (where there is a new mesh shader pipeline).
417// Use CD3DX12_PIPELINE_STATE_STREAM1 for OS Build 16299+ (where there is a new view instancing subobject).
418// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.
419struct CD3DX12_PIPELINE_STATE_STREAM4
420{
421 CD3DX12_PIPELINE_STATE_STREAM4() = default;
422 // Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC
423 CD3DX12_PIPELINE_STATE_STREAM4(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept
424 : Flags(Desc.Flags)
425 , NodeMask(Desc.NodeMask)
426 , pRootSignature(Desc.pRootSignature)
427 , InputLayout(Desc.InputLayout)
428 , IBStripCutValue(Desc.IBStripCutValue)
429 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
430 , VS(Desc.VS)
431 , GS(Desc.GS)
432 , StreamOutput(Desc.StreamOutput)
433 , HS(Desc.HS)
434 , DS(Desc.DS)
435 , PS(Desc.PS)
436 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
437 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))
438 , DSVFormat(Desc.DSVFormat)
439 , RasterizerState(CD3DX12_RASTERIZER_DESC1(Desc.RasterizerState))
440 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
441 , SampleDesc(Desc.SampleDesc)
442 , SampleMask(Desc.SampleMask)
443 , CachedPSO(Desc.CachedPSO)
444 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
445 {}
446 CD3DX12_PIPELINE_STATE_STREAM4(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept
447 : Flags(Desc.Flags)
448 , NodeMask(Desc.NodeMask)
449 , pRootSignature(Desc.pRootSignature)
450 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
451 , PS(Desc.PS)
452 , AS(Desc.AS)
453 , MS(Desc.MS)
454 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
455 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))
456 , DSVFormat(Desc.DSVFormat)
457 , RasterizerState(CD3DX12_RASTERIZER_DESC1(Desc.RasterizerState))
458 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
459 , SampleDesc(Desc.SampleDesc)
460 , SampleMask(Desc.SampleMask)
461 , CachedPSO(Desc.CachedPSO)
462 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
463 {}
464 CD3DX12_PIPELINE_STATE_STREAM4(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept
465 : Flags(Desc.Flags)
466 , NodeMask(Desc.NodeMask)
467 , pRootSignature(Desc.pRootSignature)
468 , CS(CD3DX12_SHADER_BYTECODE(Desc.CS))
469 , CachedPSO(Desc.CachedPSO)
470 {
471 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(DepthStencilState).DepthEnable = false;
472 }
473 CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
474 CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
475 CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
476 CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;
477 CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;
478 CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
479 CD3DX12_PIPELINE_STATE_STREAM_VS VS;
480 CD3DX12_PIPELINE_STATE_STREAM_GS GS;
481 CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;
482 CD3DX12_PIPELINE_STATE_STREAM_HS HS;
483 CD3DX12_PIPELINE_STATE_STREAM_DS DS;
484 CD3DX12_PIPELINE_STATE_STREAM_PS PS;
485 CD3DX12_PIPELINE_STATE_STREAM_AS AS;
486 CD3DX12_PIPELINE_STATE_STREAM_MS MS;
487 CD3DX12_PIPELINE_STATE_STREAM_CS CS;
488 CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
489 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL2 DepthStencilState;
490 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
491 CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER1 RasterizerState;
492 CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
493 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
494 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
495 CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
496 CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;
497
498 D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept
499 {
500 D3D12_GRAPHICS_PIPELINE_STATE_DESC D;
501 D.Flags = this->Flags;
502 D.NodeMask = this->NodeMask;
503 D.pRootSignature = this->pRootSignature;
504 D.InputLayout = this->InputLayout;
505 D.IBStripCutValue = this->IBStripCutValue;
506 D.PrimitiveTopologyType = this->PrimitiveTopologyType;
507 D.VS = this->VS;
508 D.GS = this->GS;
509 D.StreamOutput = this->StreamOutput;
510 D.HS = this->HS;
511 D.DS = this->DS;
512 D.PS = this->PS;
513 D.BlendState = this->BlendState;
514 D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(D3D12_DEPTH_STENCIL_DESC2(this->DepthStencilState));
515 D.DSVFormat = this->DSVFormat;
516 D.RasterizerState = CD3DX12_RASTERIZER_DESC1(D3D12_RASTERIZER_DESC1(this->RasterizerState));
517 D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
518 memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
519 D.SampleDesc = this->SampleDesc;
520 D.SampleMask = this->SampleMask;
521 D.CachedPSO = this->CachedPSO;
522 return D;
523 }
524 D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept
525 {
526 D3D12_COMPUTE_PIPELINE_STATE_DESC D;
527 D.Flags = this->Flags;
528 D.NodeMask = this->NodeMask;
529 D.pRootSignature = this->pRootSignature;
530 D.CS = this->CS;
531 D.CachedPSO = this->CachedPSO;
532 return D;
533 }
534};
535#endif // D3D12_SDK_VERSION >= 608
536
537#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
538// Use CD3DX12_PIPELINE_STATE_STREAM3 for D3D12_DEPTH_STENCIL_DESC2 when CheckFeatureSupport returns true for Options14::IndependentFrontAndBackStencilSupported is true
539// Use CD3DX12_PIPELINE_STATE_STREAM2 for OS Build 19041+ (where there is a new mesh shader pipeline).
540// Use CD3DX12_PIPELINE_STATE_STREAM1 for OS Build 16299+ (where there is a new view instancing subobject).
541// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.
542struct CD3DX12_PIPELINE_STATE_STREAM3
543{
544 CD3DX12_PIPELINE_STATE_STREAM3() = default;
545 // Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC
546 CD3DX12_PIPELINE_STATE_STREAM3(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept
547 : Flags(Desc.Flags)
548 , NodeMask(Desc.NodeMask)
549 , pRootSignature(Desc.pRootSignature)
550 , InputLayout(Desc.InputLayout)
551 , IBStripCutValue(Desc.IBStripCutValue)
552 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
553 , VS(Desc.VS)
554 , GS(Desc.GS)
555 , StreamOutput(Desc.StreamOutput)
556 , HS(Desc.HS)
557 , DS(Desc.DS)
558 , PS(Desc.PS)
559 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
560 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))
561 , DSVFormat(Desc.DSVFormat)
562 , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
563 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
564 , SampleDesc(Desc.SampleDesc)
565 , SampleMask(Desc.SampleMask)
566 , CachedPSO(Desc.CachedPSO)
567 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
568 {}
569 CD3DX12_PIPELINE_STATE_STREAM3(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept
570 : Flags(Desc.Flags)
571 , NodeMask(Desc.NodeMask)
572 , pRootSignature(Desc.pRootSignature)
573 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
574 , PS(Desc.PS)
575 , AS(Desc.AS)
576 , MS(Desc.MS)
577 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
578 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))
579 , DSVFormat(Desc.DSVFormat)
580 , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
581 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
582 , SampleDesc(Desc.SampleDesc)
583 , SampleMask(Desc.SampleMask)
584 , CachedPSO(Desc.CachedPSO)
585 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
586 {}
587 CD3DX12_PIPELINE_STATE_STREAM3(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept
588 : Flags(Desc.Flags)
589 , NodeMask(Desc.NodeMask)
590 , pRootSignature(Desc.pRootSignature)
591 , CS(CD3DX12_SHADER_BYTECODE(Desc.CS))
592 , CachedPSO(Desc.CachedPSO)
593 {
594 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(DepthStencilState).DepthEnable = false;
595 }
596 CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
597 CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
598 CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
599 CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;
600 CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;
601 CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
602 CD3DX12_PIPELINE_STATE_STREAM_VS VS;
603 CD3DX12_PIPELINE_STATE_STREAM_GS GS;
604 CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;
605 CD3DX12_PIPELINE_STATE_STREAM_HS HS;
606 CD3DX12_PIPELINE_STATE_STREAM_DS DS;
607 CD3DX12_PIPELINE_STATE_STREAM_PS PS;
608 CD3DX12_PIPELINE_STATE_STREAM_AS AS;
609 CD3DX12_PIPELINE_STATE_STREAM_MS MS;
610 CD3DX12_PIPELINE_STATE_STREAM_CS CS;
611 CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
612 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL2 DepthStencilState;
613 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
614 CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;
615 CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
616 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
617 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
618 CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
619 CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;
620
621 D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept
622 {
623 D3D12_GRAPHICS_PIPELINE_STATE_DESC D;
624 D.Flags = this->Flags;
625 D.NodeMask = this->NodeMask;
626 D.pRootSignature = this->pRootSignature;
627 D.InputLayout = this->InputLayout;
628 D.IBStripCutValue = this->IBStripCutValue;
629 D.PrimitiveTopologyType = this->PrimitiveTopologyType;
630 D.VS = this->VS;
631 D.GS = this->GS;
632 D.StreamOutput = this->StreamOutput;
633 D.HS = this->HS;
634 D.DS = this->DS;
635 D.PS = this->PS;
636 D.BlendState = this->BlendState;
637 D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(D3D12_DEPTH_STENCIL_DESC2(this->DepthStencilState));
638 D.DSVFormat = this->DSVFormat;
639 D.RasterizerState = this->RasterizerState;
640 D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
641 memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
642 D.SampleDesc = this->SampleDesc;
643 D.SampleMask = this->SampleMask;
644 D.CachedPSO = this->CachedPSO;
645 return D;
646 }
647 D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept
648 {
649 D3D12_COMPUTE_PIPELINE_STATE_DESC D;
650 D.Flags = this->Flags;
651 D.NodeMask = this->NodeMask;
652 D.pRootSignature = this->pRootSignature;
653 D.CS = this->CS;
654 D.CachedPSO = this->CachedPSO;
655 return D;
656 }
657};
658#endif // D3D12_SDK_VERSION >= 606
659
660// CD3DX12_PIPELINE_STATE_STREAM2 Works on OS Build 19041+ (where there is a new mesh shader pipeline).
661// Use CD3DX12_PIPELINE_STATE_STREAM1 for OS Build 16299+ (where there is a new view instancing subobject).
662// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.
663struct CD3DX12_PIPELINE_STATE_STREAM2
664{
665 CD3DX12_PIPELINE_STATE_STREAM2() = default;
666 // Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC
667 CD3DX12_PIPELINE_STATE_STREAM2(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept
668 : Flags(Desc.Flags)
669 , NodeMask(Desc.NodeMask)
670 , pRootSignature(Desc.pRootSignature)
671 , InputLayout(Desc.InputLayout)
672 , IBStripCutValue(Desc.IBStripCutValue)
673 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
674 , VS(Desc.VS)
675 , GS(Desc.GS)
676 , StreamOutput(Desc.StreamOutput)
677 , HS(Desc.HS)
678 , DS(Desc.DS)
679 , PS(Desc.PS)
680 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
681 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))
682 , DSVFormat(Desc.DSVFormat)
683 , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
684 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
685 , SampleDesc(Desc.SampleDesc)
686 , SampleMask(Desc.SampleMask)
687 , CachedPSO(Desc.CachedPSO)
688 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
689 {}
690 CD3DX12_PIPELINE_STATE_STREAM2(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept
691 : Flags(Desc.Flags)
692 , NodeMask(Desc.NodeMask)
693 , pRootSignature(Desc.pRootSignature)
694 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
695 , PS(Desc.PS)
696 , AS(Desc.AS)
697 , MS(Desc.MS)
698 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
699 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))
700 , DSVFormat(Desc.DSVFormat)
701 , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
702 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
703 , SampleDesc(Desc.SampleDesc)
704 , SampleMask(Desc.SampleMask)
705 , CachedPSO(Desc.CachedPSO)
706 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
707 {}
708 CD3DX12_PIPELINE_STATE_STREAM2(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept
709 : Flags(Desc.Flags)
710 , NodeMask(Desc.NodeMask)
711 , pRootSignature(Desc.pRootSignature)
712 , CS(CD3DX12_SHADER_BYTECODE(Desc.CS))
713 , CachedPSO(Desc.CachedPSO)
714 {
715 static_cast<D3D12_DEPTH_STENCIL_DESC1&>(DepthStencilState).DepthEnable = false;
716 }
717 CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
718 CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
719 CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
720 CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;
721 CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;
722 CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
723 CD3DX12_PIPELINE_STATE_STREAM_VS VS;
724 CD3DX12_PIPELINE_STATE_STREAM_GS GS;
725 CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;
726 CD3DX12_PIPELINE_STATE_STREAM_HS HS;
727 CD3DX12_PIPELINE_STATE_STREAM_DS DS;
728 CD3DX12_PIPELINE_STATE_STREAM_PS PS;
729 CD3DX12_PIPELINE_STATE_STREAM_AS AS;
730 CD3DX12_PIPELINE_STATE_STREAM_MS MS;
731 CD3DX12_PIPELINE_STATE_STREAM_CS CS;
732 CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
733 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState;
734 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
735 CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;
736 CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
737 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
738 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
739 CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
740 CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;
741 D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept
742 {
743 D3D12_GRAPHICS_PIPELINE_STATE_DESC D;
744 D.Flags = this->Flags;
745 D.NodeMask = this->NodeMask;
746 D.pRootSignature = this->pRootSignature;
747 D.InputLayout = this->InputLayout;
748 D.IBStripCutValue = this->IBStripCutValue;
749 D.PrimitiveTopologyType = this->PrimitiveTopologyType;
750 D.VS = this->VS;
751 D.GS = this->GS;
752 D.StreamOutput = this->StreamOutput;
753 D.HS = this->HS;
754 D.DS = this->DS;
755 D.PS = this->PS;
756 D.BlendState = this->BlendState;
757 D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState));
758 D.DSVFormat = this->DSVFormat;
759 D.RasterizerState = this->RasterizerState;
760 D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
761 memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
762 D.SampleDesc = this->SampleDesc;
763 D.SampleMask = this->SampleMask;
764 D.CachedPSO = this->CachedPSO;
765 return D;
766 }
767 D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept
768 {
769 D3D12_COMPUTE_PIPELINE_STATE_DESC D;
770 D.Flags = this->Flags;
771 D.NodeMask = this->NodeMask;
772 D.pRootSignature = this->pRootSignature;
773 D.CS = this->CS;
774 D.CachedPSO = this->CachedPSO;
775 return D;
776 }
777};
778
779// CD3DX12_PIPELINE_STATE_STREAM1 Works on OS Build 16299+ (where there is a new view instancing subobject).
780// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.
781struct CD3DX12_PIPELINE_STATE_STREAM1
782{
783 CD3DX12_PIPELINE_STATE_STREAM1() = default;
784 // Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC
785 CD3DX12_PIPELINE_STATE_STREAM1(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept
786 : Flags(Desc.Flags)
787 , NodeMask(Desc.NodeMask)
788 , pRootSignature(Desc.pRootSignature)
789 , InputLayout(Desc.InputLayout)
790 , IBStripCutValue(Desc.IBStripCutValue)
791 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
792 , VS(Desc.VS)
793 , GS(Desc.GS)
794 , StreamOutput(Desc.StreamOutput)
795 , HS(Desc.HS)
796 , DS(Desc.DS)
797 , PS(Desc.PS)
798 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
799 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))
800 , DSVFormat(Desc.DSVFormat)
801 , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
802 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
803 , SampleDesc(Desc.SampleDesc)
804 , SampleMask(Desc.SampleMask)
805 , CachedPSO(Desc.CachedPSO)
806 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
807 {}
808 CD3DX12_PIPELINE_STATE_STREAM1(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept
809 : Flags(Desc.Flags)
810 , NodeMask(Desc.NodeMask)
811 , pRootSignature(Desc.pRootSignature)
812 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
813 , PS(Desc.PS)
814 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
815 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))
816 , DSVFormat(Desc.DSVFormat)
817 , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
818 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
819 , SampleDesc(Desc.SampleDesc)
820 , SampleMask(Desc.SampleMask)
821 , CachedPSO(Desc.CachedPSO)
822 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
823 {}
824 CD3DX12_PIPELINE_STATE_STREAM1(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept
825 : Flags(Desc.Flags)
826 , NodeMask(Desc.NodeMask)
827 , pRootSignature(Desc.pRootSignature)
828 , CS(CD3DX12_SHADER_BYTECODE(Desc.CS))
829 , CachedPSO(Desc.CachedPSO)
830 {
831 static_cast<D3D12_DEPTH_STENCIL_DESC1&>(DepthStencilState).DepthEnable = false;
832 }
833 CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
834 CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
835 CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
836 CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;
837 CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;
838 CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
839 CD3DX12_PIPELINE_STATE_STREAM_VS VS;
840 CD3DX12_PIPELINE_STATE_STREAM_GS GS;
841 CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;
842 CD3DX12_PIPELINE_STATE_STREAM_HS HS;
843 CD3DX12_PIPELINE_STATE_STREAM_DS DS;
844 CD3DX12_PIPELINE_STATE_STREAM_PS PS;
845 CD3DX12_PIPELINE_STATE_STREAM_CS CS;
846 CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
847 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState;
848 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
849 CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;
850 CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
851 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
852 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
853 CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
854 CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;
855 D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept
856 {
857 D3D12_GRAPHICS_PIPELINE_STATE_DESC D;
858 D.Flags = this->Flags;
859 D.NodeMask = this->NodeMask;
860 D.pRootSignature = this->pRootSignature;
861 D.InputLayout = this->InputLayout;
862 D.IBStripCutValue = this->IBStripCutValue;
863 D.PrimitiveTopologyType = this->PrimitiveTopologyType;
864 D.VS = this->VS;
865 D.GS = this->GS;
866 D.StreamOutput = this->StreamOutput;
867 D.HS = this->HS;
868 D.DS = this->DS;
869 D.PS = this->PS;
870 D.BlendState = this->BlendState;
871 D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState));
872 D.DSVFormat = this->DSVFormat;
873 D.RasterizerState = this->RasterizerState;
874 D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
875 memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
876 D.SampleDesc = this->SampleDesc;
877 D.SampleMask = this->SampleMask;
878 D.CachedPSO = this->CachedPSO;
879 return D;
880 }
881 D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept
882 {
883 D3D12_COMPUTE_PIPELINE_STATE_DESC D;
884 D.Flags = this->Flags;
885 D.NodeMask = this->NodeMask;
886 D.pRootSignature = this->pRootSignature;
887 D.CS = this->CS;
888 D.CachedPSO = this->CachedPSO;
889 return D;
890 }
891};
892
893
894struct CD3DX12_PIPELINE_MESH_STATE_STREAM
895{
896 CD3DX12_PIPELINE_MESH_STATE_STREAM() = default;
897 CD3DX12_PIPELINE_MESH_STATE_STREAM(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept
898 : Flags(Desc.Flags)
899 , NodeMask(Desc.NodeMask)
900 , pRootSignature(Desc.pRootSignature)
901 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
902 , PS(Desc.PS)
903 , AS(Desc.AS)
904 , MS(Desc.MS)
905 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
906 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))
907 , DSVFormat(Desc.DSVFormat)
908 , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
909 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
910 , SampleDesc(Desc.SampleDesc)
911 , SampleMask(Desc.SampleMask)
912 , CachedPSO(Desc.CachedPSO)
913 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
914 {}
915 CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
916 CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
917 CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
918 CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
919 CD3DX12_PIPELINE_STATE_STREAM_PS PS;
920 CD3DX12_PIPELINE_STATE_STREAM_AS AS;
921 CD3DX12_PIPELINE_STATE_STREAM_MS MS;
922 CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
923 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState;
924 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
925 CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;
926 CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
927 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
928 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
929 CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
930 CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;
931 D3DX12_MESH_SHADER_PIPELINE_STATE_DESC MeshShaderDescV0() const noexcept
932 {
933 D3DX12_MESH_SHADER_PIPELINE_STATE_DESC D;
934 D.Flags = this->Flags;
935 D.NodeMask = this->NodeMask;
936 D.pRootSignature = this->pRootSignature;
937 D.PrimitiveTopologyType = this->PrimitiveTopologyType;
938 D.PS = this->PS;
939 D.AS = this->AS;
940 D.MS = this->MS;
941 D.BlendState = this->BlendState;
942 D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState));
943 D.DSVFormat = this->DSVFormat;
944 D.RasterizerState = this->RasterizerState;
945 D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
946 memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
947 D.SampleDesc = this->SampleDesc;
948 D.SampleMask = this->SampleMask;
949 D.CachedPSO = this->CachedPSO;
950 return D;
951 }
952};
953
954// CD3DX12_PIPELINE_STATE_STREAM works on OS Build 15063+ but does not support new subobject(s) added in OS Build 16299+.
955// See CD3DX12_PIPELINE_STATE_STREAM1 for instance.
956struct CD3DX12_PIPELINE_STATE_STREAM
957{
958 CD3DX12_PIPELINE_STATE_STREAM() = default;
959 CD3DX12_PIPELINE_STATE_STREAM(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept
960 : Flags(Desc.Flags)
961 , NodeMask(Desc.NodeMask)
962 , pRootSignature(Desc.pRootSignature)
963 , InputLayout(Desc.InputLayout)
964 , IBStripCutValue(Desc.IBStripCutValue)
965 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
966 , VS(Desc.VS)
967 , GS(Desc.GS)
968 , StreamOutput(Desc.StreamOutput)
969 , HS(Desc.HS)
970 , DS(Desc.DS)
971 , PS(Desc.PS)
972 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
973 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))
974 , DSVFormat(Desc.DSVFormat)
975 , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
976 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
977 , SampleDesc(Desc.SampleDesc)
978 , SampleMask(Desc.SampleMask)
979 , CachedPSO(Desc.CachedPSO)
980 {}
981 CD3DX12_PIPELINE_STATE_STREAM(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept
982 : Flags(Desc.Flags)
983 , NodeMask(Desc.NodeMask)
984 , pRootSignature(Desc.pRootSignature)
985 , CS(CD3DX12_SHADER_BYTECODE(Desc.CS))
986 , CachedPSO(Desc.CachedPSO)
987 {}
988 CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
989 CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
990 CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
991 CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;
992 CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;
993 CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
994 CD3DX12_PIPELINE_STATE_STREAM_VS VS;
995 CD3DX12_PIPELINE_STATE_STREAM_GS GS;
996 CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;
997 CD3DX12_PIPELINE_STATE_STREAM_HS HS;
998 CD3DX12_PIPELINE_STATE_STREAM_DS DS;
999 CD3DX12_PIPELINE_STATE_STREAM_PS PS;
1000 CD3DX12_PIPELINE_STATE_STREAM_CS CS;
1001 CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
1002 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState;
1003 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
1004 CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;
1005 CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
1006 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
1007 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
1008 CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
1009 D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept
1010 {
1011 D3D12_GRAPHICS_PIPELINE_STATE_DESC D;
1012 D.Flags = this->Flags;
1013 D.NodeMask = this->NodeMask;
1014 D.pRootSignature = this->pRootSignature;
1015 D.InputLayout = this->InputLayout;
1016 D.IBStripCutValue = this->IBStripCutValue;
1017 D.PrimitiveTopologyType = this->PrimitiveTopologyType;
1018 D.VS = this->VS;
1019 D.GS = this->GS;
1020 D.StreamOutput = this->StreamOutput;
1021 D.HS = this->HS;
1022 D.DS = this->DS;
1023 D.PS = this->PS;
1024 D.BlendState = this->BlendState;
1025 D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState));
1026 D.DSVFormat = this->DSVFormat;
1027 D.RasterizerState = this->RasterizerState;
1028 D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
1029 memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
1030 D.SampleDesc = this->SampleDesc;
1031 D.SampleMask = this->SampleMask;
1032 D.CachedPSO = this->CachedPSO;
1033 return D;
1034 }
1035 D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept
1036 {
1037 D3D12_COMPUTE_PIPELINE_STATE_DESC D;
1038 D.Flags = this->Flags;
1039 D.NodeMask = this->NodeMask;
1040 D.pRootSignature = this->pRootSignature;
1041 D.CS = this->CS;
1042 D.CachedPSO = this->CachedPSO;
1043 return D;
1044 }
1045};
1046
1047
1048struct CD3DX12_PIPELINE_STATE_STREAM2_PARSE_HELPER : public ID3DX12PipelineParserCallbacks
1049{
1050 CD3DX12_PIPELINE_STATE_STREAM2 PipelineStream;
1051 CD3DX12_PIPELINE_STATE_STREAM2_PARSE_HELPER() noexcept
1052 : SeenDSS(false)
1053 {
1054 // Adjust defaults to account for absent members.
1055 PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
1056
1057 // Depth disabled if no DSV format specified.
1058 static_cast<D3D12_DEPTH_STENCIL_DESC1&>(PipelineStream.DepthStencilState).DepthEnable = false;
1059 }
1060
1061 // ID3DX12PipelineParserCallbacks
1062 void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override {PipelineStream.Flags = Flags;}
1063 void NodeMaskCb(UINT NodeMask) override {PipelineStream.NodeMask = NodeMask;}
1064 void RootSignatureCb(ID3D12RootSignature* pRootSignature) override {PipelineStream.pRootSignature = pRootSignature;}
1065 void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override {PipelineStream.InputLayout = InputLayout;}
1066 void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override {PipelineStream.IBStripCutValue = IBStripCutValue;}
1067 void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override {PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType;}
1068 void VSCb(const D3D12_SHADER_BYTECODE& VS) override {PipelineStream.VS = VS;}
1069 void GSCb(const D3D12_SHADER_BYTECODE& GS) override {PipelineStream.GS = GS;}
1070 void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override {PipelineStream.StreamOutput = StreamOutput;}
1071 void HSCb(const D3D12_SHADER_BYTECODE& HS) override {PipelineStream.HS = HS;}
1072 void DSCb(const D3D12_SHADER_BYTECODE& DS) override {PipelineStream.DS = DS;}
1073 void PSCb(const D3D12_SHADER_BYTECODE& PS) override {PipelineStream.PS = PS;}
1074 void CSCb(const D3D12_SHADER_BYTECODE& CS) override {PipelineStream.CS = CS;}
1075 void ASCb(const D3D12_SHADER_BYTECODE& AS) override {PipelineStream.AS = AS;}
1076 void MSCb(const D3D12_SHADER_BYTECODE& MS) override {PipelineStream.MS = MS;}
1077 void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override {PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState);}
1078 void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override
1079 {
1080 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(DepthStencilState);
1081 SeenDSS = true;
1082 }
1083 void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override
1084 {
1085 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(DepthStencilState);
1086 SeenDSS = true;
1087 }
1088 void DSVFormatCb(DXGI_FORMAT DSVFormat) override
1089 {
1090 PipelineStream.DSVFormat = DSVFormat;
1091 if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN)
1092 {
1093 // Re-enable depth for the default state.
1094 static_cast<D3D12_DEPTH_STENCIL_DESC1&>(PipelineStream.DepthStencilState).DepthEnable = true;
1095 }
1096 }
1097 void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override {PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC(RasterizerState);}
1098 void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override {PipelineStream.RTVFormats = RTVFormats;}
1099 void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override {PipelineStream.SampleDesc = SampleDesc;}
1100 void SampleMaskCb(UINT SampleMask) override {PipelineStream.SampleMask = SampleMask;}
1101 void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override {PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc);}
1102 void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override {PipelineStream.CachedPSO = CachedPSO;}
1103
1104private:
1105 bool SeenDSS;
1106};
1107
1108#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
1109struct CD3DX12_PIPELINE_STATE_STREAM3_PARSE_HELPER : public ID3DX12PipelineParserCallbacks
1110{
1111 CD3DX12_PIPELINE_STATE_STREAM3 PipelineStream;
1112 CD3DX12_PIPELINE_STATE_STREAM3_PARSE_HELPER() noexcept
1113 : SeenDSS(false)
1114 {
1115 // Adjust defaults to account for absent members.
1116 PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
1117
1118 // Depth disabled if no DSV format specified.
1119 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = false;
1120 }
1121
1122 // ID3DX12PipelineParserCallbacks
1123 void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override { PipelineStream.Flags = Flags; }
1124 void NodeMaskCb(UINT NodeMask) override { PipelineStream.NodeMask = NodeMask; }
1125 void RootSignatureCb(ID3D12RootSignature* pRootSignature) override { PipelineStream.pRootSignature = pRootSignature; }
1126 void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override { PipelineStream.InputLayout = InputLayout; }
1127 void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override { PipelineStream.IBStripCutValue = IBStripCutValue; }
1128 void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override { PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType; }
1129 void VSCb(const D3D12_SHADER_BYTECODE& VS) override { PipelineStream.VS = VS; }
1130 void GSCb(const D3D12_SHADER_BYTECODE& GS) override { PipelineStream.GS = GS; }
1131 void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override { PipelineStream.StreamOutput = StreamOutput; }
1132 void HSCb(const D3D12_SHADER_BYTECODE& HS) override { PipelineStream.HS = HS; }
1133 void DSCb(const D3D12_SHADER_BYTECODE& DS) override { PipelineStream.DS = DS; }
1134 void PSCb(const D3D12_SHADER_BYTECODE& PS) override { PipelineStream.PS = PS; }
1135 void CSCb(const D3D12_SHADER_BYTECODE& CS) override { PipelineStream.CS = CS; }
1136 void ASCb(const D3D12_SHADER_BYTECODE& AS) override { PipelineStream.AS = AS; }
1137 void MSCb(const D3D12_SHADER_BYTECODE& MS) override { PipelineStream.MS = MS; }
1138 void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override { PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState); }
1139 void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override
1140 {
1141 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1142 SeenDSS = true;
1143 }
1144 void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override
1145 {
1146 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1147 SeenDSS = true;
1148 }
1149 void DepthStencilState2Cb(const D3D12_DEPTH_STENCIL_DESC2& DepthStencilState) override
1150 {
1151 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1152 SeenDSS = true;
1153 }
1154 void DSVFormatCb(DXGI_FORMAT DSVFormat) override
1155 {
1156 PipelineStream.DSVFormat = DSVFormat;
1157 if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN)
1158 {
1159 // Re-enable depth for the default state.
1160 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = true;
1161 }
1162 }
1163 void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC(RasterizerState); }
1164 void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override { PipelineStream.RTVFormats = RTVFormats; }
1165 void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override { PipelineStream.SampleDesc = SampleDesc; }
1166 void SampleMaskCb(UINT SampleMask) override { PipelineStream.SampleMask = SampleMask; }
1167 void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override { PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc); }
1168 void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override { PipelineStream.CachedPSO = CachedPSO; }
1169
1170private:
1171 bool SeenDSS;
1172};
1173#endif // D3D12_SDK_VERSION >= 606
1174
1175#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
1176struct CD3DX12_PIPELINE_STATE_STREAM4_PARSE_HELPER : public ID3DX12PipelineParserCallbacks
1177{
1178 CD3DX12_PIPELINE_STATE_STREAM4 PipelineStream;
1179 CD3DX12_PIPELINE_STATE_STREAM4_PARSE_HELPER() noexcept
1180 : SeenDSS(false)
1181 {
1182 // Adjust defaults to account for absent members.
1183 PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
1184
1185 // Depth disabled if no DSV format specified.
1186 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = false;
1187 }
1188
1189 // ID3DX12PipelineParserCallbacks
1190 void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override { PipelineStream.Flags = Flags; }
1191 void NodeMaskCb(UINT NodeMask) override { PipelineStream.NodeMask = NodeMask; }
1192 void RootSignatureCb(ID3D12RootSignature* pRootSignature) override { PipelineStream.pRootSignature = pRootSignature; }
1193 void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override { PipelineStream.InputLayout = InputLayout; }
1194 void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override { PipelineStream.IBStripCutValue = IBStripCutValue; }
1195 void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override { PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType; }
1196 void VSCb(const D3D12_SHADER_BYTECODE& VS) override { PipelineStream.VS = VS; }
1197 void GSCb(const D3D12_SHADER_BYTECODE& GS) override { PipelineStream.GS = GS; }
1198 void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override { PipelineStream.StreamOutput = StreamOutput; }
1199 void HSCb(const D3D12_SHADER_BYTECODE& HS) override { PipelineStream.HS = HS; }
1200 void DSCb(const D3D12_SHADER_BYTECODE& DS) override { PipelineStream.DS = DS; }
1201 void PSCb(const D3D12_SHADER_BYTECODE& PS) override { PipelineStream.PS = PS; }
1202 void CSCb(const D3D12_SHADER_BYTECODE& CS) override { PipelineStream.CS = CS; }
1203 void ASCb(const D3D12_SHADER_BYTECODE& AS) override { PipelineStream.AS = AS; }
1204 void MSCb(const D3D12_SHADER_BYTECODE& MS) override { PipelineStream.MS = MS; }
1205 void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override { PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState); }
1206 void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override
1207 {
1208 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1209 SeenDSS = true;
1210 }
1211 void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override
1212 {
1213 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1214 SeenDSS = true;
1215 }
1216 void DepthStencilState2Cb(const D3D12_DEPTH_STENCIL_DESC2& DepthStencilState) override
1217 {
1218 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1219 SeenDSS = true;
1220 }
1221 void DSVFormatCb(DXGI_FORMAT DSVFormat) override
1222 {
1223 PipelineStream.DSVFormat = DSVFormat;
1224 if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN)
1225 {
1226 // Re-enable depth for the default state.
1227 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = true;
1228 }
1229 }
1230 void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC1(RasterizerState); }
1231 void RasterizerState1Cb(const D3D12_RASTERIZER_DESC1& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC1(RasterizerState); }
1232 void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override { PipelineStream.RTVFormats = RTVFormats; }
1233 void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override { PipelineStream.SampleDesc = SampleDesc; }
1234 void SampleMaskCb(UINT SampleMask) override { PipelineStream.SampleMask = SampleMask; }
1235 void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override { PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc); }
1236 void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override { PipelineStream.CachedPSO = CachedPSO; }
1237
1238private:
1239 bool SeenDSS;
1240};
1241#endif // D3D12_SDK_VERSION >= 608
1242
1243#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 613)
1244// This SDK 613 version has better primitive topology default handling than the v610 equivalent below.
1245struct CD3DX12_PIPELINE_STATE_STREAM5_PARSE_HELPER : public ID3DX12PipelineParserCallbacks
1246{
1247 CD3DX12_PIPELINE_STATE_STREAM5 PipelineStream;
1248 CD3DX12_PIPELINE_STATE_STREAM5_PARSE_HELPER() noexcept
1249 : SeenDSS(false),
1250 SeenMS(false),
1251 SeenTopology(false)
1252 {
1253 // Adjust defaults to account for absent members.
1254 PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
1255
1256 // Depth disabled if no DSV format specified.
1257 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = false;
1258 }
1259
1260 // ID3DX12PipelineParserCallbacks
1261 void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override { PipelineStream.Flags = Flags; }
1262 void NodeMaskCb(UINT NodeMask) override { PipelineStream.NodeMask = NodeMask; }
1263 void RootSignatureCb(ID3D12RootSignature* pRootSignature) override { PipelineStream.pRootSignature = pRootSignature; }
1264 void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override { PipelineStream.InputLayout = InputLayout; }
1265 void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override { PipelineStream.IBStripCutValue = IBStripCutValue; }
1266 void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override
1267 {
1268 PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType;
1269 SeenTopology = true;
1270 }
1271 void VSCb(const D3D12_SHADER_BYTECODE& VS) override { PipelineStream.VS = VS; }
1272 void GSCb(const D3D12_SHADER_BYTECODE& GS) override { PipelineStream.GS = GS; }
1273 void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override { PipelineStream.StreamOutput = StreamOutput; }
1274 void HSCb(const D3D12_SHADER_BYTECODE& HS) override { PipelineStream.HS = HS; }
1275 void DSCb(const D3D12_SHADER_BYTECODE& DS) override { PipelineStream.DS = DS; }
1276 void PSCb(const D3D12_SHADER_BYTECODE& PS) override { PipelineStream.PS = PS; }
1277 void CSCb(const D3D12_SHADER_BYTECODE& CS) override { PipelineStream.CS = CS; }
1278 void ASCb(const D3D12_SHADER_BYTECODE& AS) override { PipelineStream.AS = AS; }
1279 void MSCb(const D3D12_SHADER_BYTECODE& MS) override { PipelineStream.MS = MS; SeenMS = true; }
1280 void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override { PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState); }
1281 void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override
1282 {
1283 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1284 SeenDSS = true;
1285 }
1286 void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override
1287 {
1288 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1289 SeenDSS = true;
1290 }
1291 void DepthStencilState2Cb(const D3D12_DEPTH_STENCIL_DESC2& DepthStencilState) override
1292 {
1293 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1294 SeenDSS = true;
1295 }
1296 void DSVFormatCb(DXGI_FORMAT DSVFormat) override {PipelineStream.DSVFormat = DSVFormat;}
1297 void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
1298 void RasterizerState1Cb(const D3D12_RASTERIZER_DESC1& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
1299 void RasterizerState2Cb(const D3D12_RASTERIZER_DESC2& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
1300 void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override { PipelineStream.RTVFormats = RTVFormats; }
1301 void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override { PipelineStream.SampleDesc = SampleDesc; }
1302 void SampleMaskCb(UINT SampleMask) override { PipelineStream.SampleMask = SampleMask; }
1303 void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override { PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc); }
1304 void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override { PipelineStream.CachedPSO = CachedPSO; }
1305 void FinalizeCb() override
1306 {
1307 if (!SeenDSS && PipelineStream.DSVFormat != DXGI_FORMAT_UNKNOWN)
1308 {
1309 // Re-enable depth for the default state.
1310 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = true;
1311 }
1312 if (!SeenTopology && SeenMS)
1313 {
1314 PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED;
1315 }
1316 }
1317
1318private:
1319 bool SeenDSS;
1320 bool SeenMS;
1321 bool SeenTopology;
1322};
1323#elif defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
1324struct CD3DX12_PIPELINE_STATE_STREAM5_PARSE_HELPER : public ID3DX12PipelineParserCallbacks
1325{
1326 CD3DX12_PIPELINE_STATE_STREAM5 PipelineStream;
1327 CD3DX12_PIPELINE_STATE_STREAM5_PARSE_HELPER() noexcept
1328 : SeenDSS(false)
1329 {
1330 // Adjust defaults to account for absent members.
1331 PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
1332
1333 // Depth disabled if no DSV format specified.
1334 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = false;
1335 }
1336
1337 // ID3DX12PipelineParserCallbacks
1338 void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override { PipelineStream.Flags = Flags; }
1339 void NodeMaskCb(UINT NodeMask) override { PipelineStream.NodeMask = NodeMask; }
1340 void RootSignatureCb(ID3D12RootSignature* pRootSignature) override { PipelineStream.pRootSignature = pRootSignature; }
1341 void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override { PipelineStream.InputLayout = InputLayout; }
1342 void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override { PipelineStream.IBStripCutValue = IBStripCutValue; }
1343 void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override { PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType; }
1344 void VSCb(const D3D12_SHADER_BYTECODE& VS) override { PipelineStream.VS = VS; }
1345 void GSCb(const D3D12_SHADER_BYTECODE& GS) override { PipelineStream.GS = GS; }
1346 void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override { PipelineStream.StreamOutput = StreamOutput; }
1347 void HSCb(const D3D12_SHADER_BYTECODE& HS) override { PipelineStream.HS = HS; }
1348 void DSCb(const D3D12_SHADER_BYTECODE& DS) override { PipelineStream.DS = DS; }
1349 void PSCb(const D3D12_SHADER_BYTECODE& PS) override { PipelineStream.PS = PS; }
1350 void CSCb(const D3D12_SHADER_BYTECODE& CS) override { PipelineStream.CS = CS; }
1351 void ASCb(const D3D12_SHADER_BYTECODE& AS) override { PipelineStream.AS = AS; }
1352 void MSCb(const D3D12_SHADER_BYTECODE& MS) override { PipelineStream.MS = MS; }
1353 void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override { PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState); }
1354 void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override
1355 {
1356 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1357 SeenDSS = true;
1358 }
1359 void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override
1360 {
1361 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1362 SeenDSS = true;
1363 }
1364 void DepthStencilState2Cb(const D3D12_DEPTH_STENCIL_DESC2& DepthStencilState) override
1365 {
1366 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1367 SeenDSS = true;
1368 }
1369 void DSVFormatCb(DXGI_FORMAT DSVFormat) override
1370 {
1371 PipelineStream.DSVFormat = DSVFormat;
1372 if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN)
1373 {
1374 // Re-enable depth for the default state.
1375 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = true;
1376 }
1377 }
1378 void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
1379 void RasterizerState1Cb(const D3D12_RASTERIZER_DESC1& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
1380 void RasterizerState2Cb(const D3D12_RASTERIZER_DESC2& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
1381 void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override { PipelineStream.RTVFormats = RTVFormats; }
1382 void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override { PipelineStream.SampleDesc = SampleDesc; }
1383 void SampleMaskCb(UINT SampleMask) override { PipelineStream.SampleMask = SampleMask; }
1384 void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override { PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc); }
1385 void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override { PipelineStream.CachedPSO = CachedPSO; }
1386
1387private:
1388 bool SeenDSS;
1389};
1390#endif // D3D12_SDK_VERSION >= 610
1391
1392#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 618)
1393struct CD3DX12_PIPELINE_STATE_STREAM6_PARSE_HELPER : public ID3DX12PipelineParserCallbacks
1394{
1395 CD3DX12_PIPELINE_STATE_STREAM6 PipelineStream;
1396 CD3DX12_PIPELINE_STATE_STREAM6_PARSE_HELPER() noexcept
1397 : SeenDSS(false),
1398 SeenMS(false),
1399 SeenTopology(false)
1400 {
1401 // Adjust defaults to account for absent members.
1402 PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
1403
1404 // Depth disabled if no DSV format specified.
1405 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = false;
1406 }
1407
1408 // ID3DX12PipelineParserCallbacks
1409 void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override { PipelineStream.Flags = Flags; }
1410 void NodeMaskCb(UINT NodeMask) override { PipelineStream.NodeMask = NodeMask; }
1411 void RootSignatureCb(ID3D12RootSignature* pRootSignature) override { PipelineStream.pRootSignature = pRootSignature; }
1412 void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override { PipelineStream.InputLayout = InputLayout; }
1413 void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override { PipelineStream.IBStripCutValue = IBStripCutValue; }
1414 void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override
1415 {
1416 PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType;
1417 SeenTopology = true;
1418 }
1419 void VSCb(const D3D12_SHADER_BYTECODE& VS) override { PipelineStream.VS = VS; }
1420 void GSCb(const D3D12_SHADER_BYTECODE& GS) override { PipelineStream.GS = GS; }
1421 void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override { PipelineStream.StreamOutput = StreamOutput; }
1422 void HSCb(const D3D12_SHADER_BYTECODE& HS) override { PipelineStream.HS = HS; }
1423 void DSCb(const D3D12_SHADER_BYTECODE& DS) override { PipelineStream.DS = DS; }
1424 void PSCb(const D3D12_SHADER_BYTECODE& PS) override { PipelineStream.PS = PS; }
1425 void CSCb(const D3D12_SHADER_BYTECODE& CS) override { PipelineStream.CS = CS; }
1426 void ASCb(const D3D12_SHADER_BYTECODE& AS) override { PipelineStream.AS = AS; }
1427 void MSCb(const D3D12_SHADER_BYTECODE& MS) override { PipelineStream.MS = MS; SeenMS = true; }
1428 void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override { PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState); }
1429 void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override
1430 {
1431 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1432 SeenDSS = true;
1433 }
1434 void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override
1435 {
1436 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1437 SeenDSS = true;
1438 }
1439 void DepthStencilState2Cb(const D3D12_DEPTH_STENCIL_DESC2& DepthStencilState) override
1440 {
1441 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1442 SeenDSS = true;
1443 }
1444 void DSVFormatCb(DXGI_FORMAT DSVFormat) override { PipelineStream.DSVFormat = DSVFormat; }
1445 void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
1446 void RasterizerState1Cb(const D3D12_RASTERIZER_DESC1& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
1447 void RasterizerState2Cb(const D3D12_RASTERIZER_DESC2& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
1448 void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override { PipelineStream.RTVFormats = RTVFormats; }
1449 void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override { PipelineStream.SampleDesc = SampleDesc; }
1450 void SampleMaskCb(UINT SampleMask) override { PipelineStream.SampleMask = SampleMask; }
1451 void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override { PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc); }
1452 void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override { PipelineStream.CachedPSO = CachedPSO; }
1453 void FinalizeCb() override
1454 {
1455 if (!SeenDSS && PipelineStream.DSVFormat != DXGI_FORMAT_UNKNOWN)
1456 {
1457 // Re-enable depth for the default state.
1458 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = true;
1459 }
1460 if (!SeenTopology && SeenMS)
1461 {
1462 PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED;
1463 }
1464 }
1465 void SerializedRootSignatureCb(const D3D12_SERIALIZED_ROOT_SIGNATURE_DESC& SerializedRootSignature) override { PipelineStream.SerializedRootSignature = CD3DX12_SERIALIZED_ROOT_SIGNATURE_DESC(SerializedRootSignature); }
1466
1467private:
1468 bool SeenDSS;
1469 bool SeenMS;
1470 bool SeenTopology;
1471};
1472#endif // D3D12_SDK_VERSION >= 618
1473
1474struct CD3DX12_PIPELINE_STATE_STREAM_PARSE_HELPER : public ID3DX12PipelineParserCallbacks
1475{
1476 CD3DX12_PIPELINE_STATE_STREAM1 PipelineStream;
1477 CD3DX12_PIPELINE_STATE_STREAM_PARSE_HELPER() noexcept
1478 : SeenDSS(false)
1479 {
1480 // Adjust defaults to account for absent members.
1481 PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
1482
1483 // Depth disabled if no DSV format specified.
1484 static_cast<D3D12_DEPTH_STENCIL_DESC1&>(PipelineStream.DepthStencilState).DepthEnable = false;
1485 }
1486
1487 // ID3DX12PipelineParserCallbacks
1488 void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override {PipelineStream.Flags = Flags;}
1489 void NodeMaskCb(UINT NodeMask) override {PipelineStream.NodeMask = NodeMask;}
1490 void RootSignatureCb(ID3D12RootSignature* pRootSignature) override {PipelineStream.pRootSignature = pRootSignature;}
1491 void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override {PipelineStream.InputLayout = InputLayout;}
1492 void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override {PipelineStream.IBStripCutValue = IBStripCutValue;}
1493 void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override {PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType;}
1494 void VSCb(const D3D12_SHADER_BYTECODE& VS) override {PipelineStream.VS = VS;}
1495 void GSCb(const D3D12_SHADER_BYTECODE& GS) override {PipelineStream.GS = GS;}
1496 void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override {PipelineStream.StreamOutput = StreamOutput;}
1497 void HSCb(const D3D12_SHADER_BYTECODE& HS) override {PipelineStream.HS = HS;}
1498 void DSCb(const D3D12_SHADER_BYTECODE& DS) override {PipelineStream.DS = DS;}
1499 void PSCb(const D3D12_SHADER_BYTECODE& PS) override {PipelineStream.PS = PS;}
1500 void CSCb(const D3D12_SHADER_BYTECODE& CS) override {PipelineStream.CS = CS;}
1501 void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override {PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState);}
1502 void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override
1503 {
1504 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(DepthStencilState);
1505 SeenDSS = true;
1506 }
1507 void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override
1508 {
1509 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(DepthStencilState);
1510 SeenDSS = true;
1511 }
1512 void DSVFormatCb(DXGI_FORMAT DSVFormat) override
1513 {
1514 PipelineStream.DSVFormat = DSVFormat;
1515 if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN)
1516 {
1517 // Re-enable depth for the default state.
1518 static_cast<D3D12_DEPTH_STENCIL_DESC1&>(PipelineStream.DepthStencilState).DepthEnable = true;
1519 }
1520 }
1521 void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override {PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC(RasterizerState);}
1522 void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override {PipelineStream.RTVFormats = RTVFormats;}
1523 void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override {PipelineStream.SampleDesc = SampleDesc;}
1524 void SampleMaskCb(UINT SampleMask) override {PipelineStream.SampleMask = SampleMask;}
1525 void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override {PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc);}
1526 void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override {PipelineStream.CachedPSO = CachedPSO;}
1527
1528private:
1529 bool SeenDSS;
1530};
1531
1532
1533inline D3D12_PIPELINE_STATE_SUBOBJECT_TYPE D3DX12GetBaseSubobjectType(D3D12_PIPELINE_STATE_SUBOBJECT_TYPE SubobjectType) noexcept
1534{
1535 switch (SubobjectType)
1536 {
1537 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL1:
1538 return D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL;
1539#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
1540 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL2:
1541 return D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL;
1542#endif
1543#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
1544 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER1:
1545 return D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER;
1546#endif
1547 default:
1548 return SubobjectType;
1549 }
1550}
1551
1552inline HRESULT D3DX12ParsePipelineStream(const D3D12_PIPELINE_STATE_STREAM_DESC& Desc, ID3DX12PipelineParserCallbacks* pCallbacks)
1553{
1554 if (pCallbacks == nullptr)
1555 {
1556 return E_INVALIDARG;
1557 }
1558
1559 if (Desc.SizeInBytes == 0 || Desc.pPipelineStateSubobjectStream == nullptr)
1560 {
1561 pCallbacks->ErrorBadInputParameter(1); // first parameter issue
1562 return E_INVALIDARG;
1563 }
1564
1565 bool SubobjectSeen[D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MAX_VALID] = {};
1566 for (SIZE_T CurOffset = 0, SizeOfSubobject = 0; CurOffset < Desc.SizeInBytes; CurOffset += SizeOfSubobject)
1567 {
1568 BYTE* pStream = static_cast<BYTE*>(Desc.pPipelineStateSubobjectStream)+CurOffset;
1569 auto SubobjectType = *reinterpret_cast<D3D12_PIPELINE_STATE_SUBOBJECT_TYPE*>(pStream);
1570 if (SubobjectType < 0 || SubobjectType >= D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MAX_VALID)
1571 {
1572 pCallbacks->ErrorUnknownSubobject(SubobjectType);
1573 return E_INVALIDARG;
1574 }
1575 if (SubobjectSeen[D3DX12GetBaseSubobjectType(SubobjectType)])
1576 {
1577 pCallbacks->ErrorDuplicateSubobject(SubobjectType);
1578 return E_INVALIDARG; // disallow subobject duplicates in a stream
1579 }
1580 SubobjectSeen[SubobjectType] = true;
1581 switch (SubobjectType)
1582 {
1583 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_ROOT_SIGNATURE:
1584 pCallbacks->RootSignatureCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::pRootSignature)*>(pStream));
1585 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::pRootSignature);
1586 break;
1587 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VS:
1588 pCallbacks->VSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::VS)*>(pStream));
1589 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::VS);
1590 break;
1591 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PS:
1592 pCallbacks->PSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::PS)*>(pStream));
1593 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::PS);
1594 break;
1595 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DS:
1596 pCallbacks->DSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::DS)*>(pStream));
1597 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::DS);
1598 break;
1599 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_HS:
1600 pCallbacks->HSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::HS)*>(pStream));
1601 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::HS);
1602 break;
1603 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_GS:
1604 pCallbacks->GSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::GS)*>(pStream));
1605 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::GS);
1606 break;
1607 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CS:
1608 pCallbacks->CSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::CS)*>(pStream));
1609 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::CS);
1610 break;
1611 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_AS:
1612 pCallbacks->ASCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM2::AS)*>(pStream));
1613 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM2::AS);
1614 break;
1615 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MS:
1616 pCallbacks->MSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM2::MS)*>(pStream));
1617 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM2::MS);
1618 break;
1619 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_STREAM_OUTPUT:
1620 pCallbacks->StreamOutputCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::StreamOutput)*>(pStream));
1621 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::StreamOutput);
1622 break;
1623 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_BLEND:
1624 pCallbacks->BlendStateCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::BlendState)*>(pStream));
1625 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::BlendState);
1626 break;
1627 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_MASK:
1628 pCallbacks->SampleMaskCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::SampleMask)*>(pStream));
1629 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::SampleMask);
1630 break;
1631 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER:
1632 pCallbacks->RasterizerStateCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::RasterizerState)*>(pStream));
1633 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::RasterizerState);
1634 break;
1635#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
1636 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER1:
1637 pCallbacks->RasterizerState1Cb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM4::RasterizerState)*>(pStream));
1638 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM4::RasterizerState);
1639 break;
1640#endif
1641#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
1642 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER2:
1643 pCallbacks->RasterizerState2Cb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM5::RasterizerState)*>(pStream));
1644 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM5::RasterizerState);
1645 break;
1646#endif
1647 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL:
1648 pCallbacks->DepthStencilStateCb(*reinterpret_cast<CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL*>(pStream));
1649 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL);
1650 break;
1651 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL1:
1652 pCallbacks->DepthStencilState1Cb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::DepthStencilState)*>(pStream));
1653 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::DepthStencilState);
1654 break;
1655#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
1656 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL2:
1657 pCallbacks->DepthStencilState2Cb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM3::DepthStencilState)*>(pStream));
1658 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM3::DepthStencilState);
1659 break;
1660#endif
1661 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_INPUT_LAYOUT:
1662 pCallbacks->InputLayoutCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::InputLayout)*>(pStream));
1663 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::InputLayout);
1664 break;
1665 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_IB_STRIP_CUT_VALUE:
1666 pCallbacks->IBStripCutValueCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::IBStripCutValue)*>(pStream));
1667 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::IBStripCutValue);
1668 break;
1669 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY:
1670 pCallbacks->PrimitiveTopologyTypeCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::PrimitiveTopologyType)*>(pStream));
1671 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::PrimitiveTopologyType);
1672 break;
1673 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RENDER_TARGET_FORMATS:
1674 pCallbacks->RTVFormatsCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::RTVFormats)*>(pStream));
1675 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::RTVFormats);
1676 break;
1677 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL_FORMAT:
1678 pCallbacks->DSVFormatCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::DSVFormat)*>(pStream));
1679 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::DSVFormat);
1680 break;
1681 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_DESC:
1682 pCallbacks->SampleDescCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::SampleDesc)*>(pStream));
1683 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::SampleDesc);
1684 break;
1685 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_NODE_MASK:
1686 pCallbacks->NodeMaskCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::NodeMask)*>(pStream));
1687 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::NodeMask);
1688 break;
1689 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CACHED_PSO:
1690 pCallbacks->CachedPSOCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::CachedPSO)*>(pStream));
1691 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::CachedPSO);
1692 break;
1693 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_FLAGS:
1694 pCallbacks->FlagsCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::Flags)*>(pStream));
1695 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::Flags);
1696 break;
1697 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VIEW_INSTANCING:
1698 pCallbacks->ViewInstancingCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM1::ViewInstancingDesc)*>(pStream));
1699 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM1::ViewInstancingDesc);
1700 break;
1701#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 618)
1702 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SERIALIZED_ROOT_SIGNATURE:
1703 pCallbacks->SerializedRootSignatureCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM6::SerializedRootSignature)*>(pStream));
1704 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM6::SerializedRootSignature);
1705 break;
1706#endif
1707 default:
1708 pCallbacks->ErrorUnknownSubobject(SubobjectType);
1709 return E_INVALIDARG;
1710 }
1711 }
1712#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 613)
1713 pCallbacks->FinalizeCb();
1714#endif
1715
1716 return S_OK;
1717}
1718