Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/directx_headers/include/directx/d3dx12_pipeline_state_stream.h
9906 views
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 "d3d12.h"
15
#include "d3dx12_default.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
25
struct DefaultSampleMask { operator UINT() noexcept { return UINT_MAX; } };
26
struct DefaultSampleDesc { operator DXGI_SAMPLE_DESC() noexcept { return DXGI_SAMPLE_DESC{1, 0}; } };
27
28
#if defined(_MSC_VER)
29
#pragma warning(push)
30
#pragma warning(disable : 4324)
31
#endif
32
template <typename InnerStructType, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE Type, typename DefaultArg = InnerStructType>
33
class alignas(void*) CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT
34
{
35
private:
36
D3D12_PIPELINE_STATE_SUBOBJECT_TYPE pssType;
37
InnerStructType pssInner;
38
public:
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
#if defined(_MSC_VER)
48
#pragma warning(pop)
49
#endif
50
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_PIPELINE_STATE_FLAGS, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_FLAGS> CD3DX12_PIPELINE_STATE_STREAM_FLAGS;
51
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< UINT, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_NODE_MASK> CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK;
52
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< ID3D12RootSignature*, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_ROOT_SIGNATURE> CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE;
53
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_INPUT_LAYOUT_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_INPUT_LAYOUT> CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT;
54
typedef 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;
55
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_PRIMITIVE_TOPOLOGY_TYPE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY> CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY;
56
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VS> CD3DX12_PIPELINE_STATE_STREAM_VS;
57
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_GS> CD3DX12_PIPELINE_STATE_STREAM_GS;
58
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_STREAM_OUTPUT_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_STREAM_OUTPUT> CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT;
59
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_HS> CD3DX12_PIPELINE_STATE_STREAM_HS;
60
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DS> CD3DX12_PIPELINE_STATE_STREAM_DS;
61
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PS> CD3DX12_PIPELINE_STATE_STREAM_PS;
62
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_AS> CD3DX12_PIPELINE_STATE_STREAM_AS;
63
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MS> CD3DX12_PIPELINE_STATE_STREAM_MS;
64
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CS> CD3DX12_PIPELINE_STATE_STREAM_CS;
65
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_BLEND_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_BLEND, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC;
66
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_DEPTH_STENCIL_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL;
67
typedef 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)
69
typedef 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
71
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< DXGI_FORMAT, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL_FORMAT> CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT;
72
typedef 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)
74
typedef 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)
77
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_RASTERIZER_DESC2, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER2, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER2;
78
#endif
79
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_RT_FORMAT_ARRAY, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RENDER_TARGET_FORMATS> CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS;
80
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< DXGI_SAMPLE_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_DESC, DefaultSampleDesc> CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC;
81
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< UINT, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_MASK, DefaultSampleMask> CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK;
82
typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_CACHED_PIPELINE_STATE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CACHED_PSO> CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO;
83
typedef 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
85
//------------------------------------------------------------------------------------------------
86
// Stream Parser Helpers
87
88
struct ID3DX12PipelineParserCallbacks
89
{
90
// Subobject Callbacks
91
virtual void FlagsCb(D3D12_PIPELINE_STATE_FLAGS) {}
92
virtual void NodeMaskCb(UINT) {}
93
virtual void RootSignatureCb(ID3D12RootSignature*) {}
94
virtual void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC&) {}
95
virtual void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE) {}
96
virtual void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE) {}
97
virtual void VSCb(const D3D12_SHADER_BYTECODE&) {}
98
virtual void GSCb(const D3D12_SHADER_BYTECODE&) {}
99
virtual void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC&) {}
100
virtual void HSCb(const D3D12_SHADER_BYTECODE&) {}
101
virtual void DSCb(const D3D12_SHADER_BYTECODE&) {}
102
virtual void PSCb(const D3D12_SHADER_BYTECODE&) {}
103
virtual void CSCb(const D3D12_SHADER_BYTECODE&) {}
104
virtual void ASCb(const D3D12_SHADER_BYTECODE&) {}
105
virtual void MSCb(const D3D12_SHADER_BYTECODE&) {}
106
virtual void BlendStateCb(const D3D12_BLEND_DESC&) {}
107
virtual void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC&) {}
108
virtual void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1&) {}
109
#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
110
virtual void DepthStencilState2Cb(const D3D12_DEPTH_STENCIL_DESC2&) {}
111
#endif
112
virtual void DSVFormatCb(DXGI_FORMAT) {}
113
virtual void RasterizerStateCb(const D3D12_RASTERIZER_DESC&) {}
114
#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
115
virtual void RasterizerState1Cb(const D3D12_RASTERIZER_DESC1&) {}
116
#endif
117
#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
118
virtual void RasterizerState2Cb(const D3D12_RASTERIZER_DESC2&) {}
119
#endif
120
virtual void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY&) {}
121
virtual void SampleDescCb(const DXGI_SAMPLE_DESC&) {}
122
virtual void SampleMaskCb(UINT) {}
123
virtual void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC&) {}
124
virtual void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE&) {}
125
126
// Error Callbacks
127
virtual void ErrorBadInputParameter(UINT /*ParameterIndex*/) {}
128
virtual void ErrorDuplicateSubobject(D3D12_PIPELINE_STATE_SUBOBJECT_TYPE /*DuplicateType*/) {}
129
virtual void ErrorUnknownSubobject(UINT /*UnknownTypeValue*/) {}
130
131
virtual ~ID3DX12PipelineParserCallbacks() = default;
132
};
133
134
struct D3DX12_MESH_SHADER_PIPELINE_STATE_DESC
135
{
136
ID3D12RootSignature* pRootSignature;
137
D3D12_SHADER_BYTECODE AS;
138
D3D12_SHADER_BYTECODE MS;
139
D3D12_SHADER_BYTECODE PS;
140
D3D12_BLEND_DESC BlendState;
141
UINT SampleMask;
142
D3D12_RASTERIZER_DESC RasterizerState;
143
D3D12_DEPTH_STENCIL_DESC DepthStencilState;
144
D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType;
145
UINT NumRenderTargets;
146
DXGI_FORMAT RTVFormats[ D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT ];
147
DXGI_FORMAT DSVFormat;
148
DXGI_SAMPLE_DESC SampleDesc;
149
UINT NodeMask;
150
D3D12_CACHED_PIPELINE_STATE CachedPSO;
151
D3D12_PIPELINE_STATE_FLAGS Flags;
152
};
153
154
#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
155
// Use CD3DX12_PIPELINE_STATE_STREAM5 for D3D12_RASTERIZER_DESC2 when CheckFeatureSupport returns true for Options19::RasterizerDesc2Supported is true
156
// Use CD3DX12_PIPELINE_STATE_STREAM4 for D3D12_RASTERIZER_DESC1 when CheckFeatureSupport returns true for Options16::DynamicDepthBiasSupported is true
157
// Use CD3DX12_PIPELINE_STATE_STREAM3 for D3D12_DEPTH_STENCIL_DESC2 when CheckFeatureSupport returns true for Options14::IndependentFrontAndBackStencilSupported is true
158
// Use CD3DX12_PIPELINE_STATE_STREAM2 for OS Build 19041+ (where there is a new mesh shader pipeline).
159
// Use CD3DX12_PIPELINE_STATE_STREAM1 for OS Build 16299+ (where there is a new view instancing subobject).
160
// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.
161
struct CD3DX12_PIPELINE_STATE_STREAM5
162
{
163
CD3DX12_PIPELINE_STATE_STREAM5() = default;
164
// Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC
165
CD3DX12_PIPELINE_STATE_STREAM5(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept
166
: Flags(Desc.Flags)
167
, NodeMask(Desc.NodeMask)
168
, pRootSignature(Desc.pRootSignature)
169
, InputLayout(Desc.InputLayout)
170
, IBStripCutValue(Desc.IBStripCutValue)
171
, PrimitiveTopologyType(Desc.PrimitiveTopologyType)
172
, VS(Desc.VS)
173
, GS(Desc.GS)
174
, StreamOutput(Desc.StreamOutput)
175
, HS(Desc.HS)
176
, DS(Desc.DS)
177
, PS(Desc.PS)
178
, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
179
, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))
180
, DSVFormat(Desc.DSVFormat)
181
, RasterizerState(CD3DX12_RASTERIZER_DESC2(Desc.RasterizerState))
182
, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
183
, SampleDesc(Desc.SampleDesc)
184
, SampleMask(Desc.SampleMask)
185
, CachedPSO(Desc.CachedPSO)
186
, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
187
{}
188
CD3DX12_PIPELINE_STATE_STREAM5(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept
189
: Flags(Desc.Flags)
190
, NodeMask(Desc.NodeMask)
191
, pRootSignature(Desc.pRootSignature)
192
, PrimitiveTopologyType(Desc.PrimitiveTopologyType)
193
, PS(Desc.PS)
194
, AS(Desc.AS)
195
, MS(Desc.MS)
196
, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
197
, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))
198
, DSVFormat(Desc.DSVFormat)
199
, RasterizerState(CD3DX12_RASTERIZER_DESC2(Desc.RasterizerState))
200
, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
201
, SampleDesc(Desc.SampleDesc)
202
, SampleMask(Desc.SampleMask)
203
, CachedPSO(Desc.CachedPSO)
204
, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
205
{}
206
CD3DX12_PIPELINE_STATE_STREAM5(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept
207
: Flags(Desc.Flags)
208
, NodeMask(Desc.NodeMask)
209
, pRootSignature(Desc.pRootSignature)
210
, CS(CD3DX12_SHADER_BYTECODE(Desc.CS))
211
, CachedPSO(Desc.CachedPSO)
212
{
213
static_cast<D3D12_DEPTH_STENCIL_DESC2&>(DepthStencilState).DepthEnable = false;
214
}
215
CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
216
CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
217
CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
218
CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;
219
CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;
220
CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
221
CD3DX12_PIPELINE_STATE_STREAM_VS VS;
222
CD3DX12_PIPELINE_STATE_STREAM_GS GS;
223
CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;
224
CD3DX12_PIPELINE_STATE_STREAM_HS HS;
225
CD3DX12_PIPELINE_STATE_STREAM_DS DS;
226
CD3DX12_PIPELINE_STATE_STREAM_PS PS;
227
CD3DX12_PIPELINE_STATE_STREAM_AS AS;
228
CD3DX12_PIPELINE_STATE_STREAM_MS MS;
229
CD3DX12_PIPELINE_STATE_STREAM_CS CS;
230
CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
231
CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL2 DepthStencilState;
232
CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
233
CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER2 RasterizerState;
234
CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
235
CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
236
CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
237
CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
238
CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;
239
240
D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept
241
{
242
D3D12_GRAPHICS_PIPELINE_STATE_DESC D;
243
D.Flags = this->Flags;
244
D.NodeMask = this->NodeMask;
245
D.pRootSignature = this->pRootSignature;
246
D.InputLayout = this->InputLayout;
247
D.IBStripCutValue = this->IBStripCutValue;
248
D.PrimitiveTopologyType = this->PrimitiveTopologyType;
249
D.VS = this->VS;
250
D.GS = this->GS;
251
D.StreamOutput = this->StreamOutput;
252
D.HS = this->HS;
253
D.DS = this->DS;
254
D.PS = this->PS;
255
D.BlendState = this->BlendState;
256
D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(D3D12_DEPTH_STENCIL_DESC2(this->DepthStencilState));
257
D.DSVFormat = this->DSVFormat;
258
D.RasterizerState = CD3DX12_RASTERIZER_DESC2(D3D12_RASTERIZER_DESC2(this->RasterizerState));
259
D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
260
memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
261
D.SampleDesc = this->SampleDesc;
262
D.SampleMask = this->SampleMask;
263
D.CachedPSO = this->CachedPSO;
264
return D;
265
}
266
D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept
267
{
268
D3D12_COMPUTE_PIPELINE_STATE_DESC D;
269
D.Flags = this->Flags;
270
D.NodeMask = this->NodeMask;
271
D.pRootSignature = this->pRootSignature;
272
D.CS = this->CS;
273
D.CachedPSO = this->CachedPSO;
274
return D;
275
}
276
};
277
#endif // D3D12_SDK_VERSION >= 610
278
279
#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
280
// Use CD3DX12_PIPELINE_STATE_STREAM4 for D3D12_RASTERIZER_DESC1 when CheckFeatureSupport returns true for Options16::DynamicDepthBiasSupported is true
281
// Use CD3DX12_PIPELINE_STATE_STREAM3 for D3D12_DEPTH_STENCIL_DESC2 when CheckFeatureSupport returns true for Options14::IndependentFrontAndBackStencilSupported is true
282
// Use CD3DX12_PIPELINE_STATE_STREAM2 for OS Build 19041+ (where there is a new mesh shader pipeline).
283
// Use CD3DX12_PIPELINE_STATE_STREAM1 for OS Build 16299+ (where there is a new view instancing subobject).
284
// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.
285
struct CD3DX12_PIPELINE_STATE_STREAM4
286
{
287
CD3DX12_PIPELINE_STATE_STREAM4() = default;
288
// Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC
289
CD3DX12_PIPELINE_STATE_STREAM4(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept
290
: Flags(Desc.Flags)
291
, NodeMask(Desc.NodeMask)
292
, pRootSignature(Desc.pRootSignature)
293
, InputLayout(Desc.InputLayout)
294
, IBStripCutValue(Desc.IBStripCutValue)
295
, PrimitiveTopologyType(Desc.PrimitiveTopologyType)
296
, VS(Desc.VS)
297
, GS(Desc.GS)
298
, StreamOutput(Desc.StreamOutput)
299
, HS(Desc.HS)
300
, DS(Desc.DS)
301
, PS(Desc.PS)
302
, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
303
, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))
304
, DSVFormat(Desc.DSVFormat)
305
, RasterizerState(CD3DX12_RASTERIZER_DESC1(Desc.RasterizerState))
306
, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
307
, SampleDesc(Desc.SampleDesc)
308
, SampleMask(Desc.SampleMask)
309
, CachedPSO(Desc.CachedPSO)
310
, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
311
{}
312
CD3DX12_PIPELINE_STATE_STREAM4(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept
313
: Flags(Desc.Flags)
314
, NodeMask(Desc.NodeMask)
315
, pRootSignature(Desc.pRootSignature)
316
, PrimitiveTopologyType(Desc.PrimitiveTopologyType)
317
, PS(Desc.PS)
318
, AS(Desc.AS)
319
, MS(Desc.MS)
320
, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
321
, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))
322
, DSVFormat(Desc.DSVFormat)
323
, RasterizerState(CD3DX12_RASTERIZER_DESC1(Desc.RasterizerState))
324
, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
325
, SampleDesc(Desc.SampleDesc)
326
, SampleMask(Desc.SampleMask)
327
, CachedPSO(Desc.CachedPSO)
328
, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
329
{}
330
CD3DX12_PIPELINE_STATE_STREAM4(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept
331
: Flags(Desc.Flags)
332
, NodeMask(Desc.NodeMask)
333
, pRootSignature(Desc.pRootSignature)
334
, CS(CD3DX12_SHADER_BYTECODE(Desc.CS))
335
, CachedPSO(Desc.CachedPSO)
336
{
337
static_cast<D3D12_DEPTH_STENCIL_DESC2&>(DepthStencilState).DepthEnable = false;
338
}
339
CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
340
CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
341
CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
342
CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;
343
CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;
344
CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
345
CD3DX12_PIPELINE_STATE_STREAM_VS VS;
346
CD3DX12_PIPELINE_STATE_STREAM_GS GS;
347
CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;
348
CD3DX12_PIPELINE_STATE_STREAM_HS HS;
349
CD3DX12_PIPELINE_STATE_STREAM_DS DS;
350
CD3DX12_PIPELINE_STATE_STREAM_PS PS;
351
CD3DX12_PIPELINE_STATE_STREAM_AS AS;
352
CD3DX12_PIPELINE_STATE_STREAM_MS MS;
353
CD3DX12_PIPELINE_STATE_STREAM_CS CS;
354
CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
355
CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL2 DepthStencilState;
356
CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
357
CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER1 RasterizerState;
358
CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
359
CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
360
CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
361
CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
362
CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;
363
364
D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept
365
{
366
D3D12_GRAPHICS_PIPELINE_STATE_DESC D;
367
D.Flags = this->Flags;
368
D.NodeMask = this->NodeMask;
369
D.pRootSignature = this->pRootSignature;
370
D.InputLayout = this->InputLayout;
371
D.IBStripCutValue = this->IBStripCutValue;
372
D.PrimitiveTopologyType = this->PrimitiveTopologyType;
373
D.VS = this->VS;
374
D.GS = this->GS;
375
D.StreamOutput = this->StreamOutput;
376
D.HS = this->HS;
377
D.DS = this->DS;
378
D.PS = this->PS;
379
D.BlendState = this->BlendState;
380
D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(D3D12_DEPTH_STENCIL_DESC2(this->DepthStencilState));
381
D.DSVFormat = this->DSVFormat;
382
D.RasterizerState = CD3DX12_RASTERIZER_DESC1(D3D12_RASTERIZER_DESC1(this->RasterizerState));
383
D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
384
memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
385
D.SampleDesc = this->SampleDesc;
386
D.SampleMask = this->SampleMask;
387
D.CachedPSO = this->CachedPSO;
388
return D;
389
}
390
D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept
391
{
392
D3D12_COMPUTE_PIPELINE_STATE_DESC D;
393
D.Flags = this->Flags;
394
D.NodeMask = this->NodeMask;
395
D.pRootSignature = this->pRootSignature;
396
D.CS = this->CS;
397
D.CachedPSO = this->CachedPSO;
398
return D;
399
}
400
};
401
#endif // D3D12_SDK_VERSION >= 608
402
403
#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
404
// Use CD3DX12_PIPELINE_STATE_STREAM3 for D3D12_DEPTH_STENCIL_DESC2 when CheckFeatureSupport returns true for Options14::IndependentFrontAndBackStencilSupported is true
405
// Use CD3DX12_PIPELINE_STATE_STREAM2 for OS Build 19041+ (where there is a new mesh shader pipeline).
406
// Use CD3DX12_PIPELINE_STATE_STREAM1 for OS Build 16299+ (where there is a new view instancing subobject).
407
// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.
408
struct CD3DX12_PIPELINE_STATE_STREAM3
409
{
410
CD3DX12_PIPELINE_STATE_STREAM3() = default;
411
// Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC
412
CD3DX12_PIPELINE_STATE_STREAM3(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept
413
: Flags(Desc.Flags)
414
, NodeMask(Desc.NodeMask)
415
, pRootSignature(Desc.pRootSignature)
416
, InputLayout(Desc.InputLayout)
417
, IBStripCutValue(Desc.IBStripCutValue)
418
, PrimitiveTopologyType(Desc.PrimitiveTopologyType)
419
, VS(Desc.VS)
420
, GS(Desc.GS)
421
, StreamOutput(Desc.StreamOutput)
422
, HS(Desc.HS)
423
, DS(Desc.DS)
424
, PS(Desc.PS)
425
, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
426
, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))
427
, DSVFormat(Desc.DSVFormat)
428
, RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
429
, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
430
, SampleDesc(Desc.SampleDesc)
431
, SampleMask(Desc.SampleMask)
432
, CachedPSO(Desc.CachedPSO)
433
, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
434
{}
435
CD3DX12_PIPELINE_STATE_STREAM3(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept
436
: Flags(Desc.Flags)
437
, NodeMask(Desc.NodeMask)
438
, pRootSignature(Desc.pRootSignature)
439
, PrimitiveTopologyType(Desc.PrimitiveTopologyType)
440
, PS(Desc.PS)
441
, AS(Desc.AS)
442
, MS(Desc.MS)
443
, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
444
, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))
445
, DSVFormat(Desc.DSVFormat)
446
, RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
447
, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
448
, SampleDesc(Desc.SampleDesc)
449
, SampleMask(Desc.SampleMask)
450
, CachedPSO(Desc.CachedPSO)
451
, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
452
{}
453
CD3DX12_PIPELINE_STATE_STREAM3(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept
454
: Flags(Desc.Flags)
455
, NodeMask(Desc.NodeMask)
456
, pRootSignature(Desc.pRootSignature)
457
, CS(CD3DX12_SHADER_BYTECODE(Desc.CS))
458
, CachedPSO(Desc.CachedPSO)
459
{
460
static_cast<D3D12_DEPTH_STENCIL_DESC2&>(DepthStencilState).DepthEnable = false;
461
}
462
CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
463
CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
464
CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
465
CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;
466
CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;
467
CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
468
CD3DX12_PIPELINE_STATE_STREAM_VS VS;
469
CD3DX12_PIPELINE_STATE_STREAM_GS GS;
470
CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;
471
CD3DX12_PIPELINE_STATE_STREAM_HS HS;
472
CD3DX12_PIPELINE_STATE_STREAM_DS DS;
473
CD3DX12_PIPELINE_STATE_STREAM_PS PS;
474
CD3DX12_PIPELINE_STATE_STREAM_AS AS;
475
CD3DX12_PIPELINE_STATE_STREAM_MS MS;
476
CD3DX12_PIPELINE_STATE_STREAM_CS CS;
477
CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
478
CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL2 DepthStencilState;
479
CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
480
CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;
481
CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
482
CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
483
CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
484
CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
485
CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;
486
487
D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept
488
{
489
D3D12_GRAPHICS_PIPELINE_STATE_DESC D;
490
D.Flags = this->Flags;
491
D.NodeMask = this->NodeMask;
492
D.pRootSignature = this->pRootSignature;
493
D.InputLayout = this->InputLayout;
494
D.IBStripCutValue = this->IBStripCutValue;
495
D.PrimitiveTopologyType = this->PrimitiveTopologyType;
496
D.VS = this->VS;
497
D.GS = this->GS;
498
D.StreamOutput = this->StreamOutput;
499
D.HS = this->HS;
500
D.DS = this->DS;
501
D.PS = this->PS;
502
D.BlendState = this->BlendState;
503
D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(D3D12_DEPTH_STENCIL_DESC2(this->DepthStencilState));
504
D.DSVFormat = this->DSVFormat;
505
D.RasterizerState = this->RasterizerState;
506
D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
507
memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
508
D.SampleDesc = this->SampleDesc;
509
D.SampleMask = this->SampleMask;
510
D.CachedPSO = this->CachedPSO;
511
return D;
512
}
513
D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept
514
{
515
D3D12_COMPUTE_PIPELINE_STATE_DESC D;
516
D.Flags = this->Flags;
517
D.NodeMask = this->NodeMask;
518
D.pRootSignature = this->pRootSignature;
519
D.CS = this->CS;
520
D.CachedPSO = this->CachedPSO;
521
return D;
522
}
523
};
524
#endif // D3D12_SDK_VERSION >= 606
525
526
// CD3DX12_PIPELINE_STATE_STREAM2 Works on OS Build 19041+ (where there is a new mesh shader pipeline).
527
// Use CD3DX12_PIPELINE_STATE_STREAM1 for OS Build 16299+ (where there is a new view instancing subobject).
528
// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.
529
struct CD3DX12_PIPELINE_STATE_STREAM2
530
{
531
CD3DX12_PIPELINE_STATE_STREAM2() = default;
532
// Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC
533
CD3DX12_PIPELINE_STATE_STREAM2(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept
534
: Flags(Desc.Flags)
535
, NodeMask(Desc.NodeMask)
536
, pRootSignature(Desc.pRootSignature)
537
, InputLayout(Desc.InputLayout)
538
, IBStripCutValue(Desc.IBStripCutValue)
539
, PrimitiveTopologyType(Desc.PrimitiveTopologyType)
540
, VS(Desc.VS)
541
, GS(Desc.GS)
542
, StreamOutput(Desc.StreamOutput)
543
, HS(Desc.HS)
544
, DS(Desc.DS)
545
, PS(Desc.PS)
546
, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
547
, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))
548
, DSVFormat(Desc.DSVFormat)
549
, RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
550
, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
551
, SampleDesc(Desc.SampleDesc)
552
, SampleMask(Desc.SampleMask)
553
, CachedPSO(Desc.CachedPSO)
554
, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
555
{}
556
CD3DX12_PIPELINE_STATE_STREAM2(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept
557
: Flags(Desc.Flags)
558
, NodeMask(Desc.NodeMask)
559
, pRootSignature(Desc.pRootSignature)
560
, PrimitiveTopologyType(Desc.PrimitiveTopologyType)
561
, PS(Desc.PS)
562
, AS(Desc.AS)
563
, MS(Desc.MS)
564
, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
565
, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))
566
, DSVFormat(Desc.DSVFormat)
567
, RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
568
, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
569
, SampleDesc(Desc.SampleDesc)
570
, SampleMask(Desc.SampleMask)
571
, CachedPSO(Desc.CachedPSO)
572
, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
573
{}
574
CD3DX12_PIPELINE_STATE_STREAM2(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept
575
: Flags(Desc.Flags)
576
, NodeMask(Desc.NodeMask)
577
, pRootSignature(Desc.pRootSignature)
578
, CS(CD3DX12_SHADER_BYTECODE(Desc.CS))
579
, CachedPSO(Desc.CachedPSO)
580
{
581
static_cast<D3D12_DEPTH_STENCIL_DESC1&>(DepthStencilState).DepthEnable = false;
582
}
583
CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
584
CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
585
CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
586
CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;
587
CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;
588
CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
589
CD3DX12_PIPELINE_STATE_STREAM_VS VS;
590
CD3DX12_PIPELINE_STATE_STREAM_GS GS;
591
CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;
592
CD3DX12_PIPELINE_STATE_STREAM_HS HS;
593
CD3DX12_PIPELINE_STATE_STREAM_DS DS;
594
CD3DX12_PIPELINE_STATE_STREAM_PS PS;
595
CD3DX12_PIPELINE_STATE_STREAM_AS AS;
596
CD3DX12_PIPELINE_STATE_STREAM_MS MS;
597
CD3DX12_PIPELINE_STATE_STREAM_CS CS;
598
CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
599
CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState;
600
CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
601
CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;
602
CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
603
CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
604
CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
605
CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
606
CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;
607
D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept
608
{
609
D3D12_GRAPHICS_PIPELINE_STATE_DESC D;
610
D.Flags = this->Flags;
611
D.NodeMask = this->NodeMask;
612
D.pRootSignature = this->pRootSignature;
613
D.InputLayout = this->InputLayout;
614
D.IBStripCutValue = this->IBStripCutValue;
615
D.PrimitiveTopologyType = this->PrimitiveTopologyType;
616
D.VS = this->VS;
617
D.GS = this->GS;
618
D.StreamOutput = this->StreamOutput;
619
D.HS = this->HS;
620
D.DS = this->DS;
621
D.PS = this->PS;
622
D.BlendState = this->BlendState;
623
D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState));
624
D.DSVFormat = this->DSVFormat;
625
D.RasterizerState = this->RasterizerState;
626
D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
627
memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
628
D.SampleDesc = this->SampleDesc;
629
D.SampleMask = this->SampleMask;
630
D.CachedPSO = this->CachedPSO;
631
return D;
632
}
633
D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept
634
{
635
D3D12_COMPUTE_PIPELINE_STATE_DESC D;
636
D.Flags = this->Flags;
637
D.NodeMask = this->NodeMask;
638
D.pRootSignature = this->pRootSignature;
639
D.CS = this->CS;
640
D.CachedPSO = this->CachedPSO;
641
return D;
642
}
643
};
644
645
// CD3DX12_PIPELINE_STATE_STREAM1 Works on OS Build 16299+ (where there is a new view instancing subobject).
646
// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.
647
struct CD3DX12_PIPELINE_STATE_STREAM1
648
{
649
CD3DX12_PIPELINE_STATE_STREAM1() = default;
650
// Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC
651
CD3DX12_PIPELINE_STATE_STREAM1(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept
652
: Flags(Desc.Flags)
653
, NodeMask(Desc.NodeMask)
654
, pRootSignature(Desc.pRootSignature)
655
, InputLayout(Desc.InputLayout)
656
, IBStripCutValue(Desc.IBStripCutValue)
657
, PrimitiveTopologyType(Desc.PrimitiveTopologyType)
658
, VS(Desc.VS)
659
, GS(Desc.GS)
660
, StreamOutput(Desc.StreamOutput)
661
, HS(Desc.HS)
662
, DS(Desc.DS)
663
, PS(Desc.PS)
664
, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
665
, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))
666
, DSVFormat(Desc.DSVFormat)
667
, RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
668
, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
669
, SampleDesc(Desc.SampleDesc)
670
, SampleMask(Desc.SampleMask)
671
, CachedPSO(Desc.CachedPSO)
672
, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
673
{}
674
CD3DX12_PIPELINE_STATE_STREAM1(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept
675
: Flags(Desc.Flags)
676
, NodeMask(Desc.NodeMask)
677
, pRootSignature(Desc.pRootSignature)
678
, PrimitiveTopologyType(Desc.PrimitiveTopologyType)
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_STREAM1(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept
691
: Flags(Desc.Flags)
692
, NodeMask(Desc.NodeMask)
693
, pRootSignature(Desc.pRootSignature)
694
, CS(CD3DX12_SHADER_BYTECODE(Desc.CS))
695
, CachedPSO(Desc.CachedPSO)
696
{
697
static_cast<D3D12_DEPTH_STENCIL_DESC1&>(DepthStencilState).DepthEnable = false;
698
}
699
CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
700
CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
701
CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
702
CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;
703
CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;
704
CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
705
CD3DX12_PIPELINE_STATE_STREAM_VS VS;
706
CD3DX12_PIPELINE_STATE_STREAM_GS GS;
707
CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;
708
CD3DX12_PIPELINE_STATE_STREAM_HS HS;
709
CD3DX12_PIPELINE_STATE_STREAM_DS DS;
710
CD3DX12_PIPELINE_STATE_STREAM_PS PS;
711
CD3DX12_PIPELINE_STATE_STREAM_CS CS;
712
CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
713
CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState;
714
CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
715
CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;
716
CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
717
CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
718
CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
719
CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
720
CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;
721
D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept
722
{
723
D3D12_GRAPHICS_PIPELINE_STATE_DESC D;
724
D.Flags = this->Flags;
725
D.NodeMask = this->NodeMask;
726
D.pRootSignature = this->pRootSignature;
727
D.InputLayout = this->InputLayout;
728
D.IBStripCutValue = this->IBStripCutValue;
729
D.PrimitiveTopologyType = this->PrimitiveTopologyType;
730
D.VS = this->VS;
731
D.GS = this->GS;
732
D.StreamOutput = this->StreamOutput;
733
D.HS = this->HS;
734
D.DS = this->DS;
735
D.PS = this->PS;
736
D.BlendState = this->BlendState;
737
D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState));
738
D.DSVFormat = this->DSVFormat;
739
D.RasterizerState = this->RasterizerState;
740
D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
741
memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
742
D.SampleDesc = this->SampleDesc;
743
D.SampleMask = this->SampleMask;
744
D.CachedPSO = this->CachedPSO;
745
return D;
746
}
747
D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept
748
{
749
D3D12_COMPUTE_PIPELINE_STATE_DESC D;
750
D.Flags = this->Flags;
751
D.NodeMask = this->NodeMask;
752
D.pRootSignature = this->pRootSignature;
753
D.CS = this->CS;
754
D.CachedPSO = this->CachedPSO;
755
return D;
756
}
757
};
758
759
760
struct CD3DX12_PIPELINE_MESH_STATE_STREAM
761
{
762
CD3DX12_PIPELINE_MESH_STATE_STREAM() = default;
763
CD3DX12_PIPELINE_MESH_STATE_STREAM(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept
764
: Flags(Desc.Flags)
765
, NodeMask(Desc.NodeMask)
766
, pRootSignature(Desc.pRootSignature)
767
, PS(Desc.PS)
768
, AS(Desc.AS)
769
, MS(Desc.MS)
770
, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
771
, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))
772
, DSVFormat(Desc.DSVFormat)
773
, RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
774
, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
775
, SampleDesc(Desc.SampleDesc)
776
, SampleMask(Desc.SampleMask)
777
, CachedPSO(Desc.CachedPSO)
778
, ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
779
{}
780
CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
781
CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
782
CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
783
CD3DX12_PIPELINE_STATE_STREAM_PS PS;
784
CD3DX12_PIPELINE_STATE_STREAM_AS AS;
785
CD3DX12_PIPELINE_STATE_STREAM_MS MS;
786
CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
787
CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState;
788
CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
789
CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;
790
CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
791
CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
792
CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
793
CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
794
CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;
795
D3DX12_MESH_SHADER_PIPELINE_STATE_DESC MeshShaderDescV0() const noexcept
796
{
797
D3DX12_MESH_SHADER_PIPELINE_STATE_DESC D;
798
D.Flags = this->Flags;
799
D.NodeMask = this->NodeMask;
800
D.pRootSignature = this->pRootSignature;
801
D.PS = this->PS;
802
D.AS = this->AS;
803
D.MS = this->MS;
804
D.BlendState = this->BlendState;
805
D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState));
806
D.DSVFormat = this->DSVFormat;
807
D.RasterizerState = this->RasterizerState;
808
D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
809
memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
810
D.SampleDesc = this->SampleDesc;
811
D.SampleMask = this->SampleMask;
812
D.CachedPSO = this->CachedPSO;
813
return D;
814
}
815
};
816
817
// CD3DX12_PIPELINE_STATE_STREAM works on OS Build 15063+ but does not support new subobject(s) added in OS Build 16299+.
818
// See CD3DX12_PIPELINE_STATE_STREAM1 for instance.
819
struct CD3DX12_PIPELINE_STATE_STREAM
820
{
821
CD3DX12_PIPELINE_STATE_STREAM() = default;
822
CD3DX12_PIPELINE_STATE_STREAM(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept
823
: Flags(Desc.Flags)
824
, NodeMask(Desc.NodeMask)
825
, pRootSignature(Desc.pRootSignature)
826
, InputLayout(Desc.InputLayout)
827
, IBStripCutValue(Desc.IBStripCutValue)
828
, PrimitiveTopologyType(Desc.PrimitiveTopologyType)
829
, VS(Desc.VS)
830
, GS(Desc.GS)
831
, StreamOutput(Desc.StreamOutput)
832
, HS(Desc.HS)
833
, DS(Desc.DS)
834
, PS(Desc.PS)
835
, BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
836
, DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))
837
, DSVFormat(Desc.DSVFormat)
838
, RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
839
, RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
840
, SampleDesc(Desc.SampleDesc)
841
, SampleMask(Desc.SampleMask)
842
, CachedPSO(Desc.CachedPSO)
843
{}
844
CD3DX12_PIPELINE_STATE_STREAM(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept
845
: Flags(Desc.Flags)
846
, NodeMask(Desc.NodeMask)
847
, pRootSignature(Desc.pRootSignature)
848
, CS(CD3DX12_SHADER_BYTECODE(Desc.CS))
849
, CachedPSO(Desc.CachedPSO)
850
{}
851
CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
852
CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
853
CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
854
CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;
855
CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;
856
CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
857
CD3DX12_PIPELINE_STATE_STREAM_VS VS;
858
CD3DX12_PIPELINE_STATE_STREAM_GS GS;
859
CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;
860
CD3DX12_PIPELINE_STATE_STREAM_HS HS;
861
CD3DX12_PIPELINE_STATE_STREAM_DS DS;
862
CD3DX12_PIPELINE_STATE_STREAM_PS PS;
863
CD3DX12_PIPELINE_STATE_STREAM_CS CS;
864
CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
865
CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState;
866
CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
867
CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;
868
CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
869
CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
870
CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
871
CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
872
D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept
873
{
874
D3D12_GRAPHICS_PIPELINE_STATE_DESC D;
875
D.Flags = this->Flags;
876
D.NodeMask = this->NodeMask;
877
D.pRootSignature = this->pRootSignature;
878
D.InputLayout = this->InputLayout;
879
D.IBStripCutValue = this->IBStripCutValue;
880
D.PrimitiveTopologyType = this->PrimitiveTopologyType;
881
D.VS = this->VS;
882
D.GS = this->GS;
883
D.StreamOutput = this->StreamOutput;
884
D.HS = this->HS;
885
D.DS = this->DS;
886
D.PS = this->PS;
887
D.BlendState = this->BlendState;
888
D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState));
889
D.DSVFormat = this->DSVFormat;
890
D.RasterizerState = this->RasterizerState;
891
D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
892
memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
893
D.SampleDesc = this->SampleDesc;
894
D.SampleMask = this->SampleMask;
895
D.CachedPSO = this->CachedPSO;
896
return D;
897
}
898
D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept
899
{
900
D3D12_COMPUTE_PIPELINE_STATE_DESC D;
901
D.Flags = this->Flags;
902
D.NodeMask = this->NodeMask;
903
D.pRootSignature = this->pRootSignature;
904
D.CS = this->CS;
905
D.CachedPSO = this->CachedPSO;
906
return D;
907
}
908
};
909
910
struct CD3DX12_PIPELINE_STATE_STREAM2_PARSE_HELPER : public ID3DX12PipelineParserCallbacks
911
{
912
CD3DX12_PIPELINE_STATE_STREAM2 PipelineStream;
913
CD3DX12_PIPELINE_STATE_STREAM2_PARSE_HELPER() noexcept
914
: SeenDSS(false)
915
{
916
// Adjust defaults to account for absent members.
917
PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
918
919
// Depth disabled if no DSV format specified.
920
static_cast<D3D12_DEPTH_STENCIL_DESC1&>(PipelineStream.DepthStencilState).DepthEnable = false;
921
}
922
923
// ID3DX12PipelineParserCallbacks
924
void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override {PipelineStream.Flags = Flags;}
925
void NodeMaskCb(UINT NodeMask) override {PipelineStream.NodeMask = NodeMask;}
926
void RootSignatureCb(ID3D12RootSignature* pRootSignature) override {PipelineStream.pRootSignature = pRootSignature;}
927
void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override {PipelineStream.InputLayout = InputLayout;}
928
void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override {PipelineStream.IBStripCutValue = IBStripCutValue;}
929
void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override {PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType;}
930
void VSCb(const D3D12_SHADER_BYTECODE& VS) override {PipelineStream.VS = VS;}
931
void GSCb(const D3D12_SHADER_BYTECODE& GS) override {PipelineStream.GS = GS;}
932
void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override {PipelineStream.StreamOutput = StreamOutput;}
933
void HSCb(const D3D12_SHADER_BYTECODE& HS) override {PipelineStream.HS = HS;}
934
void DSCb(const D3D12_SHADER_BYTECODE& DS) override {PipelineStream.DS = DS;}
935
void PSCb(const D3D12_SHADER_BYTECODE& PS) override {PipelineStream.PS = PS;}
936
void CSCb(const D3D12_SHADER_BYTECODE& CS) override {PipelineStream.CS = CS;}
937
void ASCb(const D3D12_SHADER_BYTECODE& AS) override {PipelineStream.AS = AS;}
938
void MSCb(const D3D12_SHADER_BYTECODE& MS) override {PipelineStream.MS = MS;}
939
void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override {PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState);}
940
void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override
941
{
942
PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(DepthStencilState);
943
SeenDSS = true;
944
}
945
void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override
946
{
947
PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(DepthStencilState);
948
SeenDSS = true;
949
}
950
void DSVFormatCb(DXGI_FORMAT DSVFormat) override
951
{
952
PipelineStream.DSVFormat = DSVFormat;
953
if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN)
954
{
955
// Re-enable depth for the default state.
956
static_cast<D3D12_DEPTH_STENCIL_DESC1&>(PipelineStream.DepthStencilState).DepthEnable = true;
957
}
958
}
959
void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override {PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC(RasterizerState);}
960
void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override {PipelineStream.RTVFormats = RTVFormats;}
961
void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override {PipelineStream.SampleDesc = SampleDesc;}
962
void SampleMaskCb(UINT SampleMask) override {PipelineStream.SampleMask = SampleMask;}
963
void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override {PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc);}
964
void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override {PipelineStream.CachedPSO = CachedPSO;}
965
966
private:
967
bool SeenDSS;
968
};
969
970
#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
971
struct CD3DX12_PIPELINE_STATE_STREAM3_PARSE_HELPER : public ID3DX12PipelineParserCallbacks
972
{
973
CD3DX12_PIPELINE_STATE_STREAM3 PipelineStream;
974
CD3DX12_PIPELINE_STATE_STREAM3_PARSE_HELPER() noexcept
975
: SeenDSS(false)
976
{
977
// Adjust defaults to account for absent members.
978
PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
979
980
// Depth disabled if no DSV format specified.
981
static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = false;
982
}
983
984
// ID3DX12PipelineParserCallbacks
985
void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override { PipelineStream.Flags = Flags; }
986
void NodeMaskCb(UINT NodeMask) override { PipelineStream.NodeMask = NodeMask; }
987
void RootSignatureCb(ID3D12RootSignature* pRootSignature) override { PipelineStream.pRootSignature = pRootSignature; }
988
void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override { PipelineStream.InputLayout = InputLayout; }
989
void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override { PipelineStream.IBStripCutValue = IBStripCutValue; }
990
void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override { PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType; }
991
void VSCb(const D3D12_SHADER_BYTECODE& VS) override { PipelineStream.VS = VS; }
992
void GSCb(const D3D12_SHADER_BYTECODE& GS) override { PipelineStream.GS = GS; }
993
void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override { PipelineStream.StreamOutput = StreamOutput; }
994
void HSCb(const D3D12_SHADER_BYTECODE& HS) override { PipelineStream.HS = HS; }
995
void DSCb(const D3D12_SHADER_BYTECODE& DS) override { PipelineStream.DS = DS; }
996
void PSCb(const D3D12_SHADER_BYTECODE& PS) override { PipelineStream.PS = PS; }
997
void CSCb(const D3D12_SHADER_BYTECODE& CS) override { PipelineStream.CS = CS; }
998
void ASCb(const D3D12_SHADER_BYTECODE& AS) override { PipelineStream.AS = AS; }
999
void MSCb(const D3D12_SHADER_BYTECODE& MS) override { PipelineStream.MS = MS; }
1000
void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override { PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState); }
1001
void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override
1002
{
1003
PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1004
SeenDSS = true;
1005
}
1006
void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override
1007
{
1008
PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1009
SeenDSS = true;
1010
}
1011
void DepthStencilState2Cb(const D3D12_DEPTH_STENCIL_DESC2& DepthStencilState) override
1012
{
1013
PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1014
SeenDSS = true;
1015
}
1016
void DSVFormatCb(DXGI_FORMAT DSVFormat) override
1017
{
1018
PipelineStream.DSVFormat = DSVFormat;
1019
if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN)
1020
{
1021
// Re-enable depth for the default state.
1022
static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = true;
1023
}
1024
}
1025
void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC(RasterizerState); }
1026
void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override { PipelineStream.RTVFormats = RTVFormats; }
1027
void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override { PipelineStream.SampleDesc = SampleDesc; }
1028
void SampleMaskCb(UINT SampleMask) override { PipelineStream.SampleMask = SampleMask; }
1029
void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override { PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc); }
1030
void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override { PipelineStream.CachedPSO = CachedPSO; }
1031
1032
private:
1033
bool SeenDSS;
1034
};
1035
#endif // D3D12_SDK_VERSION >= 606
1036
1037
#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
1038
struct CD3DX12_PIPELINE_STATE_STREAM4_PARSE_HELPER : public ID3DX12PipelineParserCallbacks
1039
{
1040
CD3DX12_PIPELINE_STATE_STREAM4 PipelineStream;
1041
CD3DX12_PIPELINE_STATE_STREAM4_PARSE_HELPER() noexcept
1042
: SeenDSS(false)
1043
{
1044
// Adjust defaults to account for absent members.
1045
PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
1046
1047
// Depth disabled if no DSV format specified.
1048
static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = false;
1049
}
1050
1051
// ID3DX12PipelineParserCallbacks
1052
void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override { PipelineStream.Flags = Flags; }
1053
void NodeMaskCb(UINT NodeMask) override { PipelineStream.NodeMask = NodeMask; }
1054
void RootSignatureCb(ID3D12RootSignature* pRootSignature) override { PipelineStream.pRootSignature = pRootSignature; }
1055
void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override { PipelineStream.InputLayout = InputLayout; }
1056
void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override { PipelineStream.IBStripCutValue = IBStripCutValue; }
1057
void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override { PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType; }
1058
void VSCb(const D3D12_SHADER_BYTECODE& VS) override { PipelineStream.VS = VS; }
1059
void GSCb(const D3D12_SHADER_BYTECODE& GS) override { PipelineStream.GS = GS; }
1060
void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override { PipelineStream.StreamOutput = StreamOutput; }
1061
void HSCb(const D3D12_SHADER_BYTECODE& HS) override { PipelineStream.HS = HS; }
1062
void DSCb(const D3D12_SHADER_BYTECODE& DS) override { PipelineStream.DS = DS; }
1063
void PSCb(const D3D12_SHADER_BYTECODE& PS) override { PipelineStream.PS = PS; }
1064
void CSCb(const D3D12_SHADER_BYTECODE& CS) override { PipelineStream.CS = CS; }
1065
void ASCb(const D3D12_SHADER_BYTECODE& AS) override { PipelineStream.AS = AS; }
1066
void MSCb(const D3D12_SHADER_BYTECODE& MS) override { PipelineStream.MS = MS; }
1067
void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override { PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState); }
1068
void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override
1069
{
1070
PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1071
SeenDSS = true;
1072
}
1073
void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override
1074
{
1075
PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1076
SeenDSS = true;
1077
}
1078
void DepthStencilState2Cb(const D3D12_DEPTH_STENCIL_DESC2& DepthStencilState) override
1079
{
1080
PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1081
SeenDSS = true;
1082
}
1083
void DSVFormatCb(DXGI_FORMAT DSVFormat) override
1084
{
1085
PipelineStream.DSVFormat = DSVFormat;
1086
if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN)
1087
{
1088
// Re-enable depth for the default state.
1089
static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = true;
1090
}
1091
}
1092
void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC1(RasterizerState); }
1093
void RasterizerState1Cb(const D3D12_RASTERIZER_DESC1& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC1(RasterizerState); }
1094
void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override { PipelineStream.RTVFormats = RTVFormats; }
1095
void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override { PipelineStream.SampleDesc = SampleDesc; }
1096
void SampleMaskCb(UINT SampleMask) override { PipelineStream.SampleMask = SampleMask; }
1097
void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override { PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc); }
1098
void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override { PipelineStream.CachedPSO = CachedPSO; }
1099
1100
private:
1101
bool SeenDSS;
1102
};
1103
#endif // D3D12_SDK_VERSION >= 608
1104
1105
#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
1106
struct CD3DX12_PIPELINE_STATE_STREAM5_PARSE_HELPER : public ID3DX12PipelineParserCallbacks
1107
{
1108
CD3DX12_PIPELINE_STATE_STREAM5 PipelineStream;
1109
CD3DX12_PIPELINE_STATE_STREAM5_PARSE_HELPER() noexcept
1110
: SeenDSS(false)
1111
{
1112
// Adjust defaults to account for absent members.
1113
PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
1114
1115
// Depth disabled if no DSV format specified.
1116
static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = false;
1117
}
1118
1119
// ID3DX12PipelineParserCallbacks
1120
void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override { PipelineStream.Flags = Flags; }
1121
void NodeMaskCb(UINT NodeMask) override { PipelineStream.NodeMask = NodeMask; }
1122
void RootSignatureCb(ID3D12RootSignature* pRootSignature) override { PipelineStream.pRootSignature = pRootSignature; }
1123
void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override { PipelineStream.InputLayout = InputLayout; }
1124
void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override { PipelineStream.IBStripCutValue = IBStripCutValue; }
1125
void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override { PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType; }
1126
void VSCb(const D3D12_SHADER_BYTECODE& VS) override { PipelineStream.VS = VS; }
1127
void GSCb(const D3D12_SHADER_BYTECODE& GS) override { PipelineStream.GS = GS; }
1128
void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override { PipelineStream.StreamOutput = StreamOutput; }
1129
void HSCb(const D3D12_SHADER_BYTECODE& HS) override { PipelineStream.HS = HS; }
1130
void DSCb(const D3D12_SHADER_BYTECODE& DS) override { PipelineStream.DS = DS; }
1131
void PSCb(const D3D12_SHADER_BYTECODE& PS) override { PipelineStream.PS = PS; }
1132
void CSCb(const D3D12_SHADER_BYTECODE& CS) override { PipelineStream.CS = CS; }
1133
void ASCb(const D3D12_SHADER_BYTECODE& AS) override { PipelineStream.AS = AS; }
1134
void MSCb(const D3D12_SHADER_BYTECODE& MS) override { PipelineStream.MS = MS; }
1135
void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override { PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState); }
1136
void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override
1137
{
1138
PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1139
SeenDSS = true;
1140
}
1141
void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override
1142
{
1143
PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1144
SeenDSS = true;
1145
}
1146
void DepthStencilState2Cb(const D3D12_DEPTH_STENCIL_DESC2& DepthStencilState) override
1147
{
1148
PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
1149
SeenDSS = true;
1150
}
1151
void DSVFormatCb(DXGI_FORMAT DSVFormat) override
1152
{
1153
PipelineStream.DSVFormat = DSVFormat;
1154
if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN)
1155
{
1156
// Re-enable depth for the default state.
1157
static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = true;
1158
}
1159
}
1160
void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
1161
void RasterizerState1Cb(const D3D12_RASTERIZER_DESC1& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
1162
void RasterizerState2Cb(const D3D12_RASTERIZER_DESC2& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
1163
void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override { PipelineStream.RTVFormats = RTVFormats; }
1164
void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override { PipelineStream.SampleDesc = SampleDesc; }
1165
void SampleMaskCb(UINT SampleMask) override { PipelineStream.SampleMask = SampleMask; }
1166
void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override { PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc); }
1167
void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override { PipelineStream.CachedPSO = CachedPSO; }
1168
1169
private:
1170
bool SeenDSS;
1171
};
1172
#endif // D3D12_SDK_VERSION >= 610
1173
1174
struct CD3DX12_PIPELINE_STATE_STREAM_PARSE_HELPER : public ID3DX12PipelineParserCallbacks
1175
{
1176
CD3DX12_PIPELINE_STATE_STREAM1 PipelineStream;
1177
CD3DX12_PIPELINE_STATE_STREAM_PARSE_HELPER() noexcept
1178
: SeenDSS(false)
1179
{
1180
// Adjust defaults to account for absent members.
1181
PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
1182
1183
// Depth disabled if no DSV format specified.
1184
static_cast<D3D12_DEPTH_STENCIL_DESC1&>(PipelineStream.DepthStencilState).DepthEnable = false;
1185
}
1186
1187
// ID3DX12PipelineParserCallbacks
1188
void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override {PipelineStream.Flags = Flags;}
1189
void NodeMaskCb(UINT NodeMask) override {PipelineStream.NodeMask = NodeMask;}
1190
void RootSignatureCb(ID3D12RootSignature* pRootSignature) override {PipelineStream.pRootSignature = pRootSignature;}
1191
void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override {PipelineStream.InputLayout = InputLayout;}
1192
void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override {PipelineStream.IBStripCutValue = IBStripCutValue;}
1193
void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override {PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType;}
1194
void VSCb(const D3D12_SHADER_BYTECODE& VS) override {PipelineStream.VS = VS;}
1195
void GSCb(const D3D12_SHADER_BYTECODE& GS) override {PipelineStream.GS = GS;}
1196
void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override {PipelineStream.StreamOutput = StreamOutput;}
1197
void HSCb(const D3D12_SHADER_BYTECODE& HS) override {PipelineStream.HS = HS;}
1198
void DSCb(const D3D12_SHADER_BYTECODE& DS) override {PipelineStream.DS = DS;}
1199
void PSCb(const D3D12_SHADER_BYTECODE& PS) override {PipelineStream.PS = PS;}
1200
void CSCb(const D3D12_SHADER_BYTECODE& CS) override {PipelineStream.CS = CS;}
1201
void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override {PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState);}
1202
void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override
1203
{
1204
PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(DepthStencilState);
1205
SeenDSS = true;
1206
}
1207
void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override
1208
{
1209
PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(DepthStencilState);
1210
SeenDSS = true;
1211
}
1212
void DSVFormatCb(DXGI_FORMAT DSVFormat) override
1213
{
1214
PipelineStream.DSVFormat = DSVFormat;
1215
if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN)
1216
{
1217
// Re-enable depth for the default state.
1218
static_cast<D3D12_DEPTH_STENCIL_DESC1&>(PipelineStream.DepthStencilState).DepthEnable = true;
1219
}
1220
}
1221
void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override {PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC(RasterizerState);}
1222
void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override {PipelineStream.RTVFormats = RTVFormats;}
1223
void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override {PipelineStream.SampleDesc = SampleDesc;}
1224
void SampleMaskCb(UINT SampleMask) override {PipelineStream.SampleMask = SampleMask;}
1225
void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override {PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc);}
1226
void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override {PipelineStream.CachedPSO = CachedPSO;}
1227
1228
private:
1229
bool SeenDSS;
1230
};
1231
1232
inline D3D12_PIPELINE_STATE_SUBOBJECT_TYPE D3DX12GetBaseSubobjectType(D3D12_PIPELINE_STATE_SUBOBJECT_TYPE SubobjectType) noexcept
1233
{
1234
switch (SubobjectType)
1235
{
1236
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL1:
1237
return D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL;
1238
#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
1239
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL2:
1240
return D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL;
1241
#endif
1242
#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
1243
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER1:
1244
return D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER;
1245
#endif
1246
default:
1247
return SubobjectType;
1248
}
1249
}
1250
1251
inline HRESULT D3DX12ParsePipelineStream(const D3D12_PIPELINE_STATE_STREAM_DESC& Desc, ID3DX12PipelineParserCallbacks* pCallbacks)
1252
{
1253
if (pCallbacks == nullptr)
1254
{
1255
return E_INVALIDARG;
1256
}
1257
1258
if (Desc.SizeInBytes == 0 || Desc.pPipelineStateSubobjectStream == nullptr)
1259
{
1260
pCallbacks->ErrorBadInputParameter(1); // first parameter issue
1261
return E_INVALIDARG;
1262
}
1263
1264
bool SubobjectSeen[D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MAX_VALID] = {};
1265
for (SIZE_T CurOffset = 0, SizeOfSubobject = 0; CurOffset < Desc.SizeInBytes; CurOffset += SizeOfSubobject)
1266
{
1267
BYTE* pStream = static_cast<BYTE*>(Desc.pPipelineStateSubobjectStream)+CurOffset;
1268
auto SubobjectType = *reinterpret_cast<D3D12_PIPELINE_STATE_SUBOBJECT_TYPE*>(pStream);
1269
if (SubobjectType < 0 || SubobjectType >= D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MAX_VALID)
1270
{
1271
pCallbacks->ErrorUnknownSubobject(SubobjectType);
1272
return E_INVALIDARG;
1273
}
1274
if (SubobjectSeen[D3DX12GetBaseSubobjectType(SubobjectType)])
1275
{
1276
pCallbacks->ErrorDuplicateSubobject(SubobjectType);
1277
return E_INVALIDARG; // disallow subobject duplicates in a stream
1278
}
1279
SubobjectSeen[SubobjectType] = true;
1280
switch (SubobjectType)
1281
{
1282
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_ROOT_SIGNATURE:
1283
pCallbacks->RootSignatureCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::pRootSignature)*>(pStream));
1284
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::pRootSignature);
1285
break;
1286
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VS:
1287
pCallbacks->VSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::VS)*>(pStream));
1288
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::VS);
1289
break;
1290
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PS:
1291
pCallbacks->PSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::PS)*>(pStream));
1292
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::PS);
1293
break;
1294
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DS:
1295
pCallbacks->DSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::DS)*>(pStream));
1296
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::DS);
1297
break;
1298
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_HS:
1299
pCallbacks->HSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::HS)*>(pStream));
1300
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::HS);
1301
break;
1302
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_GS:
1303
pCallbacks->GSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::GS)*>(pStream));
1304
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::GS);
1305
break;
1306
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CS:
1307
pCallbacks->CSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::CS)*>(pStream));
1308
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::CS);
1309
break;
1310
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_AS:
1311
pCallbacks->ASCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM2::AS)*>(pStream));
1312
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM2::AS);
1313
break;
1314
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MS:
1315
pCallbacks->MSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM2::MS)*>(pStream));
1316
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM2::MS);
1317
break;
1318
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_STREAM_OUTPUT:
1319
pCallbacks->StreamOutputCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::StreamOutput)*>(pStream));
1320
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::StreamOutput);
1321
break;
1322
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_BLEND:
1323
pCallbacks->BlendStateCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::BlendState)*>(pStream));
1324
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::BlendState);
1325
break;
1326
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_MASK:
1327
pCallbacks->SampleMaskCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::SampleMask)*>(pStream));
1328
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::SampleMask);
1329
break;
1330
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER:
1331
pCallbacks->RasterizerStateCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::RasterizerState)*>(pStream));
1332
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::RasterizerState);
1333
break;
1334
#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
1335
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER1:
1336
pCallbacks->RasterizerState1Cb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM4::RasterizerState)*>(pStream));
1337
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM4::RasterizerState);
1338
break;
1339
#endif
1340
#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
1341
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER2:
1342
pCallbacks->RasterizerState2Cb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM5::RasterizerState)*>(pStream));
1343
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM5::RasterizerState);
1344
break;
1345
#endif
1346
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL:
1347
pCallbacks->DepthStencilStateCb(*reinterpret_cast<CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL*>(pStream));
1348
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL);
1349
break;
1350
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL1:
1351
pCallbacks->DepthStencilState1Cb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::DepthStencilState)*>(pStream));
1352
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::DepthStencilState);
1353
break;
1354
#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
1355
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL2:
1356
pCallbacks->DepthStencilState2Cb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM3::DepthStencilState)*>(pStream));
1357
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM3::DepthStencilState);
1358
break;
1359
#endif
1360
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_INPUT_LAYOUT:
1361
pCallbacks->InputLayoutCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::InputLayout)*>(pStream));
1362
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::InputLayout);
1363
break;
1364
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_IB_STRIP_CUT_VALUE:
1365
pCallbacks->IBStripCutValueCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::IBStripCutValue)*>(pStream));
1366
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::IBStripCutValue);
1367
break;
1368
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY:
1369
pCallbacks->PrimitiveTopologyTypeCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::PrimitiveTopologyType)*>(pStream));
1370
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::PrimitiveTopologyType);
1371
break;
1372
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RENDER_TARGET_FORMATS:
1373
pCallbacks->RTVFormatsCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::RTVFormats)*>(pStream));
1374
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::RTVFormats);
1375
break;
1376
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL_FORMAT:
1377
pCallbacks->DSVFormatCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::DSVFormat)*>(pStream));
1378
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::DSVFormat);
1379
break;
1380
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_DESC:
1381
pCallbacks->SampleDescCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::SampleDesc)*>(pStream));
1382
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::SampleDesc);
1383
break;
1384
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_NODE_MASK:
1385
pCallbacks->NodeMaskCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::NodeMask)*>(pStream));
1386
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::NodeMask);
1387
break;
1388
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CACHED_PSO:
1389
pCallbacks->CachedPSOCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::CachedPSO)*>(pStream));
1390
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::CachedPSO);
1391
break;
1392
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_FLAGS:
1393
pCallbacks->FlagsCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::Flags)*>(pStream));
1394
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::Flags);
1395
break;
1396
case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VIEW_INSTANCING:
1397
pCallbacks->ViewInstancingCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM1::ViewInstancingDesc)*>(pStream));
1398
SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM1::ViewInstancingDesc);
1399
break;
1400
default:
1401
pCallbacks->ErrorUnknownSubobject(SubobjectType);
1402
return E_INVALIDARG;
1403
}
1404
}
1405
1406
return S_OK;
1407
}
1408
1409