yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Ellie Hermaszewskaformatf65d756bf

master
23.3 KiB610 linesraw
1#pragma once
2
3//
4// The CD3DX12_PIPELINE_STATE_STREAM2 struct and dependencies extracted from
5// `d3dx12_pipeline_state_stream.h`. Attribution Microsoft.
6//
7
8#include "d3d12-sal-defs.h"
9
10#include <climits>
11#include <d3d12.h>
12#include <dxgi1_4.h>
13
14struct CD3DX12_DEFAULT
15{
16};
17
18//------------------------------------------------------------------------------------------------
19struct CD3DX12_DEPTH_STENCIL_DESC : public D3D12_DEPTH_STENCIL_DESC
20{
21    CD3DX12_DEPTH_STENCIL_DESC() = default;
22    explicit CD3DX12_DEPTH_STENCIL_DESC(const D3D12_DEPTH_STENCIL_DESC& o) noexcept
23        : D3D12_DEPTH_STENCIL_DESC(o)
24    {
25    }
26    explicit CD3DX12_DEPTH_STENCIL_DESC(CD3DX12_DEFAULT) noexcept
27    {
28        DepthEnable = TRUE;
29        DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL;
30        DepthFunc = D3D12_COMPARISON_FUNC_LESS;
31        StencilEnable = FALSE;
32        StencilReadMask = D3D12_DEFAULT_STENCIL_READ_MASK;
33        StencilWriteMask = D3D12_DEFAULT_STENCIL_WRITE_MASK;
34        const D3D12_DEPTH_STENCILOP_DESC defaultStencilOp = {
35            D3D12_STENCIL_OP_KEEP,
36            D3D12_STENCIL_OP_KEEP,
37            D3D12_STENCIL_OP_KEEP,
38            D3D12_COMPARISON_FUNC_ALWAYS};
39        FrontFace = defaultStencilOp;
40        BackFace = defaultStencilOp;
41    }
42    explicit CD3DX12_DEPTH_STENCIL_DESC(
43        BOOL depthEnable,
44        D3D12_DEPTH_WRITE_MASK depthWriteMask,
45        D3D12_COMPARISON_FUNC depthFunc,
46        BOOL stencilEnable,
47        UINT8 stencilReadMask,
48        UINT8 stencilWriteMask,
49        D3D12_STENCIL_OP frontStencilFailOp,
50        D3D12_STENCIL_OP frontStencilDepthFailOp,
51        D3D12_STENCIL_OP frontStencilPassOp,
52        D3D12_COMPARISON_FUNC frontStencilFunc,
53        D3D12_STENCIL_OP backStencilFailOp,
54        D3D12_STENCIL_OP backStencilDepthFailOp,
55        D3D12_STENCIL_OP backStencilPassOp,
56        D3D12_COMPARISON_FUNC backStencilFunc) noexcept
57    {
58        DepthEnable = depthEnable;
59        DepthWriteMask = depthWriteMask;
60        DepthFunc = depthFunc;
61        StencilEnable = stencilEnable;
62        StencilReadMask = stencilReadMask;
63        StencilWriteMask = stencilWriteMask;
64        FrontFace.StencilFailOp = frontStencilFailOp;
65        FrontFace.StencilDepthFailOp = frontStencilDepthFailOp;
66        FrontFace.StencilPassOp = frontStencilPassOp;
67        FrontFace.StencilFunc = frontStencilFunc;
68        BackFace.StencilFailOp = backStencilFailOp;
69        BackFace.StencilDepthFailOp = backStencilDepthFailOp;
70        BackFace.StencilPassOp = backStencilPassOp;
71        BackFace.StencilFunc = backStencilFunc;
72    }
73};
74
75//------------------------------------------------------------------------------------------------
76struct CD3DX12_DEPTH_STENCIL_DESC1 : public D3D12_DEPTH_STENCIL_DESC1
77{
78    CD3DX12_DEPTH_STENCIL_DESC1() = default;
79    explicit CD3DX12_DEPTH_STENCIL_DESC1(const D3D12_DEPTH_STENCIL_DESC1& o) noexcept
80        : D3D12_DEPTH_STENCIL_DESC1(o)
81    {
82    }
83    explicit CD3DX12_DEPTH_STENCIL_DESC1(const D3D12_DEPTH_STENCIL_DESC& o) noexcept
84    {
85        DepthEnable = o.DepthEnable;
86        DepthWriteMask = o.DepthWriteMask;
87        DepthFunc = o.DepthFunc;
88        StencilEnable = o.StencilEnable;
89        StencilReadMask = o.StencilReadMask;
90        StencilWriteMask = o.StencilWriteMask;
91        FrontFace.StencilFailOp = o.FrontFace.StencilFailOp;
92        FrontFace.StencilDepthFailOp = o.FrontFace.StencilDepthFailOp;
93        FrontFace.StencilPassOp = o.FrontFace.StencilPassOp;
94        FrontFace.StencilFunc = o.FrontFace.StencilFunc;
95        BackFace.StencilFailOp = o.BackFace.StencilFailOp;
96        BackFace.StencilDepthFailOp = o.BackFace.StencilDepthFailOp;
97        BackFace.StencilPassOp = o.BackFace.StencilPassOp;
98        BackFace.StencilFunc = o.BackFace.StencilFunc;
99        DepthBoundsTestEnable = FALSE;
100    }
101    explicit CD3DX12_DEPTH_STENCIL_DESC1(CD3DX12_DEFAULT) noexcept
102    {
103        DepthEnable = TRUE;
104        DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL;
105        DepthFunc = D3D12_COMPARISON_FUNC_LESS;
106        StencilEnable = FALSE;
107        StencilReadMask = D3D12_DEFAULT_STENCIL_READ_MASK;
108        StencilWriteMask = D3D12_DEFAULT_STENCIL_WRITE_MASK;
109        const D3D12_DEPTH_STENCILOP_DESC defaultStencilOp = {
110            D3D12_STENCIL_OP_KEEP,
111            D3D12_STENCIL_OP_KEEP,
112            D3D12_STENCIL_OP_KEEP,
113            D3D12_COMPARISON_FUNC_ALWAYS};
114        FrontFace = defaultStencilOp;
115        BackFace = defaultStencilOp;
116        DepthBoundsTestEnable = FALSE;
117    }
118    explicit CD3DX12_DEPTH_STENCIL_DESC1(
119        BOOL depthEnable,
120        D3D12_DEPTH_WRITE_MASK depthWriteMask,
121        D3D12_COMPARISON_FUNC depthFunc,
122        BOOL stencilEnable,
123        UINT8 stencilReadMask,
124        UINT8 stencilWriteMask,
125        D3D12_STENCIL_OP frontStencilFailOp,
126        D3D12_STENCIL_OP frontStencilDepthFailOp,
127        D3D12_STENCIL_OP frontStencilPassOp,
128        D3D12_COMPARISON_FUNC frontStencilFunc,
129        D3D12_STENCIL_OP backStencilFailOp,
130        D3D12_STENCIL_OP backStencilDepthFailOp,
131        D3D12_STENCIL_OP backStencilPassOp,
132        D3D12_COMPARISON_FUNC backStencilFunc,
133        BOOL depthBoundsTestEnable) noexcept
134    {
135        DepthEnable = depthEnable;
136        DepthWriteMask = depthWriteMask;
137        DepthFunc = depthFunc;
138        StencilEnable = stencilEnable;
139        StencilReadMask = stencilReadMask;
140        StencilWriteMask = stencilWriteMask;
141        FrontFace.StencilFailOp = frontStencilFailOp;
142        FrontFace.StencilDepthFailOp = frontStencilDepthFailOp;
143        FrontFace.StencilPassOp = frontStencilPassOp;
144        FrontFace.StencilFunc = frontStencilFunc;
145        BackFace.StencilFailOp = backStencilFailOp;
146        BackFace.StencilDepthFailOp = backStencilDepthFailOp;
147        BackFace.StencilPassOp = backStencilPassOp;
148        BackFace.StencilFunc = backStencilFunc;
149        DepthBoundsTestEnable = depthBoundsTestEnable;
150    }
151    operator D3D12_DEPTH_STENCIL_DESC() const noexcept
152    {
153        D3D12_DEPTH_STENCIL_DESC D;
154        D.DepthEnable = DepthEnable;
155        D.DepthWriteMask = DepthWriteMask;
156        D.DepthFunc = DepthFunc;
157        D.StencilEnable = StencilEnable;
158        D.StencilReadMask = StencilReadMask;
159        D.StencilWriteMask = StencilWriteMask;
160        D.FrontFace.StencilFailOp = FrontFace.StencilFailOp;
161        D.FrontFace.StencilDepthFailOp = FrontFace.StencilDepthFailOp;
162        D.FrontFace.StencilPassOp = FrontFace.StencilPassOp;
163        D.FrontFace.StencilFunc = FrontFace.StencilFunc;
164        D.BackFace.StencilFailOp = BackFace.StencilFailOp;
165        D.BackFace.StencilDepthFailOp = BackFace.StencilDepthFailOp;
166        D.BackFace.StencilPassOp = BackFace.StencilPassOp;
167        D.BackFace.StencilFunc = BackFace.StencilFunc;
168        return D;
169    }
170};
171
172//------------------------------------------------------------------------------------------------
173struct CD3DX12_BLEND_DESC : public D3D12_BLEND_DESC
174{
175    CD3DX12_BLEND_DESC() = default;
176    explicit CD3DX12_BLEND_DESC(const D3D12_BLEND_DESC& o) noexcept
177        : D3D12_BLEND_DESC(o)
178    {
179    }
180    explicit CD3DX12_BLEND_DESC(CD3DX12_DEFAULT) noexcept
181    {
182        AlphaToCoverageEnable = FALSE;
183        IndependentBlendEnable = FALSE;
184        const D3D12_RENDER_TARGET_BLEND_DESC defaultRenderTargetBlendDesc = {
185            FALSE,
186            FALSE,
187            D3D12_BLEND_ONE,
188            D3D12_BLEND_ZERO,
189            D3D12_BLEND_OP_ADD,
190            D3D12_BLEND_ONE,
191            D3D12_BLEND_ZERO,
192            D3D12_BLEND_OP_ADD,
193            D3D12_LOGIC_OP_NOOP,
194            D3D12_COLOR_WRITE_ENABLE_ALL,
195        };
196        for (UINT i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i)
197            RenderTarget[i] = defaultRenderTargetBlendDesc;
198    }
199};
200
201//------------------------------------------------------------------------------------------------
202struct CD3DX12_RASTERIZER_DESC : public D3D12_RASTERIZER_DESC
203{
204    CD3DX12_RASTERIZER_DESC() = default;
205    explicit CD3DX12_RASTERIZER_DESC(const D3D12_RASTERIZER_DESC& o) noexcept
206        : D3D12_RASTERIZER_DESC(o)
207    {
208    }
209    explicit CD3DX12_RASTERIZER_DESC(CD3DX12_DEFAULT) noexcept
210    {
211        FillMode = D3D12_FILL_MODE_SOLID;
212        CullMode = D3D12_CULL_MODE_BACK;
213        FrontCounterClockwise = FALSE;
214        DepthBias = D3D12_DEFAULT_DEPTH_BIAS;
215        DepthBiasClamp = D3D12_DEFAULT_DEPTH_BIAS_CLAMP;
216        SlopeScaledDepthBias = D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS;
217        DepthClipEnable = TRUE;
218        MultisampleEnable = FALSE;
219        AntialiasedLineEnable = FALSE;
220        ForcedSampleCount = 0;
221        ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
222    }
223    explicit CD3DX12_RASTERIZER_DESC(
224        D3D12_FILL_MODE fillMode,
225        D3D12_CULL_MODE cullMode,
226        BOOL frontCounterClockwise,
227        INT depthBias,
228        FLOAT depthBiasClamp,
229        FLOAT slopeScaledDepthBias,
230        BOOL depthClipEnable,
231        BOOL multisampleEnable,
232        BOOL antialiasedLineEnable,
233        UINT forcedSampleCount,
234        D3D12_CONSERVATIVE_RASTERIZATION_MODE conservativeRaster) noexcept
235    {
236        FillMode = fillMode;
237        CullMode = cullMode;
238        FrontCounterClockwise = frontCounterClockwise;
239        DepthBias = depthBias;
240        DepthBiasClamp = depthBiasClamp;
241        SlopeScaledDepthBias = slopeScaledDepthBias;
242        DepthClipEnable = depthClipEnable;
243        MultisampleEnable = multisampleEnable;
244        AntialiasedLineEnable = antialiasedLineEnable;
245        ForcedSampleCount = forcedSampleCount;
246        ConservativeRaster = conservativeRaster;
247    }
248};
249
250//------------------------------------------------------------------------------------------------
251struct CD3DX12_VIEW_INSTANCING_DESC : public D3D12_VIEW_INSTANCING_DESC
252{
253    CD3DX12_VIEW_INSTANCING_DESC() = default;
254    explicit CD3DX12_VIEW_INSTANCING_DESC(const D3D12_VIEW_INSTANCING_DESC& o) noexcept
255        : D3D12_VIEW_INSTANCING_DESC(o)
256    {
257    }
258    explicit CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT) noexcept
259    {
260        ViewInstanceCount = 0;
261        pViewInstanceLocations = nullptr;
262        Flags = D3D12_VIEW_INSTANCING_FLAG_NONE;
263    }
264    explicit CD3DX12_VIEW_INSTANCING_DESC(
265        UINT InViewInstanceCount,
266        const D3D12_VIEW_INSTANCE_LOCATION* InViewInstanceLocations,
267        D3D12_VIEW_INSTANCING_FLAGS InFlags) noexcept
268    {
269        ViewInstanceCount = InViewInstanceCount;
270        pViewInstanceLocations = InViewInstanceLocations;
271        Flags = InFlags;
272    }
273};
274
275//------------------------------------------------------------------------------------------------
276struct CD3DX12_RT_FORMAT_ARRAY : public D3D12_RT_FORMAT_ARRAY
277{
278    CD3DX12_RT_FORMAT_ARRAY() = default;
279    explicit CD3DX12_RT_FORMAT_ARRAY(const D3D12_RT_FORMAT_ARRAY& o) noexcept
280        : D3D12_RT_FORMAT_ARRAY(o)
281    {
282    }
283    explicit CD3DX12_RT_FORMAT_ARRAY(
284        _In_reads_(NumFormats) const DXGI_FORMAT* pFormats,
285        UINT NumFormats) noexcept
286    {
287        NumRenderTargets = NumFormats;
288        memcpy(RTFormats, pFormats, sizeof(RTFormats));
289        // assumes ARRAY_SIZE(pFormats) == ARRAY_SIZE(RTFormats)
290    }
291};
292
293//------------------------------------------------------------------------------------------------
294struct CD3DX12_SHADER_BYTECODE : public D3D12_SHADER_BYTECODE
295{
296    CD3DX12_SHADER_BYTECODE() = default;
297    explicit CD3DX12_SHADER_BYTECODE(const D3D12_SHADER_BYTECODE& o) noexcept
298        : D3D12_SHADER_BYTECODE(o)
299    {
300    }
301    CD3DX12_SHADER_BYTECODE(_In_ ID3DBlob* pShaderBlob) noexcept
302    {
303        pShaderBytecode = pShaderBlob->GetBufferPointer();
304        BytecodeLength = pShaderBlob->GetBufferSize();
305    }
306    CD3DX12_SHADER_BYTECODE(const void* _pShaderBytecode, SIZE_T bytecodeLength) noexcept
307    {
308        pShaderBytecode = _pShaderBytecode;
309        BytecodeLength = bytecodeLength;
310    }
311};
312
313struct DefaultSampleMask
314{
315    operator UINT() noexcept { return UINT_MAX; }
316};
317struct DefaultSampleDesc
318{
319    operator DXGI_SAMPLE_DESC() noexcept { return DXGI_SAMPLE_DESC{1, 0}; }
320};
321
322#ifdef _MSC_VER
323#pragma warning(push)
324#pragma warning(disable : 4324)
325#endif
326template<
327    typename InnerStructType,
328    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE Type,
329    typename DefaultArg = InnerStructType>
330class alignas(void*) CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT
331{
332private:
333    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE pssType;
334    InnerStructType pssInner;
335
336public:
337    CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT() noexcept
338        : pssType(Type), pssInner(DefaultArg())
339    {
340    }
341    CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT(InnerStructType const& i) noexcept
342        : pssType(Type), pssInner(i)
343    {
344    }
345    CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT& operator=(InnerStructType const& i) noexcept
346    {
347        pssType = Type;
348        pssInner = i;
349        return *this;
350    }
351    operator InnerStructType const&() const noexcept { return pssInner; }
352    operator InnerStructType&() noexcept { return pssInner; }
353    InnerStructType* operator&() noexcept { return &pssInner; }
354    InnerStructType const* operator&() const noexcept { return &pssInner; }
355};
356#ifdef _MSC_VER
357#pragma warning(pop)
358#endif
359
360typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
361    D3D12_PIPELINE_STATE_FLAGS,
362    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_FLAGS>
363    CD3DX12_PIPELINE_STATE_STREAM_FLAGS;
364typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<UINT, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_NODE_MASK>
365    CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK;
366typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
367    ID3D12RootSignature*,
368    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_ROOT_SIGNATURE>
369    CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE;
370typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
371    D3D12_INPUT_LAYOUT_DESC,
372    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_INPUT_LAYOUT>
373    CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT;
374typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
375    D3D12_INDEX_BUFFER_STRIP_CUT_VALUE,
376    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_IB_STRIP_CUT_VALUE>
377    CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE;
378typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
379    D3D12_PRIMITIVE_TOPOLOGY_TYPE,
380    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY>
381    CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY;
382typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
383    D3D12_SHADER_BYTECODE,
384    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VS>
385    CD3DX12_PIPELINE_STATE_STREAM_VS;
386typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
387    D3D12_SHADER_BYTECODE,
388    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_GS>
389    CD3DX12_PIPELINE_STATE_STREAM_GS;
390typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
391    D3D12_STREAM_OUTPUT_DESC,
392    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_STREAM_OUTPUT>
393    CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT;
394typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
395    D3D12_SHADER_BYTECODE,
396    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_HS>
397    CD3DX12_PIPELINE_STATE_STREAM_HS;
398typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
399    D3D12_SHADER_BYTECODE,
400    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DS>
401    CD3DX12_PIPELINE_STATE_STREAM_DS;
402typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
403    D3D12_SHADER_BYTECODE,
404    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PS>
405    CD3DX12_PIPELINE_STATE_STREAM_PS;
406typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
407    D3D12_SHADER_BYTECODE,
408    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_AS>
409    CD3DX12_PIPELINE_STATE_STREAM_AS;
410typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
411    D3D12_SHADER_BYTECODE,
412    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MS>
413    CD3DX12_PIPELINE_STATE_STREAM_MS;
414typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
415    D3D12_SHADER_BYTECODE,
416    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CS>
417    CD3DX12_PIPELINE_STATE_STREAM_CS;
418typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
419    CD3DX12_BLEND_DESC,
420    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_BLEND,
421    CD3DX12_DEFAULT>
422    CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC;
423typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
424    CD3DX12_DEPTH_STENCIL_DESC,
425    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL,
426    CD3DX12_DEFAULT>
427    CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL;
428typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
429    CD3DX12_DEPTH_STENCIL_DESC1,
430    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL1,
431    CD3DX12_DEFAULT>
432    CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1;
433typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
434    DXGI_FORMAT,
435    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL_FORMAT>
436    CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT;
437typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
438    CD3DX12_RASTERIZER_DESC,
439    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER,
440    CD3DX12_DEFAULT>
441    CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER;
442typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
443    D3D12_RT_FORMAT_ARRAY,
444    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RENDER_TARGET_FORMATS>
445    CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS;
446typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
447    DXGI_SAMPLE_DESC,
448    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_DESC,
449    DefaultSampleDesc>
450    CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC;
451typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
452    UINT,
453    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_MASK,
454    DefaultSampleMask>
455    CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK;
456typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
457    D3D12_CACHED_PIPELINE_STATE,
458    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CACHED_PSO>
459    CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO;
460typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT<
461    CD3DX12_VIEW_INSTANCING_DESC,
462    D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VIEW_INSTANCING,
463    CD3DX12_DEFAULT>
464    CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING;
465
466struct D3DX12_MESH_SHADER_PIPELINE_STATE_DESC
467{
468    ID3D12RootSignature* pRootSignature;
469    D3D12_SHADER_BYTECODE AS;
470    D3D12_SHADER_BYTECODE MS;
471    D3D12_SHADER_BYTECODE PS;
472    D3D12_BLEND_DESC BlendState;
473    UINT SampleMask;
474    D3D12_RASTERIZER_DESC RasterizerState;
475    D3D12_DEPTH_STENCIL_DESC DepthStencilState;
476    D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType;
477    UINT NumRenderTargets;
478    DXGI_FORMAT RTVFormats[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT];
479    DXGI_FORMAT DSVFormat;
480    DXGI_SAMPLE_DESC SampleDesc;
481    UINT NodeMask;
482    D3D12_CACHED_PIPELINE_STATE CachedPSO;
483    D3D12_PIPELINE_STATE_FLAGS Flags;
484};
485
486// CD3DX12_PIPELINE_STATE_STREAM2 Works on OS Build 19041+ (where there is a new mesh shader
487// pipeline). Use CD3DX12_PIPELINE_STATE_STREAM1 for OS Build 16299+ (where there is a new view
488// instancing subobject). Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.
489struct CD3DX12_PIPELINE_STATE_STREAM2
490{
491    CD3DX12_PIPELINE_STATE_STREAM2() = default;
492    // Mesh and amplification shaders must be set manually, since they do not have representation in
493    // D3D12_GRAPHICS_PIPELINE_STATE_DESC
494    CD3DX12_PIPELINE_STATE_STREAM2(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept
495        : Flags(Desc.Flags)
496        , NodeMask(Desc.NodeMask)
497        , pRootSignature(Desc.pRootSignature)
498        , InputLayout(Desc.InputLayout)
499        , IBStripCutValue(Desc.IBStripCutValue)
500        , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
501        , VS(Desc.VS)
502        , GS(Desc.GS)
503        , StreamOutput(Desc.StreamOutput)
504        , HS(Desc.HS)
505        , DS(Desc.DS)
506        , PS(Desc.PS)
507        , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
508        , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))
509        , DSVFormat(Desc.DSVFormat)
510        , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
511        , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
512        , SampleDesc(Desc.SampleDesc)
513        , SampleMask(Desc.SampleMask)
514        , CachedPSO(Desc.CachedPSO)
515        , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
516    {
517    }
518    CD3DX12_PIPELINE_STATE_STREAM2(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept
519        : Flags(Desc.Flags)
520        , NodeMask(Desc.NodeMask)
521        , pRootSignature(Desc.pRootSignature)
522        , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
523        , PS(Desc.PS)
524        , AS(Desc.AS)
525        , MS(Desc.MS)
526        , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
527        , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))
528        , DSVFormat(Desc.DSVFormat)
529        , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
530        , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
531        , SampleDesc(Desc.SampleDesc)
532        , SampleMask(Desc.SampleMask)
533        , CachedPSO(Desc.CachedPSO)
534        , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
535    {
536    }
537    CD3DX12_PIPELINE_STATE_STREAM2(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept
538        : Flags(Desc.Flags)
539        , NodeMask(Desc.NodeMask)
540        , pRootSignature(Desc.pRootSignature)
541        , CS(CD3DX12_SHADER_BYTECODE(Desc.CS))
542        , CachedPSO(Desc.CachedPSO)
543    {
544        static_cast<D3D12_DEPTH_STENCIL_DESC1&>(DepthStencilState).DepthEnable = false;
545    }
546    CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
547    CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
548    CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
549    CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;
550    CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;
551    CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
552    CD3DX12_PIPELINE_STATE_STREAM_VS VS;
553    CD3DX12_PIPELINE_STATE_STREAM_GS GS;
554    CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;
555    CD3DX12_PIPELINE_STATE_STREAM_HS HS;
556    CD3DX12_PIPELINE_STATE_STREAM_DS DS;
557    CD3DX12_PIPELINE_STATE_STREAM_PS PS;
558    CD3DX12_PIPELINE_STATE_STREAM_AS AS;
559    CD3DX12_PIPELINE_STATE_STREAM_MS MS;
560    CD3DX12_PIPELINE_STATE_STREAM_CS CS;
561    CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
562    CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState;
563    CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
564    CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;
565    CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
566    CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
567    CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
568    CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
569    CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;
570    D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept
571    {
572        D3D12_GRAPHICS_PIPELINE_STATE_DESC D;
573        D.Flags = this->Flags;
574        D.NodeMask = this->NodeMask;
575        D.pRootSignature = this->pRootSignature;
576        D.InputLayout = this->InputLayout;
577        D.IBStripCutValue = this->IBStripCutValue;
578        D.PrimitiveTopologyType = this->PrimitiveTopologyType;
579        D.VS = this->VS;
580        D.GS = this->GS;
581        D.StreamOutput = this->StreamOutput;
582        D.HS = this->HS;
583        D.DS = this->DS;
584        D.PS = this->PS;
585        D.BlendState = this->BlendState;
586        D.DepthStencilState =
587            CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState));
588        D.DSVFormat = this->DSVFormat;
589        D.RasterizerState = this->RasterizerState;
590        D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
591        memcpy(
592            D.RTVFormats,
593            D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats,
594            sizeof(D.RTVFormats));
595        D.SampleDesc = this->SampleDesc;
596        D.SampleMask = this->SampleMask;
597        D.CachedPSO = this->CachedPSO;
598        return D;
599    }
600    D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept
601    {
602        D3D12_COMPUTE_PIPELINE_STATE_DESC D;
603        D.Flags = this->Flags;
604        D.NodeMask = this->NodeMask;
605        D.pRootSignature = this->pRootSignature;
606        D.CS = this->CS;
607        D.CachedPSO = this->CachedPSO;
608        return D;
609    }
610};