slot 0.0.1
A real time UI render framework
载入中...
搜索中...
未找到
d3dx12.h
浏览该文件的文档.
1//*********************************************************
2//
3// Copyright (c) Microsoft Corporation.
4// Licensed under the MIT License (MIT).
5//
6//*********************************************************
7
8#ifndef __D3DX12_H__
9#define __D3DX12_H__
10
11#include "d3d12.h"
12
13#if defined( __cplusplus )
14
15#ifdef __clang__
16#pragma clang diagnostic push
17#pragma clang diagnostic ignored "-Wfloat-equal"
18#pragma clang diagnostic ignored "-Wunknown-warning-option"
19#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
20#endif
21
22struct CD3DX12_DEFAULT {};
23extern const DECLSPEC_SELECTANY CD3DX12_DEFAULT D3D12_DEFAULT;
24
25//------------------------------------------------------------------------------------------------
26inline bool operator==( const D3D12_VIEWPORT& l, const D3D12_VIEWPORT& r ) noexcept
27{
28 return l.TopLeftX == r.TopLeftX && l.TopLeftY == r.TopLeftY && l.Width == r.Width &&
29 l.Height == r.Height && l.MinDepth == r.MinDepth && l.MaxDepth == r.MaxDepth;
30}
31
32//------------------------------------------------------------------------------------------------
33inline bool operator!=( const D3D12_VIEWPORT& l, const D3D12_VIEWPORT& r ) noexcept
34{ return !( l == r ); }
35
36//------------------------------------------------------------------------------------------------
37struct CD3DX12_RECT : public D3D12_RECT
38{
39 CD3DX12_RECT() = default;
40 explicit CD3DX12_RECT( const D3D12_RECT& o ) noexcept :
41 D3D12_RECT( o )
42 {}
43 explicit CD3DX12_RECT(
44 LONG Left,
45 LONG Top,
46 LONG Right,
47 LONG Bottom ) noexcept
48 {
49 left = Left;
50 top = Top;
51 right = Right;
52 bottom = Bottom;
53 }
54};
55
56//------------------------------------------------------------------------------------------------
57struct CD3DX12_VIEWPORT : public D3D12_VIEWPORT
58{
59 CD3DX12_VIEWPORT() = default;
60 explicit CD3DX12_VIEWPORT( const D3D12_VIEWPORT& o ) noexcept :
61 D3D12_VIEWPORT( o )
62 {}
63 explicit CD3DX12_VIEWPORT(
64 FLOAT topLeftX,
65 FLOAT topLeftY,
66 FLOAT width,
67 FLOAT height,
68 FLOAT minDepth = D3D12_MIN_DEPTH,
69 FLOAT maxDepth = D3D12_MAX_DEPTH ) noexcept
70 {
71 TopLeftX = topLeftX;
72 TopLeftY = topLeftY;
73 Width = width;
74 Height = height;
75 MinDepth = minDepth;
76 MaxDepth = maxDepth;
77 }
78 explicit CD3DX12_VIEWPORT(
79 _In_ ID3D12Resource* pResource,
80 UINT mipSlice = 0,
81 FLOAT topLeftX = 0.0f,
82 FLOAT topLeftY = 0.0f,
83 FLOAT minDepth = D3D12_MIN_DEPTH,
84 FLOAT maxDepth = D3D12_MAX_DEPTH ) noexcept
85 {
86#if defined(_MSC_VER) || !defined(_WIN32)
87 const auto Desc = pResource->GetDesc();
88#else
89 D3D12_RESOURCE_DESC tmpDesc;
90 const auto& Desc = *pResource->GetDesc(&tmpDesc);
91#endif
92 const UINT64 SubresourceWidth = Desc.Width >> mipSlice;
93 const UINT64 SubresourceHeight = Desc.Height >> mipSlice;
94 switch (Desc.Dimension)
95 {
96 case D3D12_RESOURCE_DIMENSION_BUFFER:
97 TopLeftX = topLeftX;
98 TopLeftY = 0.0f;
99 Width = float(Desc.Width) - topLeftX;
100 Height = 1.0f;
101 break;
102 case D3D12_RESOURCE_DIMENSION_TEXTURE1D:
103 TopLeftX = topLeftX;
104 TopLeftY = 0.0f;
105 Width = (SubresourceWidth ? float(SubresourceWidth) : 1.0f) - topLeftX;
106 Height = 1.0f;
107 break;
108 case D3D12_RESOURCE_DIMENSION_TEXTURE2D:
109 case D3D12_RESOURCE_DIMENSION_TEXTURE3D:
110 TopLeftX = topLeftX;
111 TopLeftY = topLeftY;
112 Width = (SubresourceWidth ? float(SubresourceWidth) : 1.0f) - topLeftX;
113 Height = (SubresourceHeight ? float(SubresourceHeight) : 1.0f) - topLeftY;
114 break;
115 default: break;
116 }
117
118 MinDepth = minDepth;
119 MaxDepth = maxDepth;
120 }
121};
122
123//------------------------------------------------------------------------------------------------
124struct CD3DX12_BOX : public D3D12_BOX
125{
126 CD3DX12_BOX() = default;
127 explicit CD3DX12_BOX( const D3D12_BOX& o ) noexcept :
128 D3D12_BOX( o )
129 {}
130 explicit CD3DX12_BOX(
131 LONG Left,
132 LONG Right ) noexcept
133 {
134 left = static_cast<UINT>(Left);
135 top = 0;
136 front = 0;
137 right = static_cast<UINT>(Right);
138 bottom = 1;
139 back = 1;
140 }
141 explicit CD3DX12_BOX(
142 LONG Left,
143 LONG Top,
144 LONG Right,
145 LONG Bottom ) noexcept
146 {
147 left = static_cast<UINT>(Left);
148 top = static_cast<UINT>(Top);
149 front = 0;
150 right = static_cast<UINT>(Right);
151 bottom = static_cast<UINT>(Bottom);
152 back = 1;
153 }
154 explicit CD3DX12_BOX(
155 LONG Left,
156 LONG Top,
157 LONG Front,
158 LONG Right,
159 LONG Bottom,
160 LONG Back ) noexcept
161 {
162 left = static_cast<UINT>(Left);
163 top = static_cast<UINT>(Top);
164 front = static_cast<UINT>(Front);
165 right = static_cast<UINT>(Right);
166 bottom = static_cast<UINT>(Bottom);
167 back = static_cast<UINT>(Back);
168 }
169};
170inline bool operator==( const D3D12_BOX& l, const D3D12_BOX& r ) noexcept
171{
172 return l.left == r.left && l.top == r.top && l.front == r.front &&
173 l.right == r.right && l.bottom == r.bottom && l.back == r.back;
174}
175inline bool operator!=( const D3D12_BOX& l, const D3D12_BOX& r ) noexcept
176{ return !( l == r ); }
177
178//------------------------------------------------------------------------------------------------
179struct CD3DX12_DEPTH_STENCIL_DESC : public D3D12_DEPTH_STENCIL_DESC
180{
181 CD3DX12_DEPTH_STENCIL_DESC() = default;
182 explicit CD3DX12_DEPTH_STENCIL_DESC( const D3D12_DEPTH_STENCIL_DESC& o ) noexcept :
183 D3D12_DEPTH_STENCIL_DESC( o )
184 {}
185 explicit CD3DX12_DEPTH_STENCIL_DESC( CD3DX12_DEFAULT ) noexcept
186 {
187 DepthEnable = TRUE;
188 DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL;
189 DepthFunc = D3D12_COMPARISON_FUNC_LESS;
190 StencilEnable = FALSE;
191 StencilReadMask = D3D12_DEFAULT_STENCIL_READ_MASK;
192 StencilWriteMask = D3D12_DEFAULT_STENCIL_WRITE_MASK;
193 const D3D12_DEPTH_STENCILOP_DESC defaultStencilOp =
194 { D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, D3D12_COMPARISON_FUNC_ALWAYS };
195 FrontFace = defaultStencilOp;
196 BackFace = defaultStencilOp;
197 }
198 explicit CD3DX12_DEPTH_STENCIL_DESC(
199 BOOL depthEnable,
200 D3D12_DEPTH_WRITE_MASK depthWriteMask,
201 D3D12_COMPARISON_FUNC depthFunc,
202 BOOL stencilEnable,
203 UINT8 stencilReadMask,
204 UINT8 stencilWriteMask,
205 D3D12_STENCIL_OP frontStencilFailOp,
206 D3D12_STENCIL_OP frontStencilDepthFailOp,
207 D3D12_STENCIL_OP frontStencilPassOp,
208 D3D12_COMPARISON_FUNC frontStencilFunc,
209 D3D12_STENCIL_OP backStencilFailOp,
210 D3D12_STENCIL_OP backStencilDepthFailOp,
211 D3D12_STENCIL_OP backStencilPassOp,
212 D3D12_COMPARISON_FUNC backStencilFunc ) noexcept
213 {
214 DepthEnable = depthEnable;
215 DepthWriteMask = depthWriteMask;
216 DepthFunc = depthFunc;
217 StencilEnable = stencilEnable;
218 StencilReadMask = stencilReadMask;
219 StencilWriteMask = stencilWriteMask;
220 FrontFace.StencilFailOp = frontStencilFailOp;
221 FrontFace.StencilDepthFailOp = frontStencilDepthFailOp;
222 FrontFace.StencilPassOp = frontStencilPassOp;
223 FrontFace.StencilFunc = frontStencilFunc;
224 BackFace.StencilFailOp = backStencilFailOp;
225 BackFace.StencilDepthFailOp = backStencilDepthFailOp;
226 BackFace.StencilPassOp = backStencilPassOp;
227 BackFace.StencilFunc = backStencilFunc;
228 }
229};
230
231//------------------------------------------------------------------------------------------------
232struct CD3DX12_DEPTH_STENCIL_DESC1 : public D3D12_DEPTH_STENCIL_DESC1
233{
234 CD3DX12_DEPTH_STENCIL_DESC1() = default;
235 explicit CD3DX12_DEPTH_STENCIL_DESC1( const D3D12_DEPTH_STENCIL_DESC1& o ) noexcept :
236 D3D12_DEPTH_STENCIL_DESC1( o )
237 {}
238 explicit CD3DX12_DEPTH_STENCIL_DESC1( const D3D12_DEPTH_STENCIL_DESC& o ) noexcept
239 {
240 DepthEnable = o.DepthEnable;
241 DepthWriteMask = o.DepthWriteMask;
242 DepthFunc = o.DepthFunc;
243 StencilEnable = o.StencilEnable;
244 StencilReadMask = o.StencilReadMask;
245 StencilWriteMask = o.StencilWriteMask;
246 FrontFace.StencilFailOp = o.FrontFace.StencilFailOp;
247 FrontFace.StencilDepthFailOp = o.FrontFace.StencilDepthFailOp;
248 FrontFace.StencilPassOp = o.FrontFace.StencilPassOp;
249 FrontFace.StencilFunc = o.FrontFace.StencilFunc;
250 BackFace.StencilFailOp = o.BackFace.StencilFailOp;
251 BackFace.StencilDepthFailOp = o.BackFace.StencilDepthFailOp;
252 BackFace.StencilPassOp = o.BackFace.StencilPassOp;
253 BackFace.StencilFunc = o.BackFace.StencilFunc;
254 DepthBoundsTestEnable = FALSE;
255 }
256 explicit CD3DX12_DEPTH_STENCIL_DESC1( CD3DX12_DEFAULT ) noexcept
257 {
258 DepthEnable = TRUE;
259 DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL;
260 DepthFunc = D3D12_COMPARISON_FUNC_LESS;
261 StencilEnable = FALSE;
262 StencilReadMask = D3D12_DEFAULT_STENCIL_READ_MASK;
263 StencilWriteMask = D3D12_DEFAULT_STENCIL_WRITE_MASK;
264 const D3D12_DEPTH_STENCILOP_DESC defaultStencilOp =
265 { D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, D3D12_COMPARISON_FUNC_ALWAYS };
266 FrontFace = defaultStencilOp;
267 BackFace = defaultStencilOp;
268 DepthBoundsTestEnable = FALSE;
269 }
270 explicit CD3DX12_DEPTH_STENCIL_DESC1(
271 BOOL depthEnable,
272 D3D12_DEPTH_WRITE_MASK depthWriteMask,
273 D3D12_COMPARISON_FUNC depthFunc,
274 BOOL stencilEnable,
275 UINT8 stencilReadMask,
276 UINT8 stencilWriteMask,
277 D3D12_STENCIL_OP frontStencilFailOp,
278 D3D12_STENCIL_OP frontStencilDepthFailOp,
279 D3D12_STENCIL_OP frontStencilPassOp,
280 D3D12_COMPARISON_FUNC frontStencilFunc,
281 D3D12_STENCIL_OP backStencilFailOp,
282 D3D12_STENCIL_OP backStencilDepthFailOp,
283 D3D12_STENCIL_OP backStencilPassOp,
284 D3D12_COMPARISON_FUNC backStencilFunc,
285 BOOL depthBoundsTestEnable ) noexcept
286 {
287 DepthEnable = depthEnable;
288 DepthWriteMask = depthWriteMask;
289 DepthFunc = depthFunc;
290 StencilEnable = stencilEnable;
291 StencilReadMask = stencilReadMask;
292 StencilWriteMask = stencilWriteMask;
293 FrontFace.StencilFailOp = frontStencilFailOp;
294 FrontFace.StencilDepthFailOp = frontStencilDepthFailOp;
295 FrontFace.StencilPassOp = frontStencilPassOp;
296 FrontFace.StencilFunc = frontStencilFunc;
297 BackFace.StencilFailOp = backStencilFailOp;
298 BackFace.StencilDepthFailOp = backStencilDepthFailOp;
299 BackFace.StencilPassOp = backStencilPassOp;
300 BackFace.StencilFunc = backStencilFunc;
301 DepthBoundsTestEnable = depthBoundsTestEnable;
302 }
303 operator D3D12_DEPTH_STENCIL_DESC() const noexcept
304 {
305 D3D12_DEPTH_STENCIL_DESC D;
306 D.DepthEnable = DepthEnable;
307 D.DepthWriteMask = DepthWriteMask;
308 D.DepthFunc = DepthFunc;
309 D.StencilEnable = StencilEnable;
310 D.StencilReadMask = StencilReadMask;
311 D.StencilWriteMask = StencilWriteMask;
312 D.FrontFace.StencilFailOp = FrontFace.StencilFailOp;
313 D.FrontFace.StencilDepthFailOp = FrontFace.StencilDepthFailOp;
314 D.FrontFace.StencilPassOp = FrontFace.StencilPassOp;
315 D.FrontFace.StencilFunc = FrontFace.StencilFunc;
316 D.BackFace.StencilFailOp = BackFace.StencilFailOp;
317 D.BackFace.StencilDepthFailOp = BackFace.StencilDepthFailOp;
318 D.BackFace.StencilPassOp = BackFace.StencilPassOp;
319 D.BackFace.StencilFunc = BackFace.StencilFunc;
320 return D;
321 }
322};
323
324//------------------------------------------------------------------------------------------------
325#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
326struct CD3DX12_DEPTH_STENCIL_DESC2 : public D3D12_DEPTH_STENCIL_DESC2
327{
328 CD3DX12_DEPTH_STENCIL_DESC2() = default;
329 explicit CD3DX12_DEPTH_STENCIL_DESC2( const D3D12_DEPTH_STENCIL_DESC2& o ) noexcept :
330 D3D12_DEPTH_STENCIL_DESC2( o )
331 {}
332 explicit CD3DX12_DEPTH_STENCIL_DESC2( const D3D12_DEPTH_STENCIL_DESC1& o ) noexcept
333 {
334 DepthEnable = o.DepthEnable;
335 DepthWriteMask = o.DepthWriteMask;
336 DepthFunc = o.DepthFunc;
337 StencilEnable = o.StencilEnable;
338 FrontFace.StencilFailOp = o.FrontFace.StencilFailOp;
339 FrontFace.StencilDepthFailOp = o.FrontFace.StencilDepthFailOp;
340 FrontFace.StencilPassOp = o.FrontFace.StencilPassOp;
341 FrontFace.StencilFunc = o.FrontFace.StencilFunc;
342 FrontFace.StencilReadMask = o.StencilReadMask;
343 FrontFace.StencilWriteMask = o.StencilWriteMask;
344
345 BackFace.StencilFailOp = o.BackFace.StencilFailOp;
346 BackFace.StencilDepthFailOp = o.BackFace.StencilDepthFailOp;
347 BackFace.StencilPassOp = o.BackFace.StencilPassOp;
348 BackFace.StencilFunc = o.BackFace.StencilFunc;
349 BackFace.StencilReadMask = o.StencilReadMask;
350 BackFace.StencilWriteMask = o.StencilWriteMask;
351 DepthBoundsTestEnable = o.DepthBoundsTestEnable;
352 }
353 explicit CD3DX12_DEPTH_STENCIL_DESC2( const D3D12_DEPTH_STENCIL_DESC& o ) noexcept
354 {
355 DepthEnable = o.DepthEnable;
356 DepthWriteMask = o.DepthWriteMask;
357 DepthFunc = o.DepthFunc;
358 StencilEnable = o.StencilEnable;
359
360 FrontFace.StencilFailOp = o.FrontFace.StencilFailOp;
361 FrontFace.StencilDepthFailOp = o.FrontFace.StencilDepthFailOp;
362 FrontFace.StencilPassOp = o.FrontFace.StencilPassOp;
363 FrontFace.StencilFunc = o.FrontFace.StencilFunc;
364 FrontFace.StencilReadMask = o.StencilReadMask;
365 FrontFace.StencilWriteMask = o.StencilWriteMask;
366
367 BackFace.StencilFailOp = o.BackFace.StencilFailOp;
368 BackFace.StencilDepthFailOp = o.BackFace.StencilDepthFailOp;
369 BackFace.StencilPassOp = o.BackFace.StencilPassOp;
370 BackFace.StencilFunc = o.BackFace.StencilFunc;
371 BackFace.StencilReadMask = o.StencilReadMask;
372 BackFace.StencilWriteMask = o.StencilWriteMask;
373
374 DepthBoundsTestEnable = FALSE;
375 }
376 explicit CD3DX12_DEPTH_STENCIL_DESC2( CD3DX12_DEFAULT ) noexcept
377 {
378 DepthEnable = TRUE;
379 DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL;
380 DepthFunc = D3D12_COMPARISON_FUNC_LESS;
381 StencilEnable = FALSE;
382 const D3D12_DEPTH_STENCILOP_DESC1 defaultStencilOp =
383 { D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, D3D12_COMPARISON_FUNC_ALWAYS, D3D12_DEFAULT_STENCIL_READ_MASK, D3D12_DEFAULT_STENCIL_WRITE_MASK };
384 FrontFace = defaultStencilOp;
385 BackFace = defaultStencilOp;
386 DepthBoundsTestEnable = FALSE;
387 }
388 explicit CD3DX12_DEPTH_STENCIL_DESC2(
389 BOOL depthEnable,
390 D3D12_DEPTH_WRITE_MASK depthWriteMask,
391 D3D12_COMPARISON_FUNC depthFunc,
392 BOOL stencilEnable,
393 D3D12_STENCIL_OP frontStencilFailOp,
394 D3D12_STENCIL_OP frontStencilDepthFailOp,
395 D3D12_STENCIL_OP frontStencilPassOp,
396 D3D12_COMPARISON_FUNC frontStencilFunc,
397 UINT8 frontStencilReadMask,
398 UINT8 frontStencilWriteMask,
399 D3D12_STENCIL_OP backStencilFailOp,
400 D3D12_STENCIL_OP backStencilDepthFailOp,
401 D3D12_STENCIL_OP backStencilPassOp,
402 D3D12_COMPARISON_FUNC backStencilFunc,
403 UINT8 backStencilReadMask,
404 UINT8 backStencilWriteMask,
405 BOOL depthBoundsTestEnable ) noexcept
406 {
407 DepthEnable = depthEnable;
408 DepthWriteMask = depthWriteMask;
409 DepthFunc = depthFunc;
410 StencilEnable = stencilEnable;
411
412 FrontFace.StencilFailOp = frontStencilFailOp;
413 FrontFace.StencilDepthFailOp = frontStencilDepthFailOp;
414 FrontFace.StencilPassOp = frontStencilPassOp;
415 FrontFace.StencilFunc = frontStencilFunc;
416 FrontFace.StencilReadMask = frontStencilReadMask;
417 FrontFace.StencilWriteMask = frontStencilWriteMask;
418
419 BackFace.StencilFailOp = backStencilFailOp;
420 BackFace.StencilDepthFailOp = backStencilDepthFailOp;
421 BackFace.StencilPassOp = backStencilPassOp;
422 BackFace.StencilFunc = backStencilFunc;
423 BackFace.StencilReadMask = backStencilReadMask;
424 BackFace.StencilWriteMask = backStencilWriteMask;
425
426 DepthBoundsTestEnable = depthBoundsTestEnable;
427 }
428
429 operator D3D12_DEPTH_STENCIL_DESC() const noexcept
430 {
431 D3D12_DEPTH_STENCIL_DESC D;
432 D.DepthEnable = DepthEnable;
433 D.DepthWriteMask = DepthWriteMask;
434 D.DepthFunc = DepthFunc;
435 D.StencilEnable = StencilEnable;
436 D.StencilReadMask = FrontFace.StencilReadMask;
437 D.StencilWriteMask = FrontFace.StencilWriteMask;
438 D.FrontFace.StencilFailOp = FrontFace.StencilFailOp;
439 D.FrontFace.StencilDepthFailOp = FrontFace.StencilDepthFailOp;
440 D.FrontFace.StencilPassOp = FrontFace.StencilPassOp;
441 D.FrontFace.StencilFunc = FrontFace.StencilFunc;
442 D.BackFace.StencilFailOp = BackFace.StencilFailOp;
443 D.BackFace.StencilDepthFailOp = BackFace.StencilDepthFailOp;
444 D.BackFace.StencilPassOp = BackFace.StencilPassOp;
445 D.BackFace.StencilFunc = BackFace.StencilFunc;
446 return D;
447 }
448};
449#endif // D3D12_SDK_VERSION >= 606
450
451//------------------------------------------------------------------------------------------------
452struct CD3DX12_BLEND_DESC : public D3D12_BLEND_DESC
453{
454 CD3DX12_BLEND_DESC() = default;
455 explicit CD3DX12_BLEND_DESC( const D3D12_BLEND_DESC& o ) noexcept :
456 D3D12_BLEND_DESC( o )
457 {}
458 explicit CD3DX12_BLEND_DESC( CD3DX12_DEFAULT ) noexcept
459 {
460 AlphaToCoverageEnable = FALSE;
461 IndependentBlendEnable = FALSE;
462 const D3D12_RENDER_TARGET_BLEND_DESC defaultRenderTargetBlendDesc =
463 {
464 FALSE,FALSE,
465 D3D12_BLEND_ONE, D3D12_BLEND_ZERO, D3D12_BLEND_OP_ADD,
466 D3D12_BLEND_ONE, D3D12_BLEND_ZERO, D3D12_BLEND_OP_ADD,
467 D3D12_LOGIC_OP_NOOP,
468 D3D12_COLOR_WRITE_ENABLE_ALL,
469 };
470 for (UINT i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i)
471 RenderTarget[ i ] = defaultRenderTargetBlendDesc;
472 }
473};
474
475//------------------------------------------------------------------------------------------------
476struct CD3DX12_RASTERIZER_DESC : public D3D12_RASTERIZER_DESC
477{
478 CD3DX12_RASTERIZER_DESC() = default;
479 explicit CD3DX12_RASTERIZER_DESC( const D3D12_RASTERIZER_DESC& o ) noexcept :
480 D3D12_RASTERIZER_DESC( o )
481 {}
482 explicit CD3DX12_RASTERIZER_DESC( CD3DX12_DEFAULT ) noexcept
483 {
484 FillMode = D3D12_FILL_MODE_SOLID;
485 CullMode = D3D12_CULL_MODE_BACK;
486 FrontCounterClockwise = FALSE;
487 DepthBias = D3D12_DEFAULT_DEPTH_BIAS;
488 DepthBiasClamp = D3D12_DEFAULT_DEPTH_BIAS_CLAMP;
489 SlopeScaledDepthBias = D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS;
490 DepthClipEnable = TRUE;
491 MultisampleEnable = FALSE;
492 AntialiasedLineEnable = FALSE;
493 ForcedSampleCount = 0;
494 ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
495 }
496 explicit CD3DX12_RASTERIZER_DESC(
497 D3D12_FILL_MODE fillMode,
498 D3D12_CULL_MODE cullMode,
499 BOOL frontCounterClockwise,
500 INT depthBias,
501 FLOAT depthBiasClamp,
502 FLOAT slopeScaledDepthBias,
503 BOOL depthClipEnable,
504 BOOL multisampleEnable,
505 BOOL antialiasedLineEnable,
506 UINT forcedSampleCount,
507 D3D12_CONSERVATIVE_RASTERIZATION_MODE conservativeRaster) noexcept
508 {
509 FillMode = fillMode;
510 CullMode = cullMode;
511 FrontCounterClockwise = frontCounterClockwise;
512 DepthBias = depthBias;
513 DepthBiasClamp = depthBiasClamp;
514 SlopeScaledDepthBias = slopeScaledDepthBias;
515 DepthClipEnable = depthClipEnable;
516 MultisampleEnable = multisampleEnable;
517 AntialiasedLineEnable = antialiasedLineEnable;
518 ForcedSampleCount = forcedSampleCount;
519 ConservativeRaster = conservativeRaster;
520 }
521};
522
523//------------------------------------------------------------------------------------------------
524#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
525struct CD3DX12_RASTERIZER_DESC1 : public D3D12_RASTERIZER_DESC1
526{
527 CD3DX12_RASTERIZER_DESC1() = default;
528 explicit CD3DX12_RASTERIZER_DESC1(const D3D12_RASTERIZER_DESC1& o) noexcept :
529 D3D12_RASTERIZER_DESC1(o)
530
531 {
532 }
533 explicit CD3DX12_RASTERIZER_DESC1(const D3D12_RASTERIZER_DESC& o) noexcept
534 {
535 FillMode = o.FillMode;
536 CullMode = o.CullMode;
537 FrontCounterClockwise = o.FrontCounterClockwise;
538 DepthBias = static_cast<FLOAT>(o.DepthBias);
539 DepthBiasClamp = o.DepthBiasClamp;
540 SlopeScaledDepthBias = o.SlopeScaledDepthBias;
541 DepthClipEnable = o.DepthClipEnable;
542 MultisampleEnable = o.MultisampleEnable;
543 AntialiasedLineEnable = o.AntialiasedLineEnable;
544 ForcedSampleCount = o.ForcedSampleCount;
545 ConservativeRaster = o.ConservativeRaster;
546 }
547 explicit CD3DX12_RASTERIZER_DESC1(CD3DX12_DEFAULT) noexcept
548 {
549 FillMode = D3D12_FILL_MODE_SOLID;
550 CullMode = D3D12_CULL_MODE_BACK;
551 FrontCounterClockwise = FALSE;
552 DepthBias = D3D12_DEFAULT_DEPTH_BIAS;
553 DepthBiasClamp = D3D12_DEFAULT_DEPTH_BIAS_CLAMP;
554 SlopeScaledDepthBias = D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS;
555 DepthClipEnable = TRUE;
556 MultisampleEnable = FALSE;
557 AntialiasedLineEnable = FALSE;
558 ForcedSampleCount = 0;
559 ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
560 }
561 explicit CD3DX12_RASTERIZER_DESC1(
562 D3D12_FILL_MODE fillMode,
563 D3D12_CULL_MODE cullMode,
564 BOOL frontCounterClockwise,
565 FLOAT depthBias,
566 FLOAT depthBiasClamp,
567 FLOAT slopeScaledDepthBias,
568 BOOL depthClipEnable,
569 BOOL multisampleEnable,
570 BOOL antialiasedLineEnable,
571 UINT forcedSampleCount,
572 D3D12_CONSERVATIVE_RASTERIZATION_MODE conservativeRaster) noexcept
573 {
574 FillMode = fillMode;
575 CullMode = cullMode;
576 FrontCounterClockwise = frontCounterClockwise;
577 DepthBias = depthBias;
578 DepthBiasClamp = depthBiasClamp;
579 SlopeScaledDepthBias = slopeScaledDepthBias;
580 DepthClipEnable = depthClipEnable;
581 MultisampleEnable = multisampleEnable;
582 AntialiasedLineEnable = antialiasedLineEnable;
583 ForcedSampleCount = forcedSampleCount;
584 ConservativeRaster = conservativeRaster;
585 }
586
587
588 operator D3D12_RASTERIZER_DESC() const noexcept
589 {
590 D3D12_RASTERIZER_DESC o;
591
592 o.FillMode = FillMode;
593 o.CullMode = CullMode;
594 o.FrontCounterClockwise = FrontCounterClockwise;
595 o.DepthBias = static_cast<INT>(DepthBias);
596 o.DepthBiasClamp = DepthBiasClamp;
597 o.SlopeScaledDepthBias = SlopeScaledDepthBias;
598 o.DepthClipEnable = DepthClipEnable;
599 o.MultisampleEnable = MultisampleEnable;
600 o.AntialiasedLineEnable = AntialiasedLineEnable;
601 o.ForcedSampleCount = ForcedSampleCount;
602 o.ConservativeRaster = ConservativeRaster;
603
604 return o;
605 }
606};
607#endif // D3D12_SDK_VERSION >= 608
608
609//------------------------------------------------------------------------------------------------
610#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
611struct CD3DX12_RASTERIZER_DESC2 : public D3D12_RASTERIZER_DESC2
612{
613 CD3DX12_RASTERIZER_DESC2() = default;
614 explicit CD3DX12_RASTERIZER_DESC2(const D3D12_RASTERIZER_DESC2& o) noexcept :
615 D3D12_RASTERIZER_DESC2(o)
616
617 {
618 }
619 explicit CD3DX12_RASTERIZER_DESC2(const D3D12_RASTERIZER_DESC1& o) noexcept
620 {
621 FillMode = o.FillMode;
622 CullMode = o.CullMode;
623 FrontCounterClockwise = o.FrontCounterClockwise;
624 DepthBias = o.DepthBias;
625 DepthBiasClamp = o.DepthBiasClamp;
626 SlopeScaledDepthBias = o.SlopeScaledDepthBias;
627 DepthClipEnable = o.DepthClipEnable;
628 LineRasterizationMode = D3D12_LINE_RASTERIZATION_MODE_ALIASED;
629 if (o.MultisampleEnable)
630 {
631 LineRasterizationMode = D3D12_LINE_RASTERIZATION_MODE_QUADRILATERAL_WIDE;
632 }
633 else if (o.AntialiasedLineEnable)
634 {
635 LineRasterizationMode = D3D12_LINE_RASTERIZATION_MODE_ALPHA_ANTIALIASED;
636 }
637 ForcedSampleCount = o.ForcedSampleCount;
638 ConservativeRaster = o.ConservativeRaster;
639 }
640 explicit CD3DX12_RASTERIZER_DESC2(const D3D12_RASTERIZER_DESC& o) noexcept
641 : CD3DX12_RASTERIZER_DESC2(CD3DX12_RASTERIZER_DESC1(o))
642 {
643 }
644 explicit CD3DX12_RASTERIZER_DESC2(CD3DX12_DEFAULT) noexcept
645 {
646 FillMode = D3D12_FILL_MODE_SOLID;
647 CullMode = D3D12_CULL_MODE_BACK;
648 FrontCounterClockwise = FALSE;
649 DepthBias = D3D12_DEFAULT_DEPTH_BIAS;
650 DepthBiasClamp = D3D12_DEFAULT_DEPTH_BIAS_CLAMP;
651 SlopeScaledDepthBias = D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS;
652 DepthClipEnable = TRUE;
653 LineRasterizationMode = D3D12_LINE_RASTERIZATION_MODE_ALIASED;
654 ForcedSampleCount = 0;
655 ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
656 }
657 explicit CD3DX12_RASTERIZER_DESC2(
658 D3D12_FILL_MODE fillMode,
659 D3D12_CULL_MODE cullMode,
660 BOOL frontCounterClockwise,
661 FLOAT depthBias,
662 FLOAT depthBiasClamp,
663 FLOAT slopeScaledDepthBias,
664 BOOL depthClipEnable,
665 D3D12_LINE_RASTERIZATION_MODE lineRasterizationMode,
666 UINT forcedSampleCount,
667 D3D12_CONSERVATIVE_RASTERIZATION_MODE conservativeRaster) noexcept
668 {
669 FillMode = fillMode;
670 CullMode = cullMode;
671 FrontCounterClockwise = frontCounterClockwise;
672 DepthBias = depthBias;
673 DepthBiasClamp = depthBiasClamp;
674 SlopeScaledDepthBias = slopeScaledDepthBias;
675 DepthClipEnable = depthClipEnable;
676 LineRasterizationMode = lineRasterizationMode;
677 ForcedSampleCount = forcedSampleCount;
678 ConservativeRaster = conservativeRaster;
679 }
680
681
682 operator D3D12_RASTERIZER_DESC1() const noexcept
683 {
684 D3D12_RASTERIZER_DESC1 o;
685
686 o.FillMode = FillMode;
687 o.CullMode = CullMode;
688 o.FrontCounterClockwise = FrontCounterClockwise;
689 o.DepthBias = DepthBias;
690 o.DepthBiasClamp = DepthBiasClamp;
691 o.SlopeScaledDepthBias = SlopeScaledDepthBias;
692 o.DepthClipEnable = DepthClipEnable;
693 o.MultisampleEnable = FALSE;
694 o.AntialiasedLineEnable = FALSE;
695 if (LineRasterizationMode == D3D12_LINE_RASTERIZATION_MODE_ALPHA_ANTIALIASED)
696 {
697 o.AntialiasedLineEnable = TRUE;
698 }
699 else if (LineRasterizationMode != D3D12_LINE_RASTERIZATION_MODE_ALIASED)
700 {
701 o.MultisampleEnable = TRUE;
702 }
703 o.ForcedSampleCount = ForcedSampleCount;
704 o.ConservativeRaster = ConservativeRaster;
705
706 return o;
707 }
708 operator D3D12_RASTERIZER_DESC() const noexcept
709 {
710 return static_cast<D3D12_RASTERIZER_DESC>(CD3DX12_RASTERIZER_DESC1(static_cast<D3D12_RASTERIZER_DESC1>(*this)));
711 }
712};
713#endif // D3D12_SDK_VERSION >= 610
714
715//------------------------------------------------------------------------------------------------
716struct CD3DX12_RESOURCE_ALLOCATION_INFO : public D3D12_RESOURCE_ALLOCATION_INFO
717{
718 CD3DX12_RESOURCE_ALLOCATION_INFO() = default;
719 explicit CD3DX12_RESOURCE_ALLOCATION_INFO( const D3D12_RESOURCE_ALLOCATION_INFO& o ) noexcept :
720 D3D12_RESOURCE_ALLOCATION_INFO( o )
721 {}
722 CD3DX12_RESOURCE_ALLOCATION_INFO(
723 UINT64 size,
724 UINT64 alignment ) noexcept
725 {
726 SizeInBytes = size;
727 Alignment = alignment;
728 }
729};
730
731//------------------------------------------------------------------------------------------------
732struct CD3DX12_HEAP_PROPERTIES : public D3D12_HEAP_PROPERTIES
733{
734 CD3DX12_HEAP_PROPERTIES() = default;
735 explicit CD3DX12_HEAP_PROPERTIES(const D3D12_HEAP_PROPERTIES &o) noexcept :
736 D3D12_HEAP_PROPERTIES(o)
737 {}
738 CD3DX12_HEAP_PROPERTIES(
739 D3D12_CPU_PAGE_PROPERTY cpuPageProperty,
740 D3D12_MEMORY_POOL memoryPoolPreference,
741 UINT creationNodeMask = 1,
742 UINT nodeMask = 1 ) noexcept
743 {
744 Type = D3D12_HEAP_TYPE_CUSTOM;
745 CPUPageProperty = cpuPageProperty;
746 MemoryPoolPreference = memoryPoolPreference;
747 CreationNodeMask = creationNodeMask;
748 VisibleNodeMask = nodeMask;
749 }
750 explicit CD3DX12_HEAP_PROPERTIES(
751 D3D12_HEAP_TYPE type,
752 UINT creationNodeMask = 1,
753 UINT nodeMask = 1 ) noexcept
754 {
755 Type = type;
756 CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
757 MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
758 CreationNodeMask = creationNodeMask;
759 VisibleNodeMask = nodeMask;
760 }
761 bool IsCPUAccessible() const noexcept
762 {
763 return Type == D3D12_HEAP_TYPE_UPLOAD || Type == D3D12_HEAP_TYPE_READBACK
764#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)
765 || Type == D3D12_HEAP_TYPE_GPU_UPLOAD
766#endif
767 || (Type == D3D12_HEAP_TYPE_CUSTOM &&
768 (CPUPageProperty == D3D12_CPU_PAGE_PROPERTY_WRITE_COMBINE || CPUPageProperty == D3D12_CPU_PAGE_PROPERTY_WRITE_BACK));
769 }
770};
771inline bool operator==( const D3D12_HEAP_PROPERTIES& l, const D3D12_HEAP_PROPERTIES& r ) noexcept
772{
773 return l.Type == r.Type && l.CPUPageProperty == r.CPUPageProperty &&
774 l.MemoryPoolPreference == r.MemoryPoolPreference &&
775 l.CreationNodeMask == r.CreationNodeMask &&
776 l.VisibleNodeMask == r.VisibleNodeMask;
777}
778inline bool operator!=( const D3D12_HEAP_PROPERTIES& l, const D3D12_HEAP_PROPERTIES& r ) noexcept
779{ return !( l == r ); }
780
781//------------------------------------------------------------------------------------------------
782struct CD3DX12_HEAP_DESC : public D3D12_HEAP_DESC
783{
784 CD3DX12_HEAP_DESC() = default;
785 explicit CD3DX12_HEAP_DESC(const D3D12_HEAP_DESC &o) noexcept :
786 D3D12_HEAP_DESC(o)
787 {}
788 CD3DX12_HEAP_DESC(
789 UINT64 size,
790 D3D12_HEAP_PROPERTIES properties,
791 UINT64 alignment = 0,
792 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE ) noexcept
793 {
794 SizeInBytes = size;
795 Properties = properties;
796 Alignment = alignment;
797 Flags = flags;
798 }
799 CD3DX12_HEAP_DESC(
800 UINT64 size,
801 D3D12_HEAP_TYPE type,
802 UINT64 alignment = 0,
803 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE ) noexcept
804 {
805 SizeInBytes = size;
806 Properties = CD3DX12_HEAP_PROPERTIES( type );
807 Alignment = alignment;
808 Flags = flags;
809 }
810 CD3DX12_HEAP_DESC(
811 UINT64 size,
812 D3D12_CPU_PAGE_PROPERTY cpuPageProperty,
813 D3D12_MEMORY_POOL memoryPoolPreference,
814 UINT64 alignment = 0,
815 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE ) noexcept
816 {
817 SizeInBytes = size;
818 Properties = CD3DX12_HEAP_PROPERTIES( cpuPageProperty, memoryPoolPreference );
819 Alignment = alignment;
820 Flags = flags;
821 }
822 CD3DX12_HEAP_DESC(
823 const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
824 D3D12_HEAP_PROPERTIES properties,
825 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE ) noexcept
826 {
827 SizeInBytes = resAllocInfo.SizeInBytes;
828 Properties = properties;
829 Alignment = resAllocInfo.Alignment;
830 Flags = flags;
831 }
832 CD3DX12_HEAP_DESC(
833 const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
834 D3D12_HEAP_TYPE type,
835 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE ) noexcept
836 {
837 SizeInBytes = resAllocInfo.SizeInBytes;
838 Properties = CD3DX12_HEAP_PROPERTIES( type );
839 Alignment = resAllocInfo.Alignment;
840 Flags = flags;
841 }
842 CD3DX12_HEAP_DESC(
843 const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
844 D3D12_CPU_PAGE_PROPERTY cpuPageProperty,
845 D3D12_MEMORY_POOL memoryPoolPreference,
846 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE ) noexcept
847 {
848 SizeInBytes = resAllocInfo.SizeInBytes;
849 Properties = CD3DX12_HEAP_PROPERTIES( cpuPageProperty, memoryPoolPreference );
850 Alignment = resAllocInfo.Alignment;
851 Flags = flags;
852 }
853 bool IsCPUAccessible() const noexcept
854 { return static_cast< const CD3DX12_HEAP_PROPERTIES* >( &Properties )->IsCPUAccessible(); }
855};
856inline bool operator==( const D3D12_HEAP_DESC& l, const D3D12_HEAP_DESC& r ) noexcept
857{
858 return l.SizeInBytes == r.SizeInBytes &&
859 l.Properties == r.Properties &&
860 l.Alignment == r.Alignment &&
861 l.Flags == r.Flags;
862}
863inline bool operator!=( const D3D12_HEAP_DESC& l, const D3D12_HEAP_DESC& r ) noexcept
864{ return !( l == r ); }
865
866//------------------------------------------------------------------------------------------------
867struct CD3DX12_CLEAR_VALUE : public D3D12_CLEAR_VALUE
868{
869 CD3DX12_CLEAR_VALUE() = default;
870 explicit CD3DX12_CLEAR_VALUE(const D3D12_CLEAR_VALUE &o) noexcept :
871 D3D12_CLEAR_VALUE(o)
872 {}
873 CD3DX12_CLEAR_VALUE(
874 DXGI_FORMAT format,
875 const FLOAT color[4] ) noexcept
876 {
877 Format = format;
878 memcpy( Color, color, sizeof( Color ) );
879 }
880 CD3DX12_CLEAR_VALUE(
881 DXGI_FORMAT format,
882 FLOAT depth,
883 UINT8 stencil ) noexcept
884 {
885 Format = format;
886 memset( &Color, 0, sizeof( Color ) );
887 /* Use memcpy to preserve NAN values */
888 memcpy( &DepthStencil.Depth, &depth, sizeof( depth ) );
889 DepthStencil.Stencil = stencil;
890 }
891};
892
893//------------------------------------------------------------------------------------------------
894inline bool operator==( const D3D12_CLEAR_VALUE &a, const D3D12_CLEAR_VALUE &b) noexcept
895{
896 if (a.Format != b.Format) return false;
897 if (a.Format == DXGI_FORMAT_D24_UNORM_S8_UINT
898 || a.Format == DXGI_FORMAT_D16_UNORM
899 || a.Format == DXGI_FORMAT_D32_FLOAT
900 || a.Format == DXGI_FORMAT_D32_FLOAT_S8X24_UINT)
901 {
902 return (a.DepthStencil.Depth == b.DepthStencil.Depth) &&
903 (a.DepthStencil.Stencil == b.DepthStencil.Stencil);
904 } else {
905 return (a.Color[0] == b.Color[0]) &&
906 (a.Color[1] == b.Color[1]) &&
907 (a.Color[2] == b.Color[2]) &&
908 (a.Color[3] == b.Color[3]);
909 }
910}
911
912//------------------------------------------------------------------------------------------------
913struct CD3DX12_RANGE : public D3D12_RANGE
914{
915 CD3DX12_RANGE() = default;
916 explicit CD3DX12_RANGE(const D3D12_RANGE &o) noexcept :
917 D3D12_RANGE(o)
918 {}
919 CD3DX12_RANGE(
920 SIZE_T begin,
921 SIZE_T end ) noexcept
922 {
923 Begin = begin;
924 End = end;
925 }
926};
927
928//------------------------------------------------------------------------------------------------
929struct CD3DX12_RANGE_UINT64 : public D3D12_RANGE_UINT64
930{
931 CD3DX12_RANGE_UINT64() = default;
932 explicit CD3DX12_RANGE_UINT64(const D3D12_RANGE_UINT64 &o) noexcept :
933 D3D12_RANGE_UINT64(o)
934 {}
935 CD3DX12_RANGE_UINT64(
936 UINT64 begin,
937 UINT64 end ) noexcept
938 {
939 Begin = begin;
940 End = end;
941 }
942};
943
944//------------------------------------------------------------------------------------------------
945struct CD3DX12_SUBRESOURCE_RANGE_UINT64 : public D3D12_SUBRESOURCE_RANGE_UINT64
946{
947 CD3DX12_SUBRESOURCE_RANGE_UINT64() = default;
948 explicit CD3DX12_SUBRESOURCE_RANGE_UINT64(const D3D12_SUBRESOURCE_RANGE_UINT64 &o) noexcept :
949 D3D12_SUBRESOURCE_RANGE_UINT64(o)
950 {}
951 CD3DX12_SUBRESOURCE_RANGE_UINT64(
952 UINT subresource,
953 const D3D12_RANGE_UINT64& range ) noexcept
954 {
955 Subresource = subresource;
956 Range = range;
957 }
958 CD3DX12_SUBRESOURCE_RANGE_UINT64(
959 UINT subresource,
960 UINT64 begin,
961 UINT64 end ) noexcept
962 {
963 Subresource = subresource;
964 Range.Begin = begin;
965 Range.End = end;
966 }
967};
968
969//------------------------------------------------------------------------------------------------
970struct CD3DX12_SHADER_BYTECODE : public D3D12_SHADER_BYTECODE
971{
972 CD3DX12_SHADER_BYTECODE() = default;
973 explicit CD3DX12_SHADER_BYTECODE(const D3D12_SHADER_BYTECODE &o) noexcept :
974 D3D12_SHADER_BYTECODE(o)
975 {}
976 CD3DX12_SHADER_BYTECODE(
977 _In_ ID3DBlob* pShaderBlob ) noexcept
978 {
979 pShaderBytecode = pShaderBlob->GetBufferPointer();
980 BytecodeLength = pShaderBlob->GetBufferSize();
981 }
982 CD3DX12_SHADER_BYTECODE(
983 const void* _pShaderBytecode,
984 SIZE_T bytecodeLength ) noexcept
985 {
986 pShaderBytecode = _pShaderBytecode;
987 BytecodeLength = bytecodeLength;
988 }
989};
990
991//------------------------------------------------------------------------------------------------
992struct CD3DX12_TILED_RESOURCE_COORDINATE : public D3D12_TILED_RESOURCE_COORDINATE
993{
994 CD3DX12_TILED_RESOURCE_COORDINATE() = default;
995 explicit CD3DX12_TILED_RESOURCE_COORDINATE(const D3D12_TILED_RESOURCE_COORDINATE &o) noexcept :
996 D3D12_TILED_RESOURCE_COORDINATE(o)
997 {}
998 CD3DX12_TILED_RESOURCE_COORDINATE(
999 UINT x,
1000 UINT y,
1001 UINT z,
1002 UINT subresource ) noexcept
1003 {
1004 X = x;
1005 Y = y;
1006 Z = z;
1007 Subresource = subresource;
1008 }
1009};
1010
1011//------------------------------------------------------------------------------------------------
1012struct CD3DX12_TILE_REGION_SIZE : public D3D12_TILE_REGION_SIZE
1013{
1014 CD3DX12_TILE_REGION_SIZE() = default;
1015 explicit CD3DX12_TILE_REGION_SIZE(const D3D12_TILE_REGION_SIZE &o) noexcept :
1016 D3D12_TILE_REGION_SIZE(o)
1017 {}
1018 CD3DX12_TILE_REGION_SIZE(
1019 UINT numTiles,
1020 BOOL useBox,
1021 UINT width,
1022 UINT16 height,
1023 UINT16 depth ) noexcept
1024 {
1025 NumTiles = numTiles;
1026 UseBox = useBox;
1027 Width = width;
1028 Height = height;
1029 Depth = depth;
1030 }
1031};
1032
1033//------------------------------------------------------------------------------------------------
1034struct CD3DX12_SUBRESOURCE_TILING : public D3D12_SUBRESOURCE_TILING
1035{
1036 CD3DX12_SUBRESOURCE_TILING() = default;
1037 explicit CD3DX12_SUBRESOURCE_TILING(const D3D12_SUBRESOURCE_TILING &o) noexcept :
1038 D3D12_SUBRESOURCE_TILING(o)
1039 {}
1040 CD3DX12_SUBRESOURCE_TILING(
1041 UINT widthInTiles,
1042 UINT16 heightInTiles,
1043 UINT16 depthInTiles,
1044 UINT startTileIndexInOverallResource ) noexcept
1045 {
1046 WidthInTiles = widthInTiles;
1047 HeightInTiles = heightInTiles;
1048 DepthInTiles = depthInTiles;
1049 StartTileIndexInOverallResource = startTileIndexInOverallResource;
1050 }
1051};
1052
1053//------------------------------------------------------------------------------------------------
1054struct CD3DX12_TILE_SHAPE : public D3D12_TILE_SHAPE
1055{
1056 CD3DX12_TILE_SHAPE() = default;
1057 explicit CD3DX12_TILE_SHAPE(const D3D12_TILE_SHAPE &o) noexcept :
1058 D3D12_TILE_SHAPE(o)
1059 {}
1060 CD3DX12_TILE_SHAPE(
1061 UINT widthInTexels,
1062 UINT heightInTexels,
1063 UINT depthInTexels ) noexcept
1064 {
1065 WidthInTexels = widthInTexels;
1066 HeightInTexels = heightInTexels;
1067 DepthInTexels = depthInTexels;
1068 }
1069};
1070
1071//------------------------------------------------------------------------------------------------
1072struct CD3DX12_RESOURCE_BARRIER : public D3D12_RESOURCE_BARRIER
1073{
1074 CD3DX12_RESOURCE_BARRIER() = default;
1075 explicit CD3DX12_RESOURCE_BARRIER(const D3D12_RESOURCE_BARRIER &o) noexcept :
1076 D3D12_RESOURCE_BARRIER(o)
1077 {}
1078 static inline CD3DX12_RESOURCE_BARRIER Transition(
1079 _In_ ID3D12Resource* pResource,
1080 D3D12_RESOURCE_STATES stateBefore,
1081 D3D12_RESOURCE_STATES stateAfter,
1082 UINT subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES,
1083 D3D12_RESOURCE_BARRIER_FLAGS flags = D3D12_RESOURCE_BARRIER_FLAG_NONE) noexcept
1084 {
1085 CD3DX12_RESOURCE_BARRIER result = {};
1086 D3D12_RESOURCE_BARRIER &barrier = result;
1087 result.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
1088 result.Flags = flags;
1089 barrier.Transition.pResource = pResource;
1090 barrier.Transition.StateBefore = stateBefore;
1091 barrier.Transition.StateAfter = stateAfter;
1092 barrier.Transition.Subresource = subresource;
1093 return result;
1094 }
1095 static inline CD3DX12_RESOURCE_BARRIER Aliasing(
1096 _In_opt_ ID3D12Resource* pResourceBefore,
1097 _In_opt_ ID3D12Resource* pResourceAfter) noexcept
1098 {
1099 CD3DX12_RESOURCE_BARRIER result = {};
1100 D3D12_RESOURCE_BARRIER &barrier = result;
1101 result.Type = D3D12_RESOURCE_BARRIER_TYPE_ALIASING;
1102 barrier.Aliasing.pResourceBefore = pResourceBefore;
1103 barrier.Aliasing.pResourceAfter = pResourceAfter;
1104 return result;
1105 }
1106 static inline CD3DX12_RESOURCE_BARRIER UAV(
1107 _In_opt_ ID3D12Resource* pResource) noexcept
1108 {
1109 CD3DX12_RESOURCE_BARRIER result = {};
1110 D3D12_RESOURCE_BARRIER &barrier = result;
1111 result.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV;
1112 barrier.UAV.pResource = pResource;
1113 return result;
1114 }
1115};
1116
1117//------------------------------------------------------------------------------------------------
1118struct CD3DX12_PACKED_MIP_INFO : public D3D12_PACKED_MIP_INFO
1119{
1120 CD3DX12_PACKED_MIP_INFO() = default;
1121 explicit CD3DX12_PACKED_MIP_INFO(const D3D12_PACKED_MIP_INFO &o) noexcept :
1122 D3D12_PACKED_MIP_INFO(o)
1123 {}
1124 CD3DX12_PACKED_MIP_INFO(
1125 UINT8 numStandardMips,
1126 UINT8 numPackedMips,
1127 UINT numTilesForPackedMips,
1128 UINT startTileIndexInOverallResource ) noexcept
1129 {
1130 NumStandardMips = numStandardMips;
1131 NumPackedMips = numPackedMips;
1132 NumTilesForPackedMips = numTilesForPackedMips;
1133 StartTileIndexInOverallResource = startTileIndexInOverallResource;
1134 }
1135};
1136
1137//------------------------------------------------------------------------------------------------
1138struct CD3DX12_SUBRESOURCE_FOOTPRINT : public D3D12_SUBRESOURCE_FOOTPRINT
1139{
1140 CD3DX12_SUBRESOURCE_FOOTPRINT() = default;
1141 explicit CD3DX12_SUBRESOURCE_FOOTPRINT(const D3D12_SUBRESOURCE_FOOTPRINT &o) noexcept :
1142 D3D12_SUBRESOURCE_FOOTPRINT(o)
1143 {}
1144 CD3DX12_SUBRESOURCE_FOOTPRINT(
1145 DXGI_FORMAT format,
1146 UINT width,
1147 UINT height,
1148 UINT depth,
1149 UINT rowPitch ) noexcept
1150 {
1151 Format = format;
1152 Width = width;
1153 Height = height;
1154 Depth = depth;
1155 RowPitch = rowPitch;
1156 }
1157 explicit CD3DX12_SUBRESOURCE_FOOTPRINT(
1158 const D3D12_RESOURCE_DESC& resDesc,
1159 UINT rowPitch ) noexcept
1160 {
1161 Format = resDesc.Format;
1162 Width = UINT( resDesc.Width );
1163 Height = resDesc.Height;
1164 Depth = (resDesc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? resDesc.DepthOrArraySize : 1u);
1165 RowPitch = rowPitch;
1166 }
1167};
1168
1169//------------------------------------------------------------------------------------------------
1170struct CD3DX12_TEXTURE_COPY_LOCATION : public D3D12_TEXTURE_COPY_LOCATION
1171{
1172 CD3DX12_TEXTURE_COPY_LOCATION() = default;
1173 explicit CD3DX12_TEXTURE_COPY_LOCATION(const D3D12_TEXTURE_COPY_LOCATION &o) noexcept :
1174 D3D12_TEXTURE_COPY_LOCATION(o)
1175 {}
1176 CD3DX12_TEXTURE_COPY_LOCATION(_In_ ID3D12Resource* pRes) noexcept
1177 {
1178 pResource = pRes;
1179 Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
1180 PlacedFootprint = {};
1181 }
1182 CD3DX12_TEXTURE_COPY_LOCATION(_In_ ID3D12Resource* pRes, D3D12_PLACED_SUBRESOURCE_FOOTPRINT const& Footprint) noexcept
1183 {
1184 pResource = pRes;
1185 Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
1186 PlacedFootprint = Footprint;
1187 }
1188 CD3DX12_TEXTURE_COPY_LOCATION(_In_ ID3D12Resource* pRes, UINT Sub) noexcept
1189 {
1190 pResource = pRes;
1191 Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
1192 PlacedFootprint = {};
1193 SubresourceIndex = Sub;
1194 }
1195};
1196
1197//------------------------------------------------------------------------------------------------
1198struct CD3DX12_DESCRIPTOR_RANGE : public D3D12_DESCRIPTOR_RANGE
1199{
1200 CD3DX12_DESCRIPTOR_RANGE() = default;
1201 explicit CD3DX12_DESCRIPTOR_RANGE(const D3D12_DESCRIPTOR_RANGE &o) noexcept :
1202 D3D12_DESCRIPTOR_RANGE(o)
1203 {}
1204 CD3DX12_DESCRIPTOR_RANGE(
1205 D3D12_DESCRIPTOR_RANGE_TYPE rangeType,
1206 UINT numDescriptors,
1207 UINT baseShaderRegister,
1208 UINT registerSpace = 0,
1209 UINT offsetInDescriptorsFromTableStart =
1210 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) noexcept
1211 {
1212 Init(rangeType, numDescriptors, baseShaderRegister, registerSpace, offsetInDescriptorsFromTableStart);
1213 }
1214
1215 inline void Init(
1216 D3D12_DESCRIPTOR_RANGE_TYPE rangeType,
1217 UINT numDescriptors,
1218 UINT baseShaderRegister,
1219 UINT registerSpace = 0,
1220 UINT offsetInDescriptorsFromTableStart =
1221 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) noexcept
1222 {
1223 Init(*this, rangeType, numDescriptors, baseShaderRegister, registerSpace, offsetInDescriptorsFromTableStart);
1224 }
1225
1226 static inline void Init(
1227 _Out_ D3D12_DESCRIPTOR_RANGE &range,
1228 D3D12_DESCRIPTOR_RANGE_TYPE rangeType,
1229 UINT numDescriptors,
1230 UINT baseShaderRegister,
1231 UINT registerSpace = 0,
1232 UINT offsetInDescriptorsFromTableStart =
1233 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) noexcept
1234 {
1235 range.RangeType = rangeType;
1236 range.NumDescriptors = numDescriptors;
1237 range.BaseShaderRegister = baseShaderRegister;
1238 range.RegisterSpace = registerSpace;
1239 range.OffsetInDescriptorsFromTableStart = offsetInDescriptorsFromTableStart;
1240 }
1241};
1242
1243//------------------------------------------------------------------------------------------------
1244struct CD3DX12_ROOT_DESCRIPTOR_TABLE : public D3D12_ROOT_DESCRIPTOR_TABLE
1245{
1246 CD3DX12_ROOT_DESCRIPTOR_TABLE() = default;
1247 explicit CD3DX12_ROOT_DESCRIPTOR_TABLE(const D3D12_ROOT_DESCRIPTOR_TABLE &o) noexcept :
1248 D3D12_ROOT_DESCRIPTOR_TABLE(o)
1249 {}
1250 CD3DX12_ROOT_DESCRIPTOR_TABLE(
1251 UINT numDescriptorRanges,
1252 _In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges) noexcept
1253 {
1254 Init(numDescriptorRanges, _pDescriptorRanges);
1255 }
1256
1257 inline void Init(
1258 UINT numDescriptorRanges,
1259 _In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges) noexcept
1260 {
1261 Init(*this, numDescriptorRanges, _pDescriptorRanges);
1262 }
1263
1264 static inline void Init(
1265 _Out_ D3D12_ROOT_DESCRIPTOR_TABLE &rootDescriptorTable,
1266 UINT numDescriptorRanges,
1267 _In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges) noexcept
1268 {
1269 rootDescriptorTable.NumDescriptorRanges = numDescriptorRanges;
1270 rootDescriptorTable.pDescriptorRanges = _pDescriptorRanges;
1271 }
1272};
1273
1274//------------------------------------------------------------------------------------------------
1275struct CD3DX12_ROOT_CONSTANTS : public D3D12_ROOT_CONSTANTS
1276{
1277 CD3DX12_ROOT_CONSTANTS() = default;
1278 explicit CD3DX12_ROOT_CONSTANTS(const D3D12_ROOT_CONSTANTS &o) noexcept :
1279 D3D12_ROOT_CONSTANTS(o)
1280 {}
1281 CD3DX12_ROOT_CONSTANTS(
1282 UINT num32BitValues,
1283 UINT shaderRegister,
1284 UINT registerSpace = 0) noexcept
1285 {
1286 Init(num32BitValues, shaderRegister, registerSpace);
1287 }
1288
1289 inline void Init(
1290 UINT num32BitValues,
1291 UINT shaderRegister,
1292 UINT registerSpace = 0) noexcept
1293 {
1294 Init(*this, num32BitValues, shaderRegister, registerSpace);
1295 }
1296
1297 static inline void Init(
1298 _Out_ D3D12_ROOT_CONSTANTS &rootConstants,
1299 UINT num32BitValues,
1300 UINT shaderRegister,
1301 UINT registerSpace = 0) noexcept
1302 {
1303 rootConstants.Num32BitValues = num32BitValues;
1304 rootConstants.ShaderRegister = shaderRegister;
1305 rootConstants.RegisterSpace = registerSpace;
1306 }
1307};
1308
1309//------------------------------------------------------------------------------------------------
1310struct CD3DX12_ROOT_DESCRIPTOR : public D3D12_ROOT_DESCRIPTOR
1311{
1312 CD3DX12_ROOT_DESCRIPTOR() = default;
1313 explicit CD3DX12_ROOT_DESCRIPTOR(const D3D12_ROOT_DESCRIPTOR &o) noexcept :
1314 D3D12_ROOT_DESCRIPTOR(o)
1315 {}
1316 CD3DX12_ROOT_DESCRIPTOR(
1317 UINT shaderRegister,
1318 UINT registerSpace = 0) noexcept
1319 {
1320 Init(shaderRegister, registerSpace);
1321 }
1322
1323 inline void Init(
1324 UINT shaderRegister,
1325 UINT registerSpace = 0) noexcept
1326 {
1327 Init(*this, shaderRegister, registerSpace);
1328 }
1329
1330 static inline void Init(_Out_ D3D12_ROOT_DESCRIPTOR &table, UINT shaderRegister, UINT registerSpace = 0) noexcept
1331 {
1332 table.ShaderRegister = shaderRegister;
1333 table.RegisterSpace = registerSpace;
1334 }
1335};
1336
1337//------------------------------------------------------------------------------------------------
1338struct CD3DX12_ROOT_PARAMETER : public D3D12_ROOT_PARAMETER
1339{
1340 CD3DX12_ROOT_PARAMETER() = default;
1341 explicit CD3DX12_ROOT_PARAMETER(const D3D12_ROOT_PARAMETER &o) noexcept :
1342 D3D12_ROOT_PARAMETER(o)
1343 {}
1344
1345 static inline void InitAsDescriptorTable(
1346 _Out_ D3D12_ROOT_PARAMETER &rootParam,
1347 UINT numDescriptorRanges,
1348 _In_reads_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* pDescriptorRanges,
1349 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept
1350 {
1351 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
1352 rootParam.ShaderVisibility = visibility;
1353 CD3DX12_ROOT_DESCRIPTOR_TABLE::Init(rootParam.DescriptorTable, numDescriptorRanges, pDescriptorRanges);
1354 }
1355
1356 static inline void InitAsConstants(
1357 _Out_ D3D12_ROOT_PARAMETER &rootParam,
1358 UINT num32BitValues,
1359 UINT shaderRegister,
1360 UINT registerSpace = 0,
1361 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept
1362 {
1363 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;
1364 rootParam.ShaderVisibility = visibility;
1365 CD3DX12_ROOT_CONSTANTS::Init(rootParam.Constants, num32BitValues, shaderRegister, registerSpace);
1366 }
1367
1368 static inline void InitAsConstantBufferView(
1369 _Out_ D3D12_ROOT_PARAMETER &rootParam,
1370 UINT shaderRegister,
1371 UINT registerSpace = 0,
1372 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept
1373 {
1374 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;
1375 rootParam.ShaderVisibility = visibility;
1376 CD3DX12_ROOT_DESCRIPTOR::Init(rootParam.Descriptor, shaderRegister, registerSpace);
1377 }
1378
1379 static inline void InitAsShaderResourceView(
1380 _Out_ D3D12_ROOT_PARAMETER &rootParam,
1381 UINT shaderRegister,
1382 UINT registerSpace = 0,
1383 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept
1384 {
1385 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_SRV;
1386 rootParam.ShaderVisibility = visibility;
1387 CD3DX12_ROOT_DESCRIPTOR::Init(rootParam.Descriptor, shaderRegister, registerSpace);
1388 }
1389
1390 static inline void InitAsUnorderedAccessView(
1391 _Out_ D3D12_ROOT_PARAMETER &rootParam,
1392 UINT shaderRegister,
1393 UINT registerSpace = 0,
1394 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept
1395 {
1396 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV;
1397 rootParam.ShaderVisibility = visibility;
1398 CD3DX12_ROOT_DESCRIPTOR::Init(rootParam.Descriptor, shaderRegister, registerSpace);
1399 }
1400
1401 inline void InitAsDescriptorTable(
1402 UINT numDescriptorRanges,
1403 _In_reads_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* pDescriptorRanges,
1404 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept
1405 {
1406 InitAsDescriptorTable(*this, numDescriptorRanges, pDescriptorRanges, visibility);
1407 }
1408
1409 inline void InitAsConstants(
1410 UINT num32BitValues,
1411 UINT shaderRegister,
1412 UINT registerSpace = 0,
1413 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept
1414 {
1415 InitAsConstants(*this, num32BitValues, shaderRegister, registerSpace, visibility);
1416 }
1417
1418 inline void InitAsConstantBufferView(
1419 UINT shaderRegister,
1420 UINT registerSpace = 0,
1421 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept
1422 {
1423 InitAsConstantBufferView(*this, shaderRegister, registerSpace, visibility);
1424 }
1425
1426 inline void InitAsShaderResourceView(
1427 UINT shaderRegister,
1428 UINT registerSpace = 0,
1429 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept
1430 {
1431 InitAsShaderResourceView(*this, shaderRegister, registerSpace, visibility);
1432 }
1433
1434 inline void InitAsUnorderedAccessView(
1435 UINT shaderRegister,
1436 UINT registerSpace = 0,
1437 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept
1438 {
1439 InitAsUnorderedAccessView(*this, shaderRegister, registerSpace, visibility);
1440 }
1441};
1442
1443//------------------------------------------------------------------------------------------------
1444struct CD3DX12_STATIC_SAMPLER_DESC : public D3D12_STATIC_SAMPLER_DESC
1445{
1446 CD3DX12_STATIC_SAMPLER_DESC() = default;
1447 explicit CD3DX12_STATIC_SAMPLER_DESC(const D3D12_STATIC_SAMPLER_DESC &o) noexcept :
1448 D3D12_STATIC_SAMPLER_DESC(o)
1449 {}
1450 CD3DX12_STATIC_SAMPLER_DESC(
1451 UINT shaderRegister,
1452 D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC,
1453 D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
1454 D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
1455 D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
1456 FLOAT mipLODBias = 0,
1457 UINT maxAnisotropy = 16,
1458 D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL,
1459 D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE,
1460 FLOAT minLOD = 0.f,
1461 FLOAT maxLOD = D3D12_FLOAT32_MAX,
1462 D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
1463 UINT registerSpace = 0) noexcept
1464 {
1465 Init(
1466 shaderRegister,
1467 filter,
1468 addressU,
1469 addressV,
1470 addressW,
1471 mipLODBias,
1472 maxAnisotropy,
1473 comparisonFunc,
1474 borderColor,
1475 minLOD,
1476 maxLOD,
1477 shaderVisibility,
1478 registerSpace);
1479 }
1480
1481 static inline void Init(
1482 _Out_ D3D12_STATIC_SAMPLER_DESC &samplerDesc,
1483 UINT shaderRegister,
1484 D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC,
1485 D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
1486 D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
1487 D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
1488 FLOAT mipLODBias = 0,
1489 UINT maxAnisotropy = 16,
1490 D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL,
1491 D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE,
1492 FLOAT minLOD = 0.f,
1493 FLOAT maxLOD = D3D12_FLOAT32_MAX,
1494 D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
1495 UINT registerSpace = 0) noexcept
1496 {
1497 samplerDesc.ShaderRegister = shaderRegister;
1498 samplerDesc.Filter = filter;
1499 samplerDesc.AddressU = addressU;
1500 samplerDesc.AddressV = addressV;
1501 samplerDesc.AddressW = addressW;
1502 samplerDesc.MipLODBias = mipLODBias;
1503 samplerDesc.MaxAnisotropy = maxAnisotropy;
1504 samplerDesc.ComparisonFunc = comparisonFunc;
1505 samplerDesc.BorderColor = borderColor;
1506 samplerDesc.MinLOD = minLOD;
1507 samplerDesc.MaxLOD = maxLOD;
1508 samplerDesc.ShaderVisibility = shaderVisibility;
1509 samplerDesc.RegisterSpace = registerSpace;
1510 }
1511 inline void Init(
1512 UINT shaderRegister,
1513 D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC,
1514 D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
1515 D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
1516 D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
1517 FLOAT mipLODBias = 0,
1518 UINT maxAnisotropy = 16,
1519 D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL,
1520 D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE,
1521 FLOAT minLOD = 0.f,
1522 FLOAT maxLOD = D3D12_FLOAT32_MAX,
1523 D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
1524 UINT registerSpace = 0) noexcept
1525 {
1526 Init(
1527 *this,
1528 shaderRegister,
1529 filter,
1530 addressU,
1531 addressV,
1532 addressW,
1533 mipLODBias,
1534 maxAnisotropy,
1535 comparisonFunc,
1536 borderColor,
1537 minLOD,
1538 maxLOD,
1539 shaderVisibility,
1540 registerSpace);
1541 }
1542};
1543
1544//------------------------------------------------------------------------------------------------
1545#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)
1546struct CD3DX12_STATIC_SAMPLER_DESC1 : public D3D12_STATIC_SAMPLER_DESC1
1547{
1548 CD3DX12_STATIC_SAMPLER_DESC1() = default;
1549 explicit CD3DX12_STATIC_SAMPLER_DESC1(const D3D12_STATIC_SAMPLER_DESC &o) noexcept
1550 {
1551 memcpy(this, &o, sizeof(D3D12_STATIC_SAMPLER_DESC));
1552 Flags = D3D12_SAMPLER_FLAGS::D3D12_SAMPLER_FLAG_NONE;
1553 }
1554 explicit CD3DX12_STATIC_SAMPLER_DESC1(const D3D12_STATIC_SAMPLER_DESC1 & o) noexcept :
1555 D3D12_STATIC_SAMPLER_DESC1(o)
1556 {}
1557 CD3DX12_STATIC_SAMPLER_DESC1(
1558 UINT shaderRegister,
1559 D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC,
1560 D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
1561 D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
1562 D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
1563 FLOAT mipLODBias = 0,
1564 UINT maxAnisotropy = 16,
1565 D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL,
1566 D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE,
1567 FLOAT minLOD = 0.f,
1568 FLOAT maxLOD = D3D12_FLOAT32_MAX,
1569 D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
1570 UINT registerSpace = 0,
1571 D3D12_SAMPLER_FLAGS flags = D3D12_SAMPLER_FLAGS::D3D12_SAMPLER_FLAG_NONE) noexcept
1572 {
1573 Init(
1574 shaderRegister,
1575 filter,
1576 addressU,
1577 addressV,
1578 addressW,
1579 mipLODBias,
1580 maxAnisotropy,
1581 comparisonFunc,
1582 borderColor,
1583 minLOD,
1584 maxLOD,
1585 shaderVisibility,
1586 registerSpace,
1587 flags);
1588 }
1589
1590 static inline void Init(
1591 _Out_ D3D12_STATIC_SAMPLER_DESC1 &samplerDesc,
1592 UINT shaderRegister,
1593 D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC,
1594 D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
1595 D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
1596 D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
1597 FLOAT mipLODBias = 0,
1598 UINT maxAnisotropy = 16,
1599 D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL,
1600 D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE,
1601 FLOAT minLOD = 0.f,
1602 FLOAT maxLOD = D3D12_FLOAT32_MAX,
1603 D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
1604 UINT registerSpace = 0,
1605 D3D12_SAMPLER_FLAGS flags = D3D12_SAMPLER_FLAGS::D3D12_SAMPLER_FLAG_NONE) noexcept
1606 {
1607 samplerDesc.ShaderRegister = shaderRegister;
1608 samplerDesc.Filter = filter;
1609 samplerDesc.AddressU = addressU;
1610 samplerDesc.AddressV = addressV;
1611 samplerDesc.AddressW = addressW;
1612 samplerDesc.MipLODBias = mipLODBias;
1613 samplerDesc.MaxAnisotropy = maxAnisotropy;
1614 samplerDesc.ComparisonFunc = comparisonFunc;
1615 samplerDesc.BorderColor = borderColor;
1616 samplerDesc.MinLOD = minLOD;
1617 samplerDesc.MaxLOD = maxLOD;
1618 samplerDesc.ShaderVisibility = shaderVisibility;
1619 samplerDesc.RegisterSpace = registerSpace;
1620 samplerDesc.Flags = flags;
1621 }
1622 inline void Init(
1623 UINT shaderRegister,
1624 D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC,
1625 D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
1626 D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
1627 D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
1628 FLOAT mipLODBias = 0,
1629 UINT maxAnisotropy = 16,
1630 D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL,
1631 D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE,
1632 FLOAT minLOD = 0.f,
1633 FLOAT maxLOD = D3D12_FLOAT32_MAX,
1634 D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
1635 UINT registerSpace = 0,
1636 D3D12_SAMPLER_FLAGS flags = D3D12_SAMPLER_FLAGS::D3D12_SAMPLER_FLAG_NONE) noexcept
1637 {
1638 Init(
1639 *this,
1640 shaderRegister,
1641 filter,
1642 addressU,
1643 addressV,
1644 addressW,
1645 mipLODBias,
1646 maxAnisotropy,
1647 comparisonFunc,
1648 borderColor,
1649 minLOD,
1650 maxLOD,
1651 shaderVisibility,
1652 registerSpace,
1653 flags);
1654 }
1655};
1656#endif // D3D12_SDK_VERSION >= 609
1657
1658//------------------------------------------------------------------------------------------------
1659struct CD3DX12_ROOT_SIGNATURE_DESC : public D3D12_ROOT_SIGNATURE_DESC
1660{
1661 CD3DX12_ROOT_SIGNATURE_DESC() = default;
1662 explicit CD3DX12_ROOT_SIGNATURE_DESC(const D3D12_ROOT_SIGNATURE_DESC &o) noexcept :
1663 D3D12_ROOT_SIGNATURE_DESC(o)
1664 {}
1665 CD3DX12_ROOT_SIGNATURE_DESC(
1666 UINT numParameters,
1667 _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters,
1668 UINT numStaticSamplers = 0,
1669 _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr,
1670 D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept
1671 {
1672 Init(numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags);
1673 }
1674 CD3DX12_ROOT_SIGNATURE_DESC(CD3DX12_DEFAULT) noexcept
1675 {
1676 Init(0, nullptr, 0, nullptr, D3D12_ROOT_SIGNATURE_FLAG_NONE);
1677 }
1678
1679 inline void Init(
1680 UINT numParameters,
1681 _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters,
1682 UINT numStaticSamplers = 0,
1683 _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr,
1684 D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept
1685 {
1686 Init(*this, numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags);
1687 }
1688
1689 static inline void Init(
1690 _Out_ D3D12_ROOT_SIGNATURE_DESC &desc,
1691 UINT numParameters,
1692 _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters,
1693 UINT numStaticSamplers = 0,
1694 _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr,
1695 D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept
1696 {
1697 desc.NumParameters = numParameters;
1698 desc.pParameters = _pParameters;
1699 desc.NumStaticSamplers = numStaticSamplers;
1700 desc.pStaticSamplers = _pStaticSamplers;
1701 desc.Flags = flags;
1702 }
1703};
1704
1705//------------------------------------------------------------------------------------------------
1706struct CD3DX12_DESCRIPTOR_RANGE1 : public D3D12_DESCRIPTOR_RANGE1
1707{
1708 CD3DX12_DESCRIPTOR_RANGE1() = default;
1709 explicit CD3DX12_DESCRIPTOR_RANGE1(const D3D12_DESCRIPTOR_RANGE1 &o) noexcept :
1710 D3D12_DESCRIPTOR_RANGE1(o)
1711 {}
1712 CD3DX12_DESCRIPTOR_RANGE1(
1713 D3D12_DESCRIPTOR_RANGE_TYPE rangeType,
1714 UINT numDescriptors,
1715 UINT baseShaderRegister,
1716 UINT registerSpace = 0,
1717 D3D12_DESCRIPTOR_RANGE_FLAGS flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE,
1718 UINT offsetInDescriptorsFromTableStart =
1719 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) noexcept
1720 {
1721 Init(rangeType, numDescriptors, baseShaderRegister, registerSpace, flags, offsetInDescriptorsFromTableStart);
1722 }
1723
1724 inline void Init(
1725 D3D12_DESCRIPTOR_RANGE_TYPE rangeType,
1726 UINT numDescriptors,
1727 UINT baseShaderRegister,
1728 UINT registerSpace = 0,
1729 D3D12_DESCRIPTOR_RANGE_FLAGS flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE,
1730 UINT offsetInDescriptorsFromTableStart =
1731 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) noexcept
1732 {
1733 Init(*this, rangeType, numDescriptors, baseShaderRegister, registerSpace, flags, offsetInDescriptorsFromTableStart);
1734 }
1735
1736 static inline void Init(
1737 _Out_ D3D12_DESCRIPTOR_RANGE1 &range,
1738 D3D12_DESCRIPTOR_RANGE_TYPE rangeType,
1739 UINT numDescriptors,
1740 UINT baseShaderRegister,
1741 UINT registerSpace = 0,
1742 D3D12_DESCRIPTOR_RANGE_FLAGS flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE,
1743 UINT offsetInDescriptorsFromTableStart =
1744 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) noexcept
1745 {
1746 range.RangeType = rangeType;
1747 range.NumDescriptors = numDescriptors;
1748 range.BaseShaderRegister = baseShaderRegister;
1749 range.RegisterSpace = registerSpace;
1750 range.Flags = flags;
1751 range.OffsetInDescriptorsFromTableStart = offsetInDescriptorsFromTableStart;
1752 }
1753};
1754
1755//------------------------------------------------------------------------------------------------
1756struct CD3DX12_ROOT_DESCRIPTOR_TABLE1 : public D3D12_ROOT_DESCRIPTOR_TABLE1
1757{
1758 CD3DX12_ROOT_DESCRIPTOR_TABLE1() = default;
1759 explicit CD3DX12_ROOT_DESCRIPTOR_TABLE1(const D3D12_ROOT_DESCRIPTOR_TABLE1 &o) noexcept :
1760 D3D12_ROOT_DESCRIPTOR_TABLE1(o)
1761 {}
1762 CD3DX12_ROOT_DESCRIPTOR_TABLE1(
1763 UINT numDescriptorRanges,
1764 _In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE1* _pDescriptorRanges) noexcept
1765 {
1766 Init(numDescriptorRanges, _pDescriptorRanges);
1767 }
1768
1769 inline void Init(
1770 UINT numDescriptorRanges,
1771 _In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE1* _pDescriptorRanges) noexcept
1772 {
1773 Init(*this, numDescriptorRanges, _pDescriptorRanges);
1774 }
1775
1776 static inline void Init(
1777 _Out_ D3D12_ROOT_DESCRIPTOR_TABLE1 &rootDescriptorTable,
1778 UINT numDescriptorRanges,
1779 _In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE1* _pDescriptorRanges) noexcept
1780 {
1781 rootDescriptorTable.NumDescriptorRanges = numDescriptorRanges;
1782 rootDescriptorTable.pDescriptorRanges = _pDescriptorRanges;
1783 }
1784};
1785
1786//------------------------------------------------------------------------------------------------
1787struct CD3DX12_ROOT_DESCRIPTOR1 : public D3D12_ROOT_DESCRIPTOR1
1788{
1789 CD3DX12_ROOT_DESCRIPTOR1() = default;
1790 explicit CD3DX12_ROOT_DESCRIPTOR1(const D3D12_ROOT_DESCRIPTOR1 &o) noexcept :
1791 D3D12_ROOT_DESCRIPTOR1(o)
1792 {}
1793 CD3DX12_ROOT_DESCRIPTOR1(
1794 UINT shaderRegister,
1795 UINT registerSpace = 0,
1796 D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE) noexcept
1797 {
1798 Init(shaderRegister, registerSpace, flags);
1799 }
1800
1801 inline void Init(
1802 UINT shaderRegister,
1803 UINT registerSpace = 0,
1804 D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE) noexcept
1805 {
1806 Init(*this, shaderRegister, registerSpace, flags);
1807 }
1808
1809 static inline void Init(
1810 _Out_ D3D12_ROOT_DESCRIPTOR1 &table,
1811 UINT shaderRegister,
1812 UINT registerSpace = 0,
1813 D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE) noexcept
1814 {
1815 table.ShaderRegister = shaderRegister;
1816 table.RegisterSpace = registerSpace;
1817 table.Flags = flags;
1818 }
1819};
1820
1821//------------------------------------------------------------------------------------------------
1822struct CD3DX12_ROOT_PARAMETER1 : public D3D12_ROOT_PARAMETER1
1823{
1824 CD3DX12_ROOT_PARAMETER1() = default;
1825 explicit CD3DX12_ROOT_PARAMETER1(const D3D12_ROOT_PARAMETER1 &o) noexcept :
1826 D3D12_ROOT_PARAMETER1(o)
1827 {}
1828
1829 static inline void InitAsDescriptorTable(
1830 _Out_ D3D12_ROOT_PARAMETER1 &rootParam,
1831 UINT numDescriptorRanges,
1832 _In_reads_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE1* pDescriptorRanges,
1833 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept
1834 {
1835 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
1836 rootParam.ShaderVisibility = visibility;
1837 CD3DX12_ROOT_DESCRIPTOR_TABLE1::Init(rootParam.DescriptorTable, numDescriptorRanges, pDescriptorRanges);
1838 }
1839
1840 static inline void InitAsConstants(
1841 _Out_ D3D12_ROOT_PARAMETER1 &rootParam,
1842 UINT num32BitValues,
1843 UINT shaderRegister,
1844 UINT registerSpace = 0,
1845 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept
1846 {
1847 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;
1848 rootParam.ShaderVisibility = visibility;
1849 CD3DX12_ROOT_CONSTANTS::Init(rootParam.Constants, num32BitValues, shaderRegister, registerSpace);
1850 }
1851
1852 static inline void InitAsConstantBufferView(
1853 _Out_ D3D12_ROOT_PARAMETER1 &rootParam,
1854 UINT shaderRegister,
1855 UINT registerSpace = 0,
1856 D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE,
1857 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept
1858 {
1859 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;
1860 rootParam.ShaderVisibility = visibility;
1861 CD3DX12_ROOT_DESCRIPTOR1::Init(rootParam.Descriptor, shaderRegister, registerSpace, flags);
1862 }
1863
1864 static inline void InitAsShaderResourceView(
1865 _Out_ D3D12_ROOT_PARAMETER1 &rootParam,
1866 UINT shaderRegister,
1867 UINT registerSpace = 0,
1868 D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE,
1869 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept
1870 {
1871 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_SRV;
1872 rootParam.ShaderVisibility = visibility;
1873 CD3DX12_ROOT_DESCRIPTOR1::Init(rootParam.Descriptor, shaderRegister, registerSpace, flags);
1874 }
1875
1876 static inline void InitAsUnorderedAccessView(
1877 _Out_ D3D12_ROOT_PARAMETER1 &rootParam,
1878 UINT shaderRegister,
1879 UINT registerSpace = 0,
1880 D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE,
1881 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept
1882 {
1883 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV;
1884 rootParam.ShaderVisibility = visibility;
1885 CD3DX12_ROOT_DESCRIPTOR1::Init(rootParam.Descriptor, shaderRegister, registerSpace, flags);
1886 }
1887
1888 inline void InitAsDescriptorTable(
1889 UINT numDescriptorRanges,
1890 _In_reads_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE1* pDescriptorRanges,
1891 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept
1892 {
1893 InitAsDescriptorTable(*this, numDescriptorRanges, pDescriptorRanges, visibility);
1894 }
1895
1896 inline void InitAsConstants(
1897 UINT num32BitValues,
1898 UINT shaderRegister,
1899 UINT registerSpace = 0,
1900 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept
1901 {
1902 InitAsConstants(*this, num32BitValues, shaderRegister, registerSpace, visibility);
1903 }
1904
1905 inline void InitAsConstantBufferView(
1906 UINT shaderRegister,
1907 UINT registerSpace = 0,
1908 D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE,
1909 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept
1910 {
1911 InitAsConstantBufferView(*this, shaderRegister, registerSpace, flags, visibility);
1912 }
1913
1914 inline void InitAsShaderResourceView(
1915 UINT shaderRegister,
1916 UINT registerSpace = 0,
1917 D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE,
1918 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept
1919 {
1920 InitAsShaderResourceView(*this, shaderRegister, registerSpace, flags, visibility);
1921 }
1922
1923 inline void InitAsUnorderedAccessView(
1924 UINT shaderRegister,
1925 UINT registerSpace = 0,
1926 D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE,
1927 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept
1928 {
1929 InitAsUnorderedAccessView(*this, shaderRegister, registerSpace, flags, visibility);
1930 }
1931};
1932
1933//------------------------------------------------------------------------------------------------
1934struct CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC : public D3D12_VERSIONED_ROOT_SIGNATURE_DESC
1935{
1936 CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC() = default;
1937 explicit CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(const D3D12_VERSIONED_ROOT_SIGNATURE_DESC &o) noexcept :
1938 D3D12_VERSIONED_ROOT_SIGNATURE_DESC(o)
1939 {}
1940 explicit CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(const D3D12_ROOT_SIGNATURE_DESC &o) noexcept
1941 {
1942 Version = D3D_ROOT_SIGNATURE_VERSION_1_0;
1943 Desc_1_0 = o;
1944 }
1945 explicit CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(const D3D12_ROOT_SIGNATURE_DESC1 &o) noexcept
1946 {
1947 Version = D3D_ROOT_SIGNATURE_VERSION_1_1;
1948 Desc_1_1 = o;
1949 }
1950#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)
1951 explicit CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(const D3D12_ROOT_SIGNATURE_DESC2& o) noexcept
1952 {
1953 Version = D3D_ROOT_SIGNATURE_VERSION_1_2;
1954 Desc_1_2 = o;
1955 }
1956#endif
1957 CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(
1958 UINT numParameters,
1959 _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters,
1960 UINT numStaticSamplers = 0,
1961 _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr,
1962 D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept
1963 {
1964 Init_1_0(numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags);
1965 }
1966 CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(
1967 UINT numParameters,
1968 _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER1* _pParameters,
1969 UINT numStaticSamplers = 0,
1970 _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr,
1971 D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept
1972 {
1973 Init_1_1(numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags);
1974 }
1975 CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(CD3DX12_DEFAULT) noexcept
1976 {
1977 Init_1_1(0, nullptr, 0, nullptr, D3D12_ROOT_SIGNATURE_FLAG_NONE);
1978 }
1979
1980 inline void Init_1_0(
1981 UINT numParameters,
1982 _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters,
1983 UINT numStaticSamplers = 0,
1984 _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr,
1985 D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept
1986 {
1987 Init_1_0(*this, numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags);
1988 }
1989
1990 static inline void Init_1_0(
1991 _Out_ D3D12_VERSIONED_ROOT_SIGNATURE_DESC &desc,
1992 UINT numParameters,
1993 _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters,
1994 UINT numStaticSamplers = 0,
1995 _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr,
1996 D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept
1997 {
1998 desc.Version = D3D_ROOT_SIGNATURE_VERSION_1_0;
1999 desc.Desc_1_0.NumParameters = numParameters;
2000 desc.Desc_1_0.pParameters = _pParameters;
2001 desc.Desc_1_0.NumStaticSamplers = numStaticSamplers;
2002 desc.Desc_1_0.pStaticSamplers = _pStaticSamplers;
2003 desc.Desc_1_0.Flags = flags;
2004 }
2005
2006 inline void Init_1_1(
2007 UINT numParameters,
2008 _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER1* _pParameters,
2009 UINT numStaticSamplers = 0,
2010 _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr,
2011 D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept
2012 {
2013 Init_1_1(*this, numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags);
2014 }
2015
2016 static inline void Init_1_1(
2017 _Out_ D3D12_VERSIONED_ROOT_SIGNATURE_DESC &desc,
2018 UINT numParameters,
2019 _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER1* _pParameters,
2020 UINT numStaticSamplers = 0,
2021 _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr,
2022 D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept
2023 {
2024 desc.Version = D3D_ROOT_SIGNATURE_VERSION_1_1;
2025 desc.Desc_1_1.NumParameters = numParameters;
2026 desc.Desc_1_1.pParameters = _pParameters;
2027 desc.Desc_1_1.NumStaticSamplers = numStaticSamplers;
2028 desc.Desc_1_1.pStaticSamplers = _pStaticSamplers;
2029 desc.Desc_1_1.Flags = flags;
2030 }
2031
2032#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)
2033 static inline void Init_1_2(
2034 _Out_ D3D12_VERSIONED_ROOT_SIGNATURE_DESC& desc,
2035 UINT numParameters,
2036 _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER1* _pParameters,
2037 UINT numStaticSamplers = 0,
2038 _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC1* _pStaticSamplers = nullptr,
2039 D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept
2040 {
2041 desc.Version = D3D_ROOT_SIGNATURE_VERSION_1_2;
2042 desc.Desc_1_2.NumParameters = numParameters;
2043 desc.Desc_1_2.pParameters = _pParameters;
2044 desc.Desc_1_2.NumStaticSamplers = numStaticSamplers;
2045 desc.Desc_1_2.pStaticSamplers = _pStaticSamplers;
2046 desc.Desc_1_2.Flags = flags;
2047 }
2048#endif
2049};
2050
2051//------------------------------------------------------------------------------------------------
2052struct CD3DX12_CPU_DESCRIPTOR_HANDLE : public D3D12_CPU_DESCRIPTOR_HANDLE
2053{
2054 CD3DX12_CPU_DESCRIPTOR_HANDLE() = default;
2055 explicit CD3DX12_CPU_DESCRIPTOR_HANDLE(const D3D12_CPU_DESCRIPTOR_HANDLE &o) noexcept :
2056 D3D12_CPU_DESCRIPTOR_HANDLE(o)
2057 {}
2058 CD3DX12_CPU_DESCRIPTOR_HANDLE(CD3DX12_DEFAULT) noexcept { ptr = 0; }
2059 CD3DX12_CPU_DESCRIPTOR_HANDLE(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE &other, INT offsetScaledByIncrementSize) noexcept
2060 {
2061 InitOffsetted(other, offsetScaledByIncrementSize);
2062 }
2063 CD3DX12_CPU_DESCRIPTOR_HANDLE(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE &other, INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept
2064 {
2065 InitOffsetted(other, offsetInDescriptors, descriptorIncrementSize);
2066 }
2067 CD3DX12_CPU_DESCRIPTOR_HANDLE& Offset(INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept
2068 {
2069 ptr = SIZE_T(INT64(ptr) + INT64(offsetInDescriptors) * INT64(descriptorIncrementSize));
2070 return *this;
2071 }
2072 CD3DX12_CPU_DESCRIPTOR_HANDLE& Offset(INT offsetScaledByIncrementSize) noexcept
2073 {
2074 ptr = SIZE_T(INT64(ptr) + INT64(offsetScaledByIncrementSize));
2075 return *this;
2076 }
2077 bool operator==(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE& other) const noexcept
2078 {
2079 return (ptr == other.ptr);
2080 }
2081 bool operator!=(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE& other) const noexcept
2082 {
2083 return (ptr != other.ptr);
2084 }
2085 CD3DX12_CPU_DESCRIPTOR_HANDLE &operator=(const D3D12_CPU_DESCRIPTOR_HANDLE &other) noexcept
2086 {
2087 ptr = other.ptr;
2088 return *this;
2089 }
2090
2091 inline void InitOffsetted(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE &base, INT offsetScaledByIncrementSize) noexcept
2092 {
2093 InitOffsetted(*this, base, offsetScaledByIncrementSize);
2094 }
2095
2096 inline void InitOffsetted(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE &base, INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept
2097 {
2098 InitOffsetted(*this, base, offsetInDescriptors, descriptorIncrementSize);
2099 }
2100
2101 static inline void InitOffsetted(_Out_ D3D12_CPU_DESCRIPTOR_HANDLE &handle, _In_ const D3D12_CPU_DESCRIPTOR_HANDLE &base, INT offsetScaledByIncrementSize) noexcept
2102 {
2103 handle.ptr = SIZE_T(INT64(base.ptr) + INT64(offsetScaledByIncrementSize));
2104 }
2105
2106 static inline void InitOffsetted(_Out_ D3D12_CPU_DESCRIPTOR_HANDLE &handle, _In_ const D3D12_CPU_DESCRIPTOR_HANDLE &base, INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept
2107 {
2108 handle.ptr = SIZE_T(INT64(base.ptr) + INT64(offsetInDescriptors) * INT64(descriptorIncrementSize));
2109 }
2110};
2111
2112//------------------------------------------------------------------------------------------------
2113struct CD3DX12_GPU_DESCRIPTOR_HANDLE : public D3D12_GPU_DESCRIPTOR_HANDLE
2114{
2115 CD3DX12_GPU_DESCRIPTOR_HANDLE() = default;
2116 explicit CD3DX12_GPU_DESCRIPTOR_HANDLE(const D3D12_GPU_DESCRIPTOR_HANDLE &o) noexcept :
2117 D3D12_GPU_DESCRIPTOR_HANDLE(o)
2118 {}
2119 CD3DX12_GPU_DESCRIPTOR_HANDLE(CD3DX12_DEFAULT) noexcept { ptr = 0; }
2120 CD3DX12_GPU_DESCRIPTOR_HANDLE(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE &other, INT offsetScaledByIncrementSize) noexcept
2121 {
2122 InitOffsetted(other, offsetScaledByIncrementSize);
2123 }
2124 CD3DX12_GPU_DESCRIPTOR_HANDLE(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE &other, INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept
2125 {
2126 InitOffsetted(other, offsetInDescriptors, descriptorIncrementSize);
2127 }
2128 CD3DX12_GPU_DESCRIPTOR_HANDLE& Offset(INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept
2129 {
2130 ptr = UINT64(INT64(ptr) + INT64(offsetInDescriptors) * INT64(descriptorIncrementSize));
2131 return *this;
2132 }
2133 CD3DX12_GPU_DESCRIPTOR_HANDLE& Offset(INT offsetScaledByIncrementSize) noexcept
2134 {
2135 ptr = UINT64(INT64(ptr) + INT64(offsetScaledByIncrementSize));
2136 return *this;
2137 }
2138 inline bool operator==(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE& other) const noexcept
2139 {
2140 return (ptr == other.ptr);
2141 }
2142 inline bool operator!=(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE& other) const noexcept
2143 {
2144 return (ptr != other.ptr);
2145 }
2146 CD3DX12_GPU_DESCRIPTOR_HANDLE &operator=(const D3D12_GPU_DESCRIPTOR_HANDLE &other) noexcept
2147 {
2148 ptr = other.ptr;
2149 return *this;
2150 }
2151
2152 inline void InitOffsetted(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE &base, INT offsetScaledByIncrementSize) noexcept
2153 {
2154 InitOffsetted(*this, base, offsetScaledByIncrementSize);
2155 }
2156
2157 inline void InitOffsetted(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE &base, INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept
2158 {
2159 InitOffsetted(*this, base, offsetInDescriptors, descriptorIncrementSize);
2160 }
2161
2162 static inline void InitOffsetted(_Out_ D3D12_GPU_DESCRIPTOR_HANDLE &handle, _In_ const D3D12_GPU_DESCRIPTOR_HANDLE &base, INT offsetScaledByIncrementSize) noexcept
2163 {
2164 handle.ptr = UINT64(INT64(base.ptr) + INT64(offsetScaledByIncrementSize));
2165 }
2166
2167 static inline void InitOffsetted(_Out_ D3D12_GPU_DESCRIPTOR_HANDLE &handle, _In_ const D3D12_GPU_DESCRIPTOR_HANDLE &base, INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept
2168 {
2169 handle.ptr = UINT64(INT64(base.ptr) + INT64(offsetInDescriptors) * INT64(descriptorIncrementSize));
2170 }
2171};
2172
2173//------------------------------------------------------------------------------------------------
2174constexpr UINT D3D12CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT PlaneSlice, UINT MipLevels, UINT ArraySize ) noexcept
2175{
2176 return MipSlice + ArraySlice * MipLevels + PlaneSlice * MipLevels * ArraySize;
2177}
2178
2179//------------------------------------------------------------------------------------------------
2180inline UINT8 D3D12GetFormatPlaneCount(
2181 _In_ ID3D12Device* pDevice,
2182 DXGI_FORMAT Format
2183 ) noexcept
2184{
2185 D3D12_FEATURE_DATA_FORMAT_INFO formatInfo = { Format, 0 };
2186 if (FAILED(pDevice->CheckFeatureSupport(D3D12_FEATURE_FORMAT_INFO, &formatInfo, sizeof(formatInfo))))
2187 {
2188 return 0;
2189 }
2190 return formatInfo.PlaneCount;
2191}
2192
2193//------------------------------------------------------------------------------------------------
2194struct CD3DX12_RESOURCE_DESC : public D3D12_RESOURCE_DESC
2195{
2196 CD3DX12_RESOURCE_DESC() = default;
2197 explicit CD3DX12_RESOURCE_DESC( const D3D12_RESOURCE_DESC& o ) noexcept :
2198 D3D12_RESOURCE_DESC( o )
2199 {}
2200 CD3DX12_RESOURCE_DESC(
2201 D3D12_RESOURCE_DIMENSION dimension,
2202 UINT64 alignment,
2203 UINT64 width,
2204 UINT height,
2205 UINT16 depthOrArraySize,
2206 UINT16 mipLevels,
2207 DXGI_FORMAT format,
2208 UINT sampleCount,
2209 UINT sampleQuality,
2210 D3D12_TEXTURE_LAYOUT layout,
2211 D3D12_RESOURCE_FLAGS flags ) noexcept
2212 {
2214 Alignment = alignment;
2215 Width = width;
2216 Height = height;
2217 DepthOrArraySize = depthOrArraySize;
2218 MipLevels = mipLevels;
2219 Format = format;
2220 SampleDesc.Count = sampleCount;
2221 SampleDesc.Quality = sampleQuality;
2222 Layout = layout;
2223 Flags = flags;
2224 }
2225 static inline CD3DX12_RESOURCE_DESC Buffer(
2226 const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
2227 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE ) noexcept
2228 {
2229 return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_BUFFER, resAllocInfo.Alignment, resAllocInfo.SizeInBytes,
2230 1, 1, 1, DXGI_FORMAT_UNKNOWN, 1, 0, D3D12_TEXTURE_LAYOUT_ROW_MAJOR, flags );
2231 }
2232 static inline CD3DX12_RESOURCE_DESC Buffer(
2233 UINT64 width,
2234 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
2235 UINT64 alignment = 0 ) noexcept
2236 {
2237 return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_BUFFER, alignment, width, 1, 1, 1,
2238 DXGI_FORMAT_UNKNOWN, 1, 0, D3D12_TEXTURE_LAYOUT_ROW_MAJOR, flags );
2239 }
2240 static inline CD3DX12_RESOURCE_DESC Tex1D(
2241 DXGI_FORMAT format,
2242 UINT64 width,
2243 UINT16 arraySize = 1,
2244 UINT16 mipLevels = 0,
2245 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
2246 D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN,
2247 UINT64 alignment = 0 ) noexcept
2248 {
2249 return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_TEXTURE1D, alignment, width, 1, arraySize,
2250 mipLevels, format, 1, 0, layout, flags );
2251 }
2252 static inline CD3DX12_RESOURCE_DESC Tex2D(
2253 DXGI_FORMAT format,
2254 UINT64 width,
2255 UINT height,
2256 UINT16 arraySize = 1,
2257 UINT16 mipLevels = 0,
2258 UINT sampleCount = 1,
2259 UINT sampleQuality = 0,
2260 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
2261 D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN,
2262 UINT64 alignment = 0 ) noexcept
2263 {
2264 return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_TEXTURE2D, alignment, width, height, arraySize,
2265 mipLevels, format, sampleCount, sampleQuality, layout, flags );
2266 }
2267 static inline CD3DX12_RESOURCE_DESC Tex3D(
2268 DXGI_FORMAT format,
2269 UINT64 width,
2270 UINT height,
2271 UINT16 depth,
2272 UINT16 mipLevels = 0,
2273 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
2274 D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN,
2275 UINT64 alignment = 0 ) noexcept
2276 {
2277 return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_TEXTURE3D, alignment, width, height, depth,
2278 mipLevels, format, 1, 0, layout, flags );
2279 }
2280 inline UINT16 Depth() const noexcept
2281 { return (Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1u); }
2282 inline UINT16 ArraySize() const noexcept
2283 { return (Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1u); }
2284 inline UINT8 PlaneCount(_In_ ID3D12Device* pDevice) const noexcept
2285 { return D3D12GetFormatPlaneCount(pDevice, Format); }
2286 inline UINT Subresources(_In_ ID3D12Device* pDevice) const noexcept
2287 { return static_cast<UINT>(MipLevels) * ArraySize() * PlaneCount(pDevice); }
2288 inline UINT CalcSubresource(UINT MipSlice, UINT ArraySlice, UINT PlaneSlice) noexcept
2289 { return D3D12CalcSubresource(MipSlice, ArraySlice, PlaneSlice, MipLevels, ArraySize()); }
2290};
2291inline bool operator==( const D3D12_RESOURCE_DESC& l, const D3D12_RESOURCE_DESC& r ) noexcept
2292{
2293 return l.Dimension == r.Dimension &&
2294 l.Alignment == r.Alignment &&
2295 l.Width == r.Width &&
2296 l.Height == r.Height &&
2297 l.DepthOrArraySize == r.DepthOrArraySize &&
2298 l.MipLevels == r.MipLevels &&
2299 l.Format == r.Format &&
2300 l.SampleDesc.Count == r.SampleDesc.Count &&
2301 l.SampleDesc.Quality == r.SampleDesc.Quality &&
2302 l.Layout == r.Layout &&
2303 l.Flags == r.Flags;
2304}
2305inline bool operator!=( const D3D12_RESOURCE_DESC& l, const D3D12_RESOURCE_DESC& r ) noexcept
2306{ return !( l == r ); }
2307
2308//------------------------------------------------------------------------------------------------
2309struct CD3DX12_RESOURCE_DESC1 : public D3D12_RESOURCE_DESC1
2310{
2311 CD3DX12_RESOURCE_DESC1() = default;
2312 explicit CD3DX12_RESOURCE_DESC1( const D3D12_RESOURCE_DESC1& o ) noexcept :
2313 D3D12_RESOURCE_DESC1( o )
2314 {}
2315 explicit CD3DX12_RESOURCE_DESC1( const D3D12_RESOURCE_DESC& o ) noexcept
2316 {
2317 Dimension = o.Dimension;
2318 Alignment = o.Alignment;
2319 Width = o.Width;
2320 Height = o.Height;
2321 DepthOrArraySize = o.DepthOrArraySize;
2322 MipLevels = o.MipLevels;
2323 Format = o.Format;
2324 SampleDesc = o.SampleDesc;
2325 Layout = o.Layout;
2326 Flags = o.Flags;
2327 SamplerFeedbackMipRegion = {};
2328 }
2329 CD3DX12_RESOURCE_DESC1(
2330 D3D12_RESOURCE_DIMENSION dimension,
2331 UINT64 alignment,
2332 UINT64 width,
2333 UINT height,
2334 UINT16 depthOrArraySize,
2335 UINT16 mipLevels,
2336 DXGI_FORMAT format,
2337 UINT sampleCount,
2338 UINT sampleQuality,
2339 D3D12_TEXTURE_LAYOUT layout,
2340 D3D12_RESOURCE_FLAGS flags,
2341 UINT samplerFeedbackMipRegionWidth = 0,
2342 UINT samplerFeedbackMipRegionHeight = 0,
2343 UINT samplerFeedbackMipRegionDepth = 0) noexcept
2344 {
2346 Alignment = alignment;
2347 Width = width;
2348 Height = height;
2349 DepthOrArraySize = depthOrArraySize;
2350 MipLevels = mipLevels;
2351 Format = format;
2352 SampleDesc.Count = sampleCount;
2353 SampleDesc.Quality = sampleQuality;
2354 Layout = layout;
2355 Flags = flags;
2356 SamplerFeedbackMipRegion.Width = samplerFeedbackMipRegionWidth;
2357 SamplerFeedbackMipRegion.Height = samplerFeedbackMipRegionHeight;
2358 SamplerFeedbackMipRegion.Depth = samplerFeedbackMipRegionDepth;
2359 }
2360 static inline CD3DX12_RESOURCE_DESC1 Buffer(
2361 const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
2362 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE ) noexcept
2363 {
2364 return CD3DX12_RESOURCE_DESC1( D3D12_RESOURCE_DIMENSION_BUFFER, resAllocInfo.Alignment, resAllocInfo.SizeInBytes,
2365 1, 1, 1, DXGI_FORMAT_UNKNOWN, 1, 0, D3D12_TEXTURE_LAYOUT_ROW_MAJOR, flags, 0, 0, 0 );
2366 }
2367 static inline CD3DX12_RESOURCE_DESC1 Buffer(
2368 UINT64 width,
2369 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
2370 UINT64 alignment = 0 ) noexcept
2371 {
2372 return CD3DX12_RESOURCE_DESC1( D3D12_RESOURCE_DIMENSION_BUFFER, alignment, width, 1, 1, 1,
2373 DXGI_FORMAT_UNKNOWN, 1, 0, D3D12_TEXTURE_LAYOUT_ROW_MAJOR, flags, 0, 0, 0 );
2374 }
2375 static inline CD3DX12_RESOURCE_DESC1 Tex1D(
2376 DXGI_FORMAT format,
2377 UINT64 width,
2378 UINT16 arraySize = 1,
2379 UINT16 mipLevels = 0,
2380 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
2381 D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN,
2382 UINT64 alignment = 0 ) noexcept
2383 {
2384 return CD3DX12_RESOURCE_DESC1( D3D12_RESOURCE_DIMENSION_TEXTURE1D, alignment, width, 1, arraySize,
2385 mipLevels, format, 1, 0, layout, flags, 0, 0, 0 );
2386 }
2387 static inline CD3DX12_RESOURCE_DESC1 Tex2D(
2388 DXGI_FORMAT format,
2389 UINT64 width,
2390 UINT height,
2391 UINT16 arraySize = 1,
2392 UINT16 mipLevels = 0,
2393 UINT sampleCount = 1,
2394 UINT sampleQuality = 0,
2395 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
2396 D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN,
2397 UINT64 alignment = 0,
2398 UINT samplerFeedbackMipRegionWidth = 0,
2399 UINT samplerFeedbackMipRegionHeight = 0,
2400 UINT samplerFeedbackMipRegionDepth = 0) noexcept
2401 {
2402 return CD3DX12_RESOURCE_DESC1( D3D12_RESOURCE_DIMENSION_TEXTURE2D, alignment, width, height, arraySize,
2403 mipLevels, format, sampleCount, sampleQuality, layout, flags, samplerFeedbackMipRegionWidth,
2404 samplerFeedbackMipRegionHeight, samplerFeedbackMipRegionDepth );
2405 }
2406 static inline CD3DX12_RESOURCE_DESC1 Tex3D(
2407 DXGI_FORMAT format,
2408 UINT64 width,
2409 UINT height,
2410 UINT16 depth,
2411 UINT16 mipLevels = 0,
2412 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
2413 D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN,
2414 UINT64 alignment = 0 ) noexcept
2415 {
2416 return CD3DX12_RESOURCE_DESC1( D3D12_RESOURCE_DIMENSION_TEXTURE3D, alignment, width, height, depth,
2417 mipLevels, format, 1, 0, layout, flags, 0, 0, 0 );
2418 }
2419 inline UINT16 Depth() const noexcept
2420 { return (Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1u); }
2421 inline UINT16 ArraySize() const noexcept
2422 { return (Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1u); }
2423 inline UINT8 PlaneCount(_In_ ID3D12Device* pDevice) const noexcept
2424 { return D3D12GetFormatPlaneCount(pDevice, Format); }
2425 inline UINT Subresources(_In_ ID3D12Device* pDevice) const noexcept
2426 { return static_cast<UINT>(MipLevels) * ArraySize() * PlaneCount(pDevice); }
2427 inline UINT CalcSubresource(UINT MipSlice, UINT ArraySlice, UINT PlaneSlice) noexcept
2428 { return D3D12CalcSubresource(MipSlice, ArraySlice, PlaneSlice, MipLevels, ArraySize()); }
2429};
2430inline bool operator==( const D3D12_RESOURCE_DESC1& l, const D3D12_RESOURCE_DESC1& r ) noexcept
2431{
2432 return l.Dimension == r.Dimension &&
2433 l.Alignment == r.Alignment &&
2434 l.Width == r.Width &&
2435 l.Height == r.Height &&
2436 l.DepthOrArraySize == r.DepthOrArraySize &&
2437 l.MipLevels == r.MipLevels &&
2438 l.Format == r.Format &&
2439 l.SampleDesc.Count == r.SampleDesc.Count &&
2440 l.SampleDesc.Quality == r.SampleDesc.Quality &&
2441 l.Layout == r.Layout &&
2442 l.Flags == r.Flags &&
2443 l.SamplerFeedbackMipRegion.Width == r.SamplerFeedbackMipRegion.Width &&
2444 l.SamplerFeedbackMipRegion.Height == r.SamplerFeedbackMipRegion.Height &&
2445 l.SamplerFeedbackMipRegion.Depth == r.SamplerFeedbackMipRegion.Depth;
2446}
2447inline bool operator!=( const D3D12_RESOURCE_DESC1& l, const D3D12_RESOURCE_DESC1& r ) noexcept
2448{ return !( l == r ); }
2449
2450//------------------------------------------------------------------------------------------------
2451struct CD3DX12_VIEW_INSTANCING_DESC : public D3D12_VIEW_INSTANCING_DESC
2452{
2453 CD3DX12_VIEW_INSTANCING_DESC() = default;
2454 explicit CD3DX12_VIEW_INSTANCING_DESC( const D3D12_VIEW_INSTANCING_DESC& o ) noexcept :
2455 D3D12_VIEW_INSTANCING_DESC( o )
2456 {}
2457 explicit CD3DX12_VIEW_INSTANCING_DESC( CD3DX12_DEFAULT ) noexcept
2458 {
2459 ViewInstanceCount = 0;
2460 pViewInstanceLocations = nullptr;
2461 Flags = D3D12_VIEW_INSTANCING_FLAG_NONE;
2462 }
2463 explicit CD3DX12_VIEW_INSTANCING_DESC(
2464 UINT InViewInstanceCount,
2465 const D3D12_VIEW_INSTANCE_LOCATION* InViewInstanceLocations,
2466 D3D12_VIEW_INSTANCING_FLAGS InFlags) noexcept
2467 {
2468 ViewInstanceCount = InViewInstanceCount;
2469 pViewInstanceLocations = InViewInstanceLocations;
2470 Flags = InFlags;
2471 }
2472};
2473
2474//------------------------------------------------------------------------------------------------
2475template <typename T, typename U, typename V>
2476inline void D3D12DecomposeSubresource( UINT Subresource, UINT MipLevels, UINT ArraySize, _Out_ T& MipSlice, _Out_ U& ArraySlice, _Out_ V& PlaneSlice ) noexcept
2477{
2478 MipSlice = static_cast<T>(Subresource % MipLevels);
2479 ArraySlice = static_cast<U>((Subresource / MipLevels) % ArraySize);
2480 PlaneSlice = static_cast<V>(Subresource / (MipLevels * ArraySize));
2481}
2482
2483
2484//------------------------------------------------------------------------------------------------
2485// Row-by-row memcpy
2486inline void MemcpySubresource(
2487 _In_ const D3D12_MEMCPY_DEST* pDest,
2488 _In_ const D3D12_SUBRESOURCE_DATA* pSrc,
2489 SIZE_T RowSizeInBytes,
2490 UINT NumRows,
2491 UINT NumSlices) noexcept
2492{
2493 for (UINT z = 0; z < NumSlices; ++z)
2494 {
2495 auto pDestSlice = static_cast<BYTE*>(pDest->pData) + pDest->SlicePitch * z;
2496 auto pSrcSlice = static_cast<const BYTE*>(pSrc->pData) + pSrc->SlicePitch * LONG_PTR(z);
2497 for (UINT y = 0; y < NumRows; ++y)
2498 {
2499 memcpy(pDestSlice + pDest->RowPitch * y,
2500 pSrcSlice + pSrc->RowPitch * LONG_PTR(y),
2501 RowSizeInBytes);
2502 }
2503 }
2504}
2505
2506//------------------------------------------------------------------------------------------------
2507// Row-by-row memcpy
2508inline void MemcpySubresource(
2509 _In_ const D3D12_MEMCPY_DEST* pDest,
2510 _In_ const void* pResourceData,
2511 _In_ const D3D12_SUBRESOURCE_INFO* pSrc,
2512 SIZE_T RowSizeInBytes,
2513 UINT NumRows,
2514 UINT NumSlices) noexcept
2515{
2516 for (UINT z = 0; z < NumSlices; ++z)
2517 {
2518 auto pDestSlice = static_cast<BYTE*>(pDest->pData) + pDest->SlicePitch * z;
2519 auto pSrcSlice = (static_cast<const BYTE*>(pResourceData) + pSrc->Offset) + pSrc->DepthPitch * ULONG_PTR(z);
2520 for (UINT y = 0; y < NumRows; ++y)
2521 {
2522 memcpy(pDestSlice + pDest->RowPitch * y,
2523 pSrcSlice + pSrc->RowPitch * ULONG_PTR(y),
2524 RowSizeInBytes);
2525 }
2526 }
2527}
2528
2529//------------------------------------------------------------------------------------------------
2530// Returns required size of a buffer to be used for data upload
2531inline UINT64 GetRequiredIntermediateSize(
2532 _In_ ID3D12Resource* pDestinationResource,
2533 _In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource,
2534 _In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources) noexcept
2535{
2536#if defined(_MSC_VER) || !defined(_WIN32)
2537 const auto Desc = pDestinationResource->GetDesc();
2538#else
2539 D3D12_RESOURCE_DESC tmpDesc;
2540 const auto& Desc = *pDestinationResource->GetDesc(&tmpDesc);
2541#endif
2542 UINT64 RequiredSize = 0;
2543
2544 ID3D12Device* pDevice = nullptr;
2545 pDestinationResource->GetDevice(IID_ID3D12Device, reinterpret_cast<void**>(&pDevice));
2546 pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, 0, nullptr, nullptr, nullptr, &RequiredSize);
2547 pDevice->Release();
2548
2549 return RequiredSize;
2550}
2551
2552//------------------------------------------------------------------------------------------------
2553// All arrays must be populated (e.g. by calling GetCopyableFootprints)
2554inline UINT64 UpdateSubresources(
2555 _In_ ID3D12GraphicsCommandList* pCmdList,
2556 _In_ ID3D12Resource* pDestinationResource,
2557 _In_ ID3D12Resource* pIntermediate,
2558 _In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource,
2559 _In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources,
2560 UINT64 RequiredSize,
2561 _In_reads_(NumSubresources) const D3D12_PLACED_SUBRESOURCE_FOOTPRINT* pLayouts,
2562 _In_reads_(NumSubresources) const UINT* pNumRows,
2563 _In_reads_(NumSubresources) const UINT64* pRowSizesInBytes,
2564 _In_reads_(NumSubresources) const D3D12_SUBRESOURCE_DATA* pSrcData) noexcept
2565{
2566 // Minor validation
2567#if defined(_MSC_VER) || !defined(_WIN32)
2568 const auto IntermediateDesc = pIntermediate->GetDesc();
2569 const auto DestinationDesc = pDestinationResource->GetDesc();
2570#else
2571 D3D12_RESOURCE_DESC tmpDesc1, tmpDesc2;
2572 const auto& IntermediateDesc = *pIntermediate->GetDesc(&tmpDesc1);
2573 const auto& DestinationDesc = *pDestinationResource->GetDesc(&tmpDesc2);
2574#endif
2575 if (IntermediateDesc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER ||
2576 IntermediateDesc.Width < RequiredSize + pLayouts[0].Offset ||
2577 RequiredSize > SIZE_T(-1) ||
2578 (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER &&
2579 (FirstSubresource != 0 || NumSubresources != 1)))
2580 {
2581 return 0;
2582 }
2583
2584 BYTE* pData;
2585 HRESULT hr = pIntermediate->Map(0, nullptr, reinterpret_cast<void**>(&pData));
2586 if (FAILED(hr))
2587 {
2588 return 0;
2589 }
2590
2591 for (UINT i = 0; i < NumSubresources; ++i)
2592 {
2593 if (pRowSizesInBytes[i] > SIZE_T(-1)) return 0;
2594 D3D12_MEMCPY_DEST DestData = { pData + pLayouts[i].Offset, pLayouts[i].Footprint.RowPitch, SIZE_T(pLayouts[i].Footprint.RowPitch) * SIZE_T(pNumRows[i]) };
2595 MemcpySubresource(&DestData, &pSrcData[i], static_cast<SIZE_T>(pRowSizesInBytes[i]), pNumRows[i], pLayouts[i].Footprint.Depth);
2596 }
2597 pIntermediate->Unmap(0, nullptr);
2598
2599 if (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER)
2600 {
2601 pCmdList->CopyBufferRegion(
2602 pDestinationResource, 0, pIntermediate, pLayouts[0].Offset, pLayouts[0].Footprint.Width);
2603 }
2604 else
2605 {
2606 for (UINT i = 0; i < NumSubresources; ++i)
2607 {
2608 const CD3DX12_TEXTURE_COPY_LOCATION Dst(pDestinationResource, i + FirstSubresource);
2609 const CD3DX12_TEXTURE_COPY_LOCATION Src(pIntermediate, pLayouts[i]);
2610 pCmdList->CopyTextureRegion(&Dst, 0, 0, 0, &Src, nullptr);
2611 }
2612 }
2613 return RequiredSize;
2614}
2615
2616//------------------------------------------------------------------------------------------------
2617// All arrays must be populated (e.g. by calling GetCopyableFootprints)
2618inline UINT64 UpdateSubresources(
2619 _In_ ID3D12GraphicsCommandList* pCmdList,
2620 _In_ ID3D12Resource* pDestinationResource,
2621 _In_ ID3D12Resource* pIntermediate,
2622 _In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource,
2623 _In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources,
2624 UINT64 RequiredSize,
2625 _In_reads_(NumSubresources) const D3D12_PLACED_SUBRESOURCE_FOOTPRINT* pLayouts,
2626 _In_reads_(NumSubresources) const UINT* pNumRows,
2627 _In_reads_(NumSubresources) const UINT64* pRowSizesInBytes,
2628 _In_ const void* pResourceData,
2629 _In_reads_(NumSubresources) const D3D12_SUBRESOURCE_INFO* pSrcData) noexcept
2630{
2631 // Minor validation
2632#if defined(_MSC_VER) || !defined(_WIN32)
2633 const auto IntermediateDesc = pIntermediate->GetDesc();
2634 const auto DestinationDesc = pDestinationResource->GetDesc();
2635#else
2636 D3D12_RESOURCE_DESC tmpDesc1, tmpDesc2;
2637 const auto& IntermediateDesc = *pIntermediate->GetDesc(&tmpDesc1);
2638 const auto& DestinationDesc = *pDestinationResource->GetDesc(&tmpDesc2);
2639#endif
2640 if (IntermediateDesc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER ||
2641 IntermediateDesc.Width < RequiredSize + pLayouts[0].Offset ||
2642 RequiredSize > SIZE_T(-1) ||
2643 (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER &&
2644 (FirstSubresource != 0 || NumSubresources != 1)))
2645 {
2646 return 0;
2647 }
2648
2649 BYTE* pData;
2650 HRESULT hr = pIntermediate->Map(0, nullptr, reinterpret_cast<void**>(&pData));
2651 if (FAILED(hr))
2652 {
2653 return 0;
2654 }
2655
2656 for (UINT i = 0; i < NumSubresources; ++i)
2657 {
2658 if (pRowSizesInBytes[i] > SIZE_T(-1)) return 0;
2659 D3D12_MEMCPY_DEST DestData = { pData + pLayouts[i].Offset, pLayouts[i].Footprint.RowPitch, SIZE_T(pLayouts[i].Footprint.RowPitch) * SIZE_T(pNumRows[i]) };
2660 MemcpySubresource(&DestData, pResourceData, &pSrcData[i], static_cast<SIZE_T>(pRowSizesInBytes[i]), pNumRows[i], pLayouts[i].Footprint.Depth);
2661 }
2662 pIntermediate->Unmap(0, nullptr);
2663
2664 if (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER)
2665 {
2666 pCmdList->CopyBufferRegion(
2667 pDestinationResource, 0, pIntermediate, pLayouts[0].Offset, pLayouts[0].Footprint.Width);
2668 }
2669 else
2670 {
2671 for (UINT i = 0; i < NumSubresources; ++i)
2672 {
2673 const CD3DX12_TEXTURE_COPY_LOCATION Dst(pDestinationResource, i + FirstSubresource);
2674 const CD3DX12_TEXTURE_COPY_LOCATION Src(pIntermediate, pLayouts[i]);
2675 pCmdList->CopyTextureRegion(&Dst, 0, 0, 0, &Src, nullptr);
2676 }
2677 }
2678 return RequiredSize;
2679}
2680
2681//------------------------------------------------------------------------------------------------
2682// Heap-allocating UpdateSubresources implementation
2683inline UINT64 UpdateSubresources(
2684 _In_ ID3D12GraphicsCommandList* pCmdList,
2685 _In_ ID3D12Resource* pDestinationResource,
2686 _In_ ID3D12Resource* pIntermediate,
2687 UINT64 IntermediateOffset,
2688 _In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource,
2689 _In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources,
2690 _In_reads_(NumSubresources) const D3D12_SUBRESOURCE_DATA* pSrcData) noexcept
2691{
2692 UINT64 RequiredSize = 0;
2693 const auto MemToAlloc = static_cast<UINT64>(sizeof(D3D12_PLACED_SUBRESOURCE_FOOTPRINT) + sizeof(UINT) + sizeof(UINT64)) * NumSubresources;
2694 if (MemToAlloc > SIZE_MAX)
2695 {
2696 return 0;
2697 }
2698 void* pMem = HeapAlloc(GetProcessHeap(), 0, static_cast<SIZE_T>(MemToAlloc));
2699 if (pMem == nullptr)
2700 {
2701 return 0;
2702 }
2703 auto pLayouts = static_cast<D3D12_PLACED_SUBRESOURCE_FOOTPRINT*>(pMem);
2704 auto pRowSizesInBytes = reinterpret_cast<UINT64*>(pLayouts + NumSubresources);
2705 auto pNumRows = reinterpret_cast<UINT*>(pRowSizesInBytes + NumSubresources);
2706
2707#if defined(_MSC_VER) || !defined(_WIN32)
2708 const auto Desc = pDestinationResource->GetDesc();
2709#else
2710 D3D12_RESOURCE_DESC tmpDesc;
2711 const auto& Desc = *pDestinationResource->GetDesc(&tmpDesc);
2712#endif
2713 ID3D12Device* pDevice = nullptr;
2714 pDestinationResource->GetDevice(IID_ID3D12Device, reinterpret_cast<void**>(&pDevice));
2715 pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, IntermediateOffset, pLayouts, pNumRows, pRowSizesInBytes, &RequiredSize);
2716 pDevice->Release();
2717
2718 const UINT64 Result = UpdateSubresources(pCmdList, pDestinationResource, pIntermediate, FirstSubresource, NumSubresources, RequiredSize, pLayouts, pNumRows, pRowSizesInBytes, pSrcData);
2719 HeapFree(GetProcessHeap(), 0, pMem);
2720 return Result;
2721}
2722
2723//------------------------------------------------------------------------------------------------
2724// Heap-allocating UpdateSubresources implementation
2725inline UINT64 UpdateSubresources(
2726 _In_ ID3D12GraphicsCommandList* pCmdList,
2727 _In_ ID3D12Resource* pDestinationResource,
2728 _In_ ID3D12Resource* pIntermediate,
2729 UINT64 IntermediateOffset,
2730 _In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource,
2731 _In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources,
2732 _In_ const void* pResourceData,
2733 _In_reads_(NumSubresources) const D3D12_SUBRESOURCE_INFO* pSrcData) noexcept
2734{
2735 UINT64 RequiredSize = 0;
2736 const auto MemToAlloc = static_cast<UINT64>(sizeof(D3D12_PLACED_SUBRESOURCE_FOOTPRINT) + sizeof(UINT) + sizeof(UINT64)) * NumSubresources;
2737 if (MemToAlloc > SIZE_MAX)
2738 {
2739 return 0;
2740 }
2741 void* pMem = HeapAlloc(GetProcessHeap(), 0, static_cast<SIZE_T>(MemToAlloc));
2742 if (pMem == nullptr)
2743 {
2744 return 0;
2745 }
2746 auto pLayouts = static_cast<D3D12_PLACED_SUBRESOURCE_FOOTPRINT*>(pMem);
2747 auto pRowSizesInBytes = reinterpret_cast<UINT64*>(pLayouts + NumSubresources);
2748 auto pNumRows = reinterpret_cast<UINT*>(pRowSizesInBytes + NumSubresources);
2749
2750#if defined(_MSC_VER) || !defined(_WIN32)
2751 const auto Desc = pDestinationResource->GetDesc();
2752#else
2753 D3D12_RESOURCE_DESC tmpDesc;
2754 const auto& Desc = *pDestinationResource->GetDesc(&tmpDesc);
2755#endif
2756 ID3D12Device* pDevice = nullptr;
2757 pDestinationResource->GetDevice(IID_ID3D12Device, reinterpret_cast<void**>(&pDevice));
2758 pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, IntermediateOffset, pLayouts, pNumRows, pRowSizesInBytes, &RequiredSize);
2759 pDevice->Release();
2760
2761 const UINT64 Result = UpdateSubresources(pCmdList, pDestinationResource, pIntermediate, FirstSubresource, NumSubresources, RequiredSize, pLayouts, pNumRows, pRowSizesInBytes, pResourceData, pSrcData);
2762 HeapFree(GetProcessHeap(), 0, pMem);
2763 return Result;
2764}
2765
2766//------------------------------------------------------------------------------------------------
2767// Stack-allocating UpdateSubresources implementation
2768template <UINT MaxSubresources>
2769inline UINT64 UpdateSubresources(
2770 _In_ ID3D12GraphicsCommandList* pCmdList,
2771 _In_ ID3D12Resource* pDestinationResource,
2772 _In_ ID3D12Resource* pIntermediate,
2773 UINT64 IntermediateOffset,
2774 _In_range_(0,MaxSubresources) UINT FirstSubresource,
2775 _In_range_(1,MaxSubresources-FirstSubresource) UINT NumSubresources,
2776 _In_reads_(NumSubresources) const D3D12_SUBRESOURCE_DATA* pSrcData) noexcept
2777{
2778 UINT64 RequiredSize = 0;
2779 D3D12_PLACED_SUBRESOURCE_FOOTPRINT Layouts[MaxSubresources];
2780 UINT NumRows[MaxSubresources];
2781 UINT64 RowSizesInBytes[MaxSubresources];
2782
2783#if defined(_MSC_VER) || !defined(_WIN32)
2784 const auto Desc = pDestinationResource->GetDesc();
2785#else
2786 D3D12_RESOURCE_DESC tmpDesc;
2787 const auto& Desc = *pDestinationResource->GetDesc(&tmpDesc);
2788#endif
2789 ID3D12Device* pDevice = nullptr;
2790 pDestinationResource->GetDevice(IID_ID3D12Device, reinterpret_cast<void**>(&pDevice));
2791 pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, IntermediateOffset, Layouts, NumRows, RowSizesInBytes, &RequiredSize);
2792 pDevice->Release();
2793
2794 return UpdateSubresources(pCmdList, pDestinationResource, pIntermediate, FirstSubresource, NumSubresources, RequiredSize, Layouts, NumRows, RowSizesInBytes, pSrcData);
2795}
2796
2797//------------------------------------------------------------------------------------------------
2798// Stack-allocating UpdateSubresources implementation
2799template <UINT MaxSubresources>
2800inline UINT64 UpdateSubresources(
2801 _In_ ID3D12GraphicsCommandList* pCmdList,
2802 _In_ ID3D12Resource* pDestinationResource,
2803 _In_ ID3D12Resource* pIntermediate,
2804 UINT64 IntermediateOffset,
2805 _In_range_(0,MaxSubresources) UINT FirstSubresource,
2806 _In_range_(1,MaxSubresources-FirstSubresource) UINT NumSubresources,
2807 _In_ const void* pResourceData,
2808 _In_reads_(NumSubresources) const D3D12_SUBRESOURCE_INFO* pSrcData) noexcept
2809{
2810 UINT64 RequiredSize = 0;
2811 D3D12_PLACED_SUBRESOURCE_FOOTPRINT Layouts[MaxSubresources];
2812 UINT NumRows[MaxSubresources];
2813 UINT64 RowSizesInBytes[MaxSubresources];
2814
2815#if defined(_MSC_VER) || !defined(_WIN32)
2816 const auto Desc = pDestinationResource->GetDesc();
2817#else
2818 D3D12_RESOURCE_DESC tmpDesc;
2819 const auto& Desc = *pDestinationResource->GetDesc(&tmpDesc);
2820#endif
2821 ID3D12Device* pDevice = nullptr;
2822 pDestinationResource->GetDevice(IID_ID3D12Device, reinterpret_cast<void**>(&pDevice));
2823 pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, IntermediateOffset, Layouts, NumRows, RowSizesInBytes, &RequiredSize);
2824 pDevice->Release();
2825
2826 return UpdateSubresources(pCmdList, pDestinationResource, pIntermediate, FirstSubresource, NumSubresources, RequiredSize, Layouts, NumRows, RowSizesInBytes, pResourceData, pSrcData);
2827}
2828
2829//------------------------------------------------------------------------------------------------
2830constexpr bool D3D12IsLayoutOpaque( D3D12_TEXTURE_LAYOUT Layout ) noexcept
2831{ return Layout == D3D12_TEXTURE_LAYOUT_UNKNOWN || Layout == D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE; }
2832
2833//------------------------------------------------------------------------------------------------
2834#ifndef D3DX12_ASSERT
2835 #ifdef assert
2836 #define D3DX12_ASSERT(x) assert(x)
2837 #else
2838 #define D3DX12_ASSERT(x)
2839 #endif
2840#endif
2841
2842template< typename T >
2843inline T D3DX12Align(T uValue, T uAlign)
2844{
2845 // Assert power of 2 alignment
2846 D3DX12_ASSERT(0 == (uAlign & (uAlign - 1)));
2847 T uMask = uAlign - 1;
2848 T uResult = (uValue + uMask) & ~uMask;
2849 D3DX12_ASSERT(uResult >= uValue);
2850 D3DX12_ASSERT(0 == (uResult % uAlign));
2851 return uResult;
2852}
2853
2854//------------------------------------------------------------------------------------------------
2855template< typename T >
2856inline T D3DX12AlignAtLeast(T uValue, T uAlign)
2857{
2858 T aligned = D3DX12Align(uValue, uAlign);
2859 return aligned > uAlign ? aligned : uAlign;
2860}
2861
2862// D3DX12GetCopyableFootprints is not included as it relies on D3D12_PROPERTY_LAYOUT_FORMAT_TABLE
2863
2864//------------------------------------------------------------------------------------------------
2865template <typename t_CommandListType>
2866inline ID3D12CommandList * const * CommandListCast(t_CommandListType * const * pp) noexcept
2867{
2868 // This cast is useful for passing strongly typed command list pointers into
2869 // ExecuteCommandLists.
2870 // This cast is valid as long as the const-ness is respected. D3D12 APIs do
2871 // respect the const-ness of their arguments.
2872 return reinterpret_cast<ID3D12CommandList * const *>(pp);
2873}
2874
2875//------------------------------------------------------------------------------------------------
2876// D3D12 exports a new method for serializing root signatures in the Windows 10 Anniversary Update.
2877// To help enable root signature 1.1 features when they are available and not require maintaining
2878// two code paths for building root signatures, this helper method reconstructs a 1.0 signature when
2879// 1.1 is not supported.
2880#ifdef __clang__
2881#pragma clang diagnostic push
2882#pragma clang diagnostic ignored "-Wcovered-switch-default"
2883#endif
2884
2885inline HRESULT D3DX12SerializeVersionedRootSignature(
2886 _In_ const D3D12_VERSIONED_ROOT_SIGNATURE_DESC* pRootSignatureDesc,
2887 D3D_ROOT_SIGNATURE_VERSION MaxVersion,
2888 _Outptr_ ID3DBlob** ppBlob,
2889 _Always_(_Outptr_opt_result_maybenull_) ID3DBlob** ppErrorBlob) noexcept
2890{
2891 if (ppErrorBlob != nullptr)
2892 {
2893 *ppErrorBlob = nullptr;
2894 }
2895
2896 switch (MaxVersion)
2897 {
2898 case D3D_ROOT_SIGNATURE_VERSION_1_0:
2899 switch (pRootSignatureDesc->Version)
2900 {
2901 case D3D_ROOT_SIGNATURE_VERSION_1_0:
2902 return D3D12SerializeRootSignature(&pRootSignatureDesc->Desc_1_0, D3D_ROOT_SIGNATURE_VERSION_1, ppBlob, ppErrorBlob);
2903
2904 case D3D_ROOT_SIGNATURE_VERSION_1_1:
2905#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)
2906 case D3D_ROOT_SIGNATURE_VERSION_1_2:
2907#endif
2908 {
2909 HRESULT hr = S_OK;
2910 const D3D12_ROOT_SIGNATURE_DESC1& desc_1_1 = pRootSignatureDesc->Desc_1_1;
2911
2912 const SIZE_T ParametersSize = sizeof(D3D12_ROOT_PARAMETER) * desc_1_1.NumParameters;
2913 void* pParameters = (ParametersSize > 0) ? HeapAlloc(GetProcessHeap(), 0, ParametersSize) : nullptr;
2914 if (ParametersSize > 0 && pParameters == nullptr)
2915 {
2916 hr = E_OUTOFMEMORY;
2917 }
2918 auto pParameters_1_0 = static_cast<D3D12_ROOT_PARAMETER*>(pParameters);
2919
2920 if (SUCCEEDED(hr))
2921 {
2922 for (UINT n = 0; n < desc_1_1.NumParameters; n++)
2923 {
2924 __analysis_assume(ParametersSize == sizeof(D3D12_ROOT_PARAMETER) * desc_1_1.NumParameters);
2925 pParameters_1_0[n].ParameterType = desc_1_1.pParameters[n].ParameterType;
2926 pParameters_1_0[n].ShaderVisibility = desc_1_1.pParameters[n].ShaderVisibility;
2927
2928 switch (desc_1_1.pParameters[n].ParameterType)
2929 {
2930 case D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS:
2931 pParameters_1_0[n].Constants.Num32BitValues = desc_1_1.pParameters[n].Constants.Num32BitValues;
2932 pParameters_1_0[n].Constants.RegisterSpace = desc_1_1.pParameters[n].Constants.RegisterSpace;
2933 pParameters_1_0[n].Constants.ShaderRegister = desc_1_1.pParameters[n].Constants.ShaderRegister;
2934 break;
2935
2936 case D3D12_ROOT_PARAMETER_TYPE_CBV:
2937 case D3D12_ROOT_PARAMETER_TYPE_SRV:
2938 case D3D12_ROOT_PARAMETER_TYPE_UAV:
2939 pParameters_1_0[n].Descriptor.RegisterSpace = desc_1_1.pParameters[n].Descriptor.RegisterSpace;
2940 pParameters_1_0[n].Descriptor.ShaderRegister = desc_1_1.pParameters[n].Descriptor.ShaderRegister;
2941 break;
2942
2943 case D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE:
2944 {
2945 const D3D12_ROOT_DESCRIPTOR_TABLE1& table_1_1 = desc_1_1.pParameters[n].DescriptorTable;
2946
2947 const SIZE_T DescriptorRangesSize = sizeof(D3D12_DESCRIPTOR_RANGE) * table_1_1.NumDescriptorRanges;
2948 void* pDescriptorRanges = (DescriptorRangesSize > 0 && SUCCEEDED(hr)) ? HeapAlloc(GetProcessHeap(), 0, DescriptorRangesSize) : nullptr;
2949 if (DescriptorRangesSize > 0 && pDescriptorRanges == nullptr)
2950 {
2951 hr = E_OUTOFMEMORY;
2952 }
2953 auto pDescriptorRanges_1_0 = static_cast<D3D12_DESCRIPTOR_RANGE*>(pDescriptorRanges);
2954
2955 if (SUCCEEDED(hr))
2956 {
2957 for (UINT x = 0; x < table_1_1.NumDescriptorRanges; x++)
2958 {
2959 __analysis_assume(DescriptorRangesSize == sizeof(D3D12_DESCRIPTOR_RANGE) * table_1_1.NumDescriptorRanges);
2960 pDescriptorRanges_1_0[x].BaseShaderRegister = table_1_1.pDescriptorRanges[x].BaseShaderRegister;
2961 pDescriptorRanges_1_0[x].NumDescriptors = table_1_1.pDescriptorRanges[x].NumDescriptors;
2962 pDescriptorRanges_1_0[x].OffsetInDescriptorsFromTableStart = table_1_1.pDescriptorRanges[x].OffsetInDescriptorsFromTableStart;
2963 pDescriptorRanges_1_0[x].RangeType = table_1_1.pDescriptorRanges[x].RangeType;
2964 pDescriptorRanges_1_0[x].RegisterSpace = table_1_1.pDescriptorRanges[x].RegisterSpace;
2965 }
2966 }
2967
2968 D3D12_ROOT_DESCRIPTOR_TABLE& table_1_0 = pParameters_1_0[n].DescriptorTable;
2969 table_1_0.NumDescriptorRanges = table_1_1.NumDescriptorRanges;
2970 table_1_0.pDescriptorRanges = pDescriptorRanges_1_0;
2971 }
2972 break;
2973
2974 default:
2975 break;
2976 }
2977 }
2978 }
2979
2980 D3D12_STATIC_SAMPLER_DESC* pStaticSamplers = nullptr;
2981#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)
2982 if (desc_1_1.NumStaticSamplers > 0 && pRootSignatureDesc->Version == D3D_ROOT_SIGNATURE_VERSION_1_2)
2983 {
2984 const SIZE_T SamplersSize = sizeof(D3D12_STATIC_SAMPLER_DESC) * desc_1_1.NumStaticSamplers;
2985 pStaticSamplers = static_cast<D3D12_STATIC_SAMPLER_DESC*>(HeapAlloc(GetProcessHeap(), 0, SamplersSize));
2986
2987 if (pStaticSamplers == nullptr)
2988 {
2989 hr = E_OUTOFMEMORY;
2990 }
2991 else
2992 {
2993 const D3D12_ROOT_SIGNATURE_DESC2& desc_1_2 = pRootSignatureDesc->Desc_1_2;
2994 for (UINT n = 0; n < desc_1_1.NumStaticSamplers; ++n)
2995 {
2996 if ((desc_1_2.pStaticSamplers[n].Flags & ~D3D12_SAMPLER_FLAG_UINT_BORDER_COLOR) != 0)
2997 {
2998 hr = E_INVALIDARG;
2999 break;
3000 }
3001 memcpy(pStaticSamplers + n, desc_1_2.pStaticSamplers + n, sizeof(D3D12_STATIC_SAMPLER_DESC));
3002 }
3003 }
3004 }
3005#endif
3006
3007 if (SUCCEEDED(hr))
3008 {
3009 const CD3DX12_ROOT_SIGNATURE_DESC desc_1_0(desc_1_1.NumParameters, pParameters_1_0, desc_1_1.NumStaticSamplers, pStaticSamplers == nullptr ? desc_1_1.pStaticSamplers : pStaticSamplers, desc_1_1.Flags);
3010 hr = D3D12SerializeRootSignature(&desc_1_0, D3D_ROOT_SIGNATURE_VERSION_1, ppBlob, ppErrorBlob);
3011 }
3012
3013 if (pParameters)
3014 {
3015 for (UINT n = 0; n < desc_1_1.NumParameters; n++)
3016 {
3017 if (desc_1_1.pParameters[n].ParameterType == D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE)
3018 {
3019 auto pDescriptorRanges_1_0 = pParameters_1_0[n].DescriptorTable.pDescriptorRanges;
3020 HeapFree(GetProcessHeap(), 0, reinterpret_cast<void*>(const_cast<D3D12_DESCRIPTOR_RANGE*>(pDescriptorRanges_1_0)));
3021 }
3022 }
3023 HeapFree(GetProcessHeap(), 0, pParameters);
3024 }
3025
3026 if (pStaticSamplers)
3027 {
3028 HeapFree(GetProcessHeap(), 0, pStaticSamplers);
3029 }
3030
3031 return hr;
3032 }
3033
3034 default:
3035 break;
3036 }
3037 break;
3038
3039 case D3D_ROOT_SIGNATURE_VERSION_1_1:
3040 switch (pRootSignatureDesc->Version)
3041 {
3042 case D3D_ROOT_SIGNATURE_VERSION_1_0:
3043 case D3D_ROOT_SIGNATURE_VERSION_1_1:
3044 return D3D12SerializeVersionedRootSignature(pRootSignatureDesc, ppBlob, ppErrorBlob);
3045
3046#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)
3047 case D3D_ROOT_SIGNATURE_VERSION_1_2:
3048 {
3049 HRESULT hr = S_OK;
3050 const D3D12_ROOT_SIGNATURE_DESC1& desc_1_1 = pRootSignatureDesc->Desc_1_1;
3051
3052 D3D12_STATIC_SAMPLER_DESC* pStaticSamplers = nullptr;
3053 if (desc_1_1.NumStaticSamplers > 0)
3054 {
3055 const SIZE_T SamplersSize = sizeof(D3D12_STATIC_SAMPLER_DESC) * desc_1_1.NumStaticSamplers;
3056 pStaticSamplers = static_cast<D3D12_STATIC_SAMPLER_DESC*>(HeapAlloc(GetProcessHeap(), 0, SamplersSize));
3057
3058 if (pStaticSamplers == nullptr)
3059 {
3060 hr = E_OUTOFMEMORY;
3061 }
3062 else
3063 {
3064 const D3D12_ROOT_SIGNATURE_DESC2& desc_1_2 = pRootSignatureDesc->Desc_1_2;
3065 for (UINT n = 0; n < desc_1_1.NumStaticSamplers; ++n)
3066 {
3067 if ((desc_1_2.pStaticSamplers[n].Flags & ~D3D12_SAMPLER_FLAG_UINT_BORDER_COLOR) != 0)
3068 {
3069 hr = E_INVALIDARG;
3070 break;
3071 }
3072 memcpy(pStaticSamplers + n, desc_1_2.pStaticSamplers + n, sizeof(D3D12_STATIC_SAMPLER_DESC));
3073 }
3074 }
3075 }
3076
3077 if (SUCCEEDED(hr))
3078 {
3079 const CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC desc(desc_1_1.NumParameters, desc_1_1.pParameters, desc_1_1.NumStaticSamplers, pStaticSamplers == nullptr ? desc_1_1.pStaticSamplers : pStaticSamplers, desc_1_1.Flags);
3080 hr = D3D12SerializeVersionedRootSignature(&desc, ppBlob, ppErrorBlob);
3081 }
3082
3083 if (pStaticSamplers)
3084 {
3085 HeapFree(GetProcessHeap(), 0, pStaticSamplers);
3086 }
3087
3088 return hr;
3089 }
3090#endif
3091
3092 default:
3093 break;
3094 }
3095 break;
3096
3097#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)
3098 case D3D_ROOT_SIGNATURE_VERSION_1_2:
3099#endif
3100 default:
3101 return D3D12SerializeVersionedRootSignature(pRootSignatureDesc, ppBlob, ppErrorBlob);
3102 }
3103
3104 return E_INVALIDARG;
3105}
3106
3107#ifdef __clang__
3108#pragma clang diagnostic pop
3109#endif
3110
3111//------------------------------------------------------------------------------------------------
3112struct CD3DX12_RT_FORMAT_ARRAY : public D3D12_RT_FORMAT_ARRAY
3113{
3114 CD3DX12_RT_FORMAT_ARRAY() = default;
3115 explicit CD3DX12_RT_FORMAT_ARRAY(const D3D12_RT_FORMAT_ARRAY& o) noexcept
3116 : D3D12_RT_FORMAT_ARRAY(o)
3117 {}
3118 explicit CD3DX12_RT_FORMAT_ARRAY(_In_reads_(NumFormats) const DXGI_FORMAT* pFormats, UINT NumFormats) noexcept
3119 {
3120 NumRenderTargets = NumFormats;
3121 memcpy(RTFormats, pFormats, sizeof(RTFormats));
3122 // assumes ARRAY_SIZE(pFormats) == ARRAY_SIZE(RTFormats)
3123 }
3124};
3125
3126//------------------------------------------------------------------------------------------------
3127// Pipeline State Stream Helpers
3128//------------------------------------------------------------------------------------------------
3129
3130//------------------------------------------------------------------------------------------------
3131// Stream Subobjects, i.e. elements of a stream
3132
3133struct DefaultSampleMask { operator UINT() noexcept { return UINT_MAX; } };
3134struct DefaultSampleDesc { operator DXGI_SAMPLE_DESC() noexcept { return DXGI_SAMPLE_DESC{1, 0}; } };
3135
3136#ifdef _MSC_VER
3137#pragma warning(push)
3138#pragma warning(disable : 4324)
3139#endif
3140template <typename InnerStructType, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE Type, typename DefaultArg = InnerStructType>
3141class alignas(void*) CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT
3142{
3143private:
3144 D3D12_PIPELINE_STATE_SUBOBJECT_TYPE pssType;
3145 InnerStructType pssInner;
3146public:
3147 CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT() noexcept : pssType(Type), pssInner(DefaultArg()) {}
3148 CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT(InnerStructType const& i) noexcept : pssType(Type), pssInner(i) {}
3149 CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT& operator=(InnerStructType const& i) noexcept { pssType = Type; pssInner = i; return *this; }
3150 operator InnerStructType const&() const noexcept { return pssInner; }
3151 operator InnerStructType&() noexcept { return pssInner; }
3152 InnerStructType* operator&() noexcept { return &pssInner; }
3153 InnerStructType const* operator&() const noexcept { return &pssInner; }
3154};
3155#ifdef _MSC_VER
3156#pragma warning(pop)
3157#endif
3158typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_PIPELINE_STATE_FLAGS, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_FLAGS> CD3DX12_PIPELINE_STATE_STREAM_FLAGS;
3159typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< UINT, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_NODE_MASK> CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK;
3160typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< ID3D12RootSignature*, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_ROOT_SIGNATURE> CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE;
3161typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_INPUT_LAYOUT_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_INPUT_LAYOUT> CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT;
3162typedef 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;
3163typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_PRIMITIVE_TOPOLOGY_TYPE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY> CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY;
3164typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VS> CD3DX12_PIPELINE_STATE_STREAM_VS;
3165typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_GS> CD3DX12_PIPELINE_STATE_STREAM_GS;
3166typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_STREAM_OUTPUT_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_STREAM_OUTPUT> CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT;
3167typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_HS> CD3DX12_PIPELINE_STATE_STREAM_HS;
3168typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DS> CD3DX12_PIPELINE_STATE_STREAM_DS;
3169typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PS> CD3DX12_PIPELINE_STATE_STREAM_PS;
3170typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_AS> CD3DX12_PIPELINE_STATE_STREAM_AS;
3171typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MS> CD3DX12_PIPELINE_STATE_STREAM_MS;
3172typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CS> CD3DX12_PIPELINE_STATE_STREAM_CS;
3173typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_BLEND_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_BLEND, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC;
3174typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_DEPTH_STENCIL_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL;
3175typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_DEPTH_STENCIL_DESC1, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL1, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1;
3176#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
3177typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_DEPTH_STENCIL_DESC2, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL2, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL2;
3178#endif
3179typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< DXGI_FORMAT, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL_FORMAT> CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT;
3180typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_RASTERIZER_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER;
3181#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
3182typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_RASTERIZER_DESC1, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER1, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER1;
3183#endif
3184#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
3185typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_RASTERIZER_DESC2, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER2, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER2;
3186#endif
3187typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_RT_FORMAT_ARRAY, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RENDER_TARGET_FORMATS> CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS;
3188typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< DXGI_SAMPLE_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_DESC, DefaultSampleDesc> CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC;
3189typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< UINT, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_MASK, DefaultSampleMask> CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK;
3190typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_CACHED_PIPELINE_STATE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CACHED_PSO> CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO;
3191typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_VIEW_INSTANCING_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VIEW_INSTANCING, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING;
3192
3193//------------------------------------------------------------------------------------------------
3194// Stream Parser Helpers
3195
3196struct ID3DX12PipelineParserCallbacks
3197{
3198 // Subobject Callbacks
3199 virtual void FlagsCb(D3D12_PIPELINE_STATE_FLAGS) {}
3200 virtual void NodeMaskCb(UINT) {}
3201 virtual void RootSignatureCb(ID3D12RootSignature*) {}
3202 virtual void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC&) {}
3203 virtual void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE) {}
3204 virtual void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE) {}
3205 virtual void VSCb(const D3D12_SHADER_BYTECODE&) {}
3206 virtual void GSCb(const D3D12_SHADER_BYTECODE&) {}
3207 virtual void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC&) {}
3208 virtual void HSCb(const D3D12_SHADER_BYTECODE&) {}
3209 virtual void DSCb(const D3D12_SHADER_BYTECODE&) {}
3210 virtual void PSCb(const D3D12_SHADER_BYTECODE&) {}
3211 virtual void CSCb(const D3D12_SHADER_BYTECODE&) {}
3212 virtual void ASCb(const D3D12_SHADER_BYTECODE&) {}
3213 virtual void MSCb(const D3D12_SHADER_BYTECODE&) {}
3214 virtual void BlendStateCb(const D3D12_BLEND_DESC&) {}
3215 virtual void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC&) {}
3216 virtual void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1&) {}
3217#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
3218 virtual void DepthStencilState2Cb(const D3D12_DEPTH_STENCIL_DESC2&) {}
3219#endif
3220 virtual void DSVFormatCb(DXGI_FORMAT) {}
3221 virtual void RasterizerStateCb(const D3D12_RASTERIZER_DESC&) {}
3222#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
3223 virtual void RasterizerState1Cb(const D3D12_RASTERIZER_DESC1&) {}
3224#endif
3225#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
3226 virtual void RasterizerState2Cb(const D3D12_RASTERIZER_DESC2&) {}
3227#endif
3228 virtual void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY&) {}
3229 virtual void SampleDescCb(const DXGI_SAMPLE_DESC&) {}
3230 virtual void SampleMaskCb(UINT) {}
3231 virtual void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC&) {}
3232 virtual void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE&) {}
3233
3234 // Error Callbacks
3235 virtual void ErrorBadInputParameter(UINT /*ParameterIndex*/) {}
3236 virtual void ErrorDuplicateSubobject(D3D12_PIPELINE_STATE_SUBOBJECT_TYPE /*DuplicateType*/) {}
3237 virtual void ErrorUnknownSubobject(UINT /*UnknownTypeValue*/) {}
3238#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 613)
3239 virtual void FinalizeCb() {}
3240#endif
3241
3242 virtual ~ID3DX12PipelineParserCallbacks() = default;
3243};
3244
3245struct D3DX12_MESH_SHADER_PIPELINE_STATE_DESC
3246{
3247 ID3D12RootSignature* pRootSignature;
3248 D3D12_SHADER_BYTECODE AS;
3249 D3D12_SHADER_BYTECODE MS;
3250 D3D12_SHADER_BYTECODE PS;
3251 D3D12_BLEND_DESC BlendState;
3252 UINT SampleMask;
3253 D3D12_RASTERIZER_DESC RasterizerState;
3254 D3D12_DEPTH_STENCIL_DESC DepthStencilState;
3255 D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType;
3256 UINT NumRenderTargets;
3257 DXGI_FORMAT RTVFormats[ D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT ];
3258 DXGI_FORMAT DSVFormat;
3259 DXGI_SAMPLE_DESC SampleDesc;
3260 UINT NodeMask;
3261 D3D12_CACHED_PIPELINE_STATE CachedPSO;
3262 D3D12_PIPELINE_STATE_FLAGS Flags;
3263};
3264
3265#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
3266// Use CD3DX12_PIPELINE_STATE_STREAM5 for D3D12_RASTERIZER_DESC2 when CheckFeatureSupport returns true for Options19::RasterizerDesc2Supported is true
3267// Use CD3DX12_PIPELINE_STATE_STREAM4 for D3D12_RASTERIZER_DESC1 when CheckFeatureSupport returns true for Options16::DynamicDepthBiasSupported is true
3268// Use CD3DX12_PIPELINE_STATE_STREAM3 for D3D12_DEPTH_STENCIL_DESC2 when CheckFeatureSupport returns true for Options14::IndependentFrontAndBackStencilSupported is true
3269// Use CD3DX12_PIPELINE_STATE_STREAM2 for OS Build 19041+ (where there is a new mesh shader pipeline).
3270// Use CD3DX12_PIPELINE_STATE_STREAM1 for OS Build 16299+ (where there is a new view instancing subobject).
3271// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.
3272struct CD3DX12_PIPELINE_STATE_STREAM5
3273{
3274 CD3DX12_PIPELINE_STATE_STREAM5() = default;
3275 // Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC
3276 CD3DX12_PIPELINE_STATE_STREAM5(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept
3277 : Flags(Desc.Flags)
3278 , NodeMask(Desc.NodeMask)
3279 , pRootSignature(Desc.pRootSignature)
3280 , InputLayout(Desc.InputLayout)
3281 , IBStripCutValue(Desc.IBStripCutValue)
3282 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
3283 , VS(Desc.VS)
3284 , GS(Desc.GS)
3285 , StreamOutput(Desc.StreamOutput)
3286 , HS(Desc.HS)
3287 , DS(Desc.DS)
3288 , PS(Desc.PS)
3289 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
3290 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))
3291 , DSVFormat(Desc.DSVFormat)
3292 , RasterizerState(CD3DX12_RASTERIZER_DESC2(Desc.RasterizerState))
3293 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
3294 , SampleDesc(Desc.SampleDesc)
3295 , SampleMask(Desc.SampleMask)
3296 , CachedPSO(Desc.CachedPSO)
3297 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
3298 {}
3299 CD3DX12_PIPELINE_STATE_STREAM5(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept
3300 : Flags(Desc.Flags)
3301 , NodeMask(Desc.NodeMask)
3302 , pRootSignature(Desc.pRootSignature)
3303 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
3304 , PS(Desc.PS)
3305 , AS(Desc.AS)
3306 , MS(Desc.MS)
3307 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
3308 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))
3309 , DSVFormat(Desc.DSVFormat)
3310 , RasterizerState(CD3DX12_RASTERIZER_DESC2(Desc.RasterizerState))
3311 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
3312 , SampleDesc(Desc.SampleDesc)
3313 , SampleMask(Desc.SampleMask)
3314 , CachedPSO(Desc.CachedPSO)
3315 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
3316 {}
3317 CD3DX12_PIPELINE_STATE_STREAM5(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept
3318 : Flags(Desc.Flags)
3319 , NodeMask(Desc.NodeMask)
3320 , pRootSignature(Desc.pRootSignature)
3321 , CS(CD3DX12_SHADER_BYTECODE(Desc.CS))
3322 , CachedPSO(Desc.CachedPSO)
3323 {
3324 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(DepthStencilState).DepthEnable = false;
3325 }
3326 CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
3327 CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
3328 CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
3329 CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;
3330 CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;
3331 CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
3332 CD3DX12_PIPELINE_STATE_STREAM_VS VS;
3333 CD3DX12_PIPELINE_STATE_STREAM_GS GS;
3334 CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;
3335 CD3DX12_PIPELINE_STATE_STREAM_HS HS;
3336 CD3DX12_PIPELINE_STATE_STREAM_DS DS;
3337 CD3DX12_PIPELINE_STATE_STREAM_PS PS;
3338 CD3DX12_PIPELINE_STATE_STREAM_AS AS;
3339 CD3DX12_PIPELINE_STATE_STREAM_MS MS;
3340 CD3DX12_PIPELINE_STATE_STREAM_CS CS;
3341 CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
3342 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL2 DepthStencilState;
3343 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
3344 CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER2 RasterizerState;
3345 CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
3346 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
3347 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
3348 CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
3349 CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;
3350
3351 D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept
3352 {
3353 D3D12_GRAPHICS_PIPELINE_STATE_DESC D;
3354 D.Flags = this->Flags;
3355 D.NodeMask = this->NodeMask;
3356 D.pRootSignature = this->pRootSignature;
3357 D.InputLayout = this->InputLayout;
3358 D.IBStripCutValue = this->IBStripCutValue;
3359 D.PrimitiveTopologyType = this->PrimitiveTopologyType;
3360 D.VS = this->VS;
3361 D.GS = this->GS;
3362 D.StreamOutput = this->StreamOutput;
3363 D.HS = this->HS;
3364 D.DS = this->DS;
3365 D.PS = this->PS;
3366 D.BlendState = this->BlendState;
3367 D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(D3D12_DEPTH_STENCIL_DESC2(this->DepthStencilState));
3368 D.DSVFormat = this->DSVFormat;
3369 D.RasterizerState = CD3DX12_RASTERIZER_DESC2(D3D12_RASTERIZER_DESC2(this->RasterizerState));
3370 D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
3371 memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
3372 D.SampleDesc = this->SampleDesc;
3373 D.SampleMask = this->SampleMask;
3374 D.CachedPSO = this->CachedPSO;
3375 return D;
3376 }
3377 D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept
3378 {
3379 D3D12_COMPUTE_PIPELINE_STATE_DESC D;
3380 D.Flags = this->Flags;
3381 D.NodeMask = this->NodeMask;
3382 D.pRootSignature = this->pRootSignature;
3383 D.CS = this->CS;
3384 D.CachedPSO = this->CachedPSO;
3385 return D;
3386 }
3387};
3388#endif // D3D12_SDK_VERSION >= 610
3389
3390#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
3391// Use CD3DX12_PIPELINE_STATE_STREAM4 for D3D12_RASTERIZER_DESC1 when CheckFeatureSupport returns true for Options16::DynamicDepthBiasSupported is true
3392// Use CD3DX12_PIPELINE_STATE_STREAM3 for D3D12_DEPTH_STENCIL_DESC2 when CheckFeatureSupport returns true for Options14::IndependentFrontAndBackStencilSupported is true
3393// Use CD3DX12_PIPELINE_STATE_STREAM2 for OS Build 19041+ (where there is a new mesh shader pipeline).
3394// Use CD3DX12_PIPELINE_STATE_STREAM1 for OS Build 16299+ (where there is a new view instancing subobject).
3395// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.
3396struct CD3DX12_PIPELINE_STATE_STREAM4
3397{
3398 CD3DX12_PIPELINE_STATE_STREAM4() = default;
3399 // Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC
3400 CD3DX12_PIPELINE_STATE_STREAM4(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept
3401 : Flags(Desc.Flags)
3402 , NodeMask(Desc.NodeMask)
3403 , pRootSignature(Desc.pRootSignature)
3404 , InputLayout(Desc.InputLayout)
3405 , IBStripCutValue(Desc.IBStripCutValue)
3406 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
3407 , VS(Desc.VS)
3408 , GS(Desc.GS)
3409 , StreamOutput(Desc.StreamOutput)
3410 , HS(Desc.HS)
3411 , DS(Desc.DS)
3412 , PS(Desc.PS)
3413 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
3414 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))
3415 , DSVFormat(Desc.DSVFormat)
3416 , RasterizerState(CD3DX12_RASTERIZER_DESC1(Desc.RasterizerState))
3417 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
3418 , SampleDesc(Desc.SampleDesc)
3419 , SampleMask(Desc.SampleMask)
3420 , CachedPSO(Desc.CachedPSO)
3421 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
3422 {}
3423 CD3DX12_PIPELINE_STATE_STREAM4(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept
3424 : Flags(Desc.Flags)
3425 , NodeMask(Desc.NodeMask)
3426 , pRootSignature(Desc.pRootSignature)
3427 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
3428 , PS(Desc.PS)
3429 , AS(Desc.AS)
3430 , MS(Desc.MS)
3431 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
3432 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))
3433 , DSVFormat(Desc.DSVFormat)
3434 , RasterizerState(CD3DX12_RASTERIZER_DESC1(Desc.RasterizerState))
3435 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
3436 , SampleDesc(Desc.SampleDesc)
3437 , SampleMask(Desc.SampleMask)
3438 , CachedPSO(Desc.CachedPSO)
3439 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
3440 {}
3441 CD3DX12_PIPELINE_STATE_STREAM4(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept
3442 : Flags(Desc.Flags)
3443 , NodeMask(Desc.NodeMask)
3444 , pRootSignature(Desc.pRootSignature)
3445 , CS(CD3DX12_SHADER_BYTECODE(Desc.CS))
3446 , CachedPSO(Desc.CachedPSO)
3447 {
3448 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(DepthStencilState).DepthEnable = false;
3449 }
3450 CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
3451 CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
3452 CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
3453 CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;
3454 CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;
3455 CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
3456 CD3DX12_PIPELINE_STATE_STREAM_VS VS;
3457 CD3DX12_PIPELINE_STATE_STREAM_GS GS;
3458 CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;
3459 CD3DX12_PIPELINE_STATE_STREAM_HS HS;
3460 CD3DX12_PIPELINE_STATE_STREAM_DS DS;
3461 CD3DX12_PIPELINE_STATE_STREAM_PS PS;
3462 CD3DX12_PIPELINE_STATE_STREAM_AS AS;
3463 CD3DX12_PIPELINE_STATE_STREAM_MS MS;
3464 CD3DX12_PIPELINE_STATE_STREAM_CS CS;
3465 CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
3466 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL2 DepthStencilState;
3467 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
3468 CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER1 RasterizerState;
3469 CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
3470 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
3471 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
3472 CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
3473 CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;
3474
3475 D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept
3476 {
3477 D3D12_GRAPHICS_PIPELINE_STATE_DESC D;
3478 D.Flags = this->Flags;
3479 D.NodeMask = this->NodeMask;
3480 D.pRootSignature = this->pRootSignature;
3481 D.InputLayout = this->InputLayout;
3482 D.IBStripCutValue = this->IBStripCutValue;
3483 D.PrimitiveTopologyType = this->PrimitiveTopologyType;
3484 D.VS = this->VS;
3485 D.GS = this->GS;
3486 D.StreamOutput = this->StreamOutput;
3487 D.HS = this->HS;
3488 D.DS = this->DS;
3489 D.PS = this->PS;
3490 D.BlendState = this->BlendState;
3491 D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(D3D12_DEPTH_STENCIL_DESC2(this->DepthStencilState));
3492 D.DSVFormat = this->DSVFormat;
3493 D.RasterizerState = CD3DX12_RASTERIZER_DESC1(D3D12_RASTERIZER_DESC1(this->RasterizerState));
3494 D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
3495 memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
3496 D.SampleDesc = this->SampleDesc;
3497 D.SampleMask = this->SampleMask;
3498 D.CachedPSO = this->CachedPSO;
3499 return D;
3500 }
3501 D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept
3502 {
3503 D3D12_COMPUTE_PIPELINE_STATE_DESC D;
3504 D.Flags = this->Flags;
3505 D.NodeMask = this->NodeMask;
3506 D.pRootSignature = this->pRootSignature;
3507 D.CS = this->CS;
3508 D.CachedPSO = this->CachedPSO;
3509 return D;
3510 }
3511};
3512#endif // D3D12_SDK_VERSION >= 608
3513
3514#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
3515// Use CD3DX12_PIPELINE_STATE_STREAM3 for D3D12_DEPTH_STENCIL_DESC2 when CheckFeatureSupport returns true for Options14::IndependentFrontAndBackStencilSupported is true
3516// Use CD3DX12_PIPELINE_STATE_STREAM2 for OS Build 19041+ (where there is a new mesh shader pipeline).
3517// Use CD3DX12_PIPELINE_STATE_STREAM1 for OS Build 16299+ (where there is a new view instancing subobject).
3518// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.
3519struct CD3DX12_PIPELINE_STATE_STREAM3
3520{
3521 CD3DX12_PIPELINE_STATE_STREAM3() = default;
3522 // Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC
3523 CD3DX12_PIPELINE_STATE_STREAM3(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept
3524 : Flags(Desc.Flags)
3525 , NodeMask(Desc.NodeMask)
3526 , pRootSignature(Desc.pRootSignature)
3527 , InputLayout(Desc.InputLayout)
3528 , IBStripCutValue(Desc.IBStripCutValue)
3529 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
3530 , VS(Desc.VS)
3531 , GS(Desc.GS)
3532 , StreamOutput(Desc.StreamOutput)
3533 , HS(Desc.HS)
3534 , DS(Desc.DS)
3535 , PS(Desc.PS)
3536 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
3537 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))
3538 , DSVFormat(Desc.DSVFormat)
3539 , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
3540 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
3541 , SampleDesc(Desc.SampleDesc)
3542 , SampleMask(Desc.SampleMask)
3543 , CachedPSO(Desc.CachedPSO)
3544 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
3545 {}
3546 CD3DX12_PIPELINE_STATE_STREAM3(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept
3547 : Flags(Desc.Flags)
3548 , NodeMask(Desc.NodeMask)
3549 , pRootSignature(Desc.pRootSignature)
3550 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
3551 , PS(Desc.PS)
3552 , AS(Desc.AS)
3553 , MS(Desc.MS)
3554 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
3555 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC2(Desc.DepthStencilState))
3556 , DSVFormat(Desc.DSVFormat)
3557 , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
3558 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
3559 , SampleDesc(Desc.SampleDesc)
3560 , SampleMask(Desc.SampleMask)
3561 , CachedPSO(Desc.CachedPSO)
3562 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
3563 {}
3564 CD3DX12_PIPELINE_STATE_STREAM3(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept
3565 : Flags(Desc.Flags)
3566 , NodeMask(Desc.NodeMask)
3567 , pRootSignature(Desc.pRootSignature)
3568 , CS(CD3DX12_SHADER_BYTECODE(Desc.CS))
3569 , CachedPSO(Desc.CachedPSO)
3570 {
3571 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(DepthStencilState).DepthEnable = false;
3572 }
3573 CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
3574 CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
3575 CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
3576 CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;
3577 CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;
3578 CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
3579 CD3DX12_PIPELINE_STATE_STREAM_VS VS;
3580 CD3DX12_PIPELINE_STATE_STREAM_GS GS;
3581 CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;
3582 CD3DX12_PIPELINE_STATE_STREAM_HS HS;
3583 CD3DX12_PIPELINE_STATE_STREAM_DS DS;
3584 CD3DX12_PIPELINE_STATE_STREAM_PS PS;
3585 CD3DX12_PIPELINE_STATE_STREAM_AS AS;
3586 CD3DX12_PIPELINE_STATE_STREAM_MS MS;
3587 CD3DX12_PIPELINE_STATE_STREAM_CS CS;
3588 CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
3589 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL2 DepthStencilState;
3590 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
3591 CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;
3592 CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
3593 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
3594 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
3595 CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
3596 CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;
3597
3598 D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept
3599 {
3600 D3D12_GRAPHICS_PIPELINE_STATE_DESC D;
3601 D.Flags = this->Flags;
3602 D.NodeMask = this->NodeMask;
3603 D.pRootSignature = this->pRootSignature;
3604 D.InputLayout = this->InputLayout;
3605 D.IBStripCutValue = this->IBStripCutValue;
3606 D.PrimitiveTopologyType = this->PrimitiveTopologyType;
3607 D.VS = this->VS;
3608 D.GS = this->GS;
3609 D.StreamOutput = this->StreamOutput;
3610 D.HS = this->HS;
3611 D.DS = this->DS;
3612 D.PS = this->PS;
3613 D.BlendState = this->BlendState;
3614 D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(D3D12_DEPTH_STENCIL_DESC2(this->DepthStencilState));
3615 D.DSVFormat = this->DSVFormat;
3616 D.RasterizerState = this->RasterizerState;
3617 D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
3618 memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
3619 D.SampleDesc = this->SampleDesc;
3620 D.SampleMask = this->SampleMask;
3621 D.CachedPSO = this->CachedPSO;
3622 return D;
3623 }
3624 D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept
3625 {
3626 D3D12_COMPUTE_PIPELINE_STATE_DESC D;
3627 D.Flags = this->Flags;
3628 D.NodeMask = this->NodeMask;
3629 D.pRootSignature = this->pRootSignature;
3630 D.CS = this->CS;
3631 D.CachedPSO = this->CachedPSO;
3632 return D;
3633 }
3634};
3635#endif // D3D12_SDK_VERSION >= 606
3636
3637// CD3DX12_PIPELINE_STATE_STREAM2 Works on OS Build 19041+ (where there is a new mesh shader pipeline).
3638// Use CD3DX12_PIPELINE_STATE_STREAM1 for OS Build 16299+ (where there is a new view instancing subobject).
3639// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.
3640struct CD3DX12_PIPELINE_STATE_STREAM2
3641{
3642 CD3DX12_PIPELINE_STATE_STREAM2() = default;
3643 // Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC
3644 CD3DX12_PIPELINE_STATE_STREAM2(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept
3645 : Flags(Desc.Flags)
3646 , NodeMask(Desc.NodeMask)
3647 , pRootSignature(Desc.pRootSignature)
3648 , InputLayout(Desc.InputLayout)
3649 , IBStripCutValue(Desc.IBStripCutValue)
3650 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
3651 , VS(Desc.VS)
3652 , GS(Desc.GS)
3653 , StreamOutput(Desc.StreamOutput)
3654 , HS(Desc.HS)
3655 , DS(Desc.DS)
3656 , PS(Desc.PS)
3657 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
3658 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))
3659 , DSVFormat(Desc.DSVFormat)
3660 , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
3661 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
3662 , SampleDesc(Desc.SampleDesc)
3663 , SampleMask(Desc.SampleMask)
3664 , CachedPSO(Desc.CachedPSO)
3665 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
3666 {}
3667 CD3DX12_PIPELINE_STATE_STREAM2(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept
3668 : Flags(Desc.Flags)
3669 , NodeMask(Desc.NodeMask)
3670 , pRootSignature(Desc.pRootSignature)
3671 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
3672 , PS(Desc.PS)
3673 , AS(Desc.AS)
3674 , MS(Desc.MS)
3675 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
3676 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))
3677 , DSVFormat(Desc.DSVFormat)
3678 , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
3679 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
3680 , SampleDesc(Desc.SampleDesc)
3681 , SampleMask(Desc.SampleMask)
3682 , CachedPSO(Desc.CachedPSO)
3683 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
3684 {}
3685 CD3DX12_PIPELINE_STATE_STREAM2(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept
3686 : Flags(Desc.Flags)
3687 , NodeMask(Desc.NodeMask)
3688 , pRootSignature(Desc.pRootSignature)
3689 , CS(CD3DX12_SHADER_BYTECODE(Desc.CS))
3690 , CachedPSO(Desc.CachedPSO)
3691 {
3692 static_cast<D3D12_DEPTH_STENCIL_DESC1&>(DepthStencilState).DepthEnable = false;
3693 }
3694 CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
3695 CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
3696 CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
3697 CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;
3698 CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;
3699 CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
3700 CD3DX12_PIPELINE_STATE_STREAM_VS VS;
3701 CD3DX12_PIPELINE_STATE_STREAM_GS GS;
3702 CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;
3703 CD3DX12_PIPELINE_STATE_STREAM_HS HS;
3704 CD3DX12_PIPELINE_STATE_STREAM_DS DS;
3705 CD3DX12_PIPELINE_STATE_STREAM_PS PS;
3706 CD3DX12_PIPELINE_STATE_STREAM_AS AS;
3707 CD3DX12_PIPELINE_STATE_STREAM_MS MS;
3708 CD3DX12_PIPELINE_STATE_STREAM_CS CS;
3709 CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
3710 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState;
3711 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
3712 CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;
3713 CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
3714 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
3715 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
3716 CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
3717 CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;
3718 D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept
3719 {
3720 D3D12_GRAPHICS_PIPELINE_STATE_DESC D;
3721 D.Flags = this->Flags;
3722 D.NodeMask = this->NodeMask;
3723 D.pRootSignature = this->pRootSignature;
3724 D.InputLayout = this->InputLayout;
3725 D.IBStripCutValue = this->IBStripCutValue;
3726 D.PrimitiveTopologyType = this->PrimitiveTopologyType;
3727 D.VS = this->VS;
3728 D.GS = this->GS;
3729 D.StreamOutput = this->StreamOutput;
3730 D.HS = this->HS;
3731 D.DS = this->DS;
3732 D.PS = this->PS;
3733 D.BlendState = this->BlendState;
3734 D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState));
3735 D.DSVFormat = this->DSVFormat;
3736 D.RasterizerState = this->RasterizerState;
3737 D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
3738 memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
3739 D.SampleDesc = this->SampleDesc;
3740 D.SampleMask = this->SampleMask;
3741 D.CachedPSO = this->CachedPSO;
3742 return D;
3743 }
3744 D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept
3745 {
3746 D3D12_COMPUTE_PIPELINE_STATE_DESC D;
3747 D.Flags = this->Flags;
3748 D.NodeMask = this->NodeMask;
3749 D.pRootSignature = this->pRootSignature;
3750 D.CS = this->CS;
3751 D.CachedPSO = this->CachedPSO;
3752 return D;
3753 }
3754};
3755
3756// CD3DX12_PIPELINE_STATE_STREAM1 Works on OS Build 16299+ (where there is a new view instancing subobject).
3757// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support.
3758struct CD3DX12_PIPELINE_STATE_STREAM1
3759{
3760 CD3DX12_PIPELINE_STATE_STREAM1() = default;
3761 // Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC
3762 CD3DX12_PIPELINE_STATE_STREAM1(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept
3763 : Flags(Desc.Flags)
3764 , NodeMask(Desc.NodeMask)
3765 , pRootSignature(Desc.pRootSignature)
3766 , InputLayout(Desc.InputLayout)
3767 , IBStripCutValue(Desc.IBStripCutValue)
3768 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
3769 , VS(Desc.VS)
3770 , GS(Desc.GS)
3771 , StreamOutput(Desc.StreamOutput)
3772 , HS(Desc.HS)
3773 , DS(Desc.DS)
3774 , PS(Desc.PS)
3775 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
3776 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))
3777 , DSVFormat(Desc.DSVFormat)
3778 , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
3779 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
3780 , SampleDesc(Desc.SampleDesc)
3781 , SampleMask(Desc.SampleMask)
3782 , CachedPSO(Desc.CachedPSO)
3783 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
3784 {}
3785 CD3DX12_PIPELINE_STATE_STREAM1(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept
3786 : Flags(Desc.Flags)
3787 , NodeMask(Desc.NodeMask)
3788 , pRootSignature(Desc.pRootSignature)
3789 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
3790 , PS(Desc.PS)
3791 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
3792 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))
3793 , DSVFormat(Desc.DSVFormat)
3794 , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
3795 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
3796 , SampleDesc(Desc.SampleDesc)
3797 , SampleMask(Desc.SampleMask)
3798 , CachedPSO(Desc.CachedPSO)
3799 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
3800 {}
3801 CD3DX12_PIPELINE_STATE_STREAM1(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept
3802 : Flags(Desc.Flags)
3803 , NodeMask(Desc.NodeMask)
3804 , pRootSignature(Desc.pRootSignature)
3805 , CS(CD3DX12_SHADER_BYTECODE(Desc.CS))
3806 , CachedPSO(Desc.CachedPSO)
3807 {
3808 static_cast<D3D12_DEPTH_STENCIL_DESC1&>(DepthStencilState).DepthEnable = false;
3809 }
3810 CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
3811 CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
3812 CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
3813 CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;
3814 CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;
3815 CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
3816 CD3DX12_PIPELINE_STATE_STREAM_VS VS;
3817 CD3DX12_PIPELINE_STATE_STREAM_GS GS;
3818 CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;
3819 CD3DX12_PIPELINE_STATE_STREAM_HS HS;
3820 CD3DX12_PIPELINE_STATE_STREAM_DS DS;
3821 CD3DX12_PIPELINE_STATE_STREAM_PS PS;
3822 CD3DX12_PIPELINE_STATE_STREAM_CS CS;
3823 CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
3824 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState;
3825 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
3826 CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;
3827 CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
3828 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
3829 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
3830 CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
3831 CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;
3832 D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept
3833 {
3834 D3D12_GRAPHICS_PIPELINE_STATE_DESC D;
3835 D.Flags = this->Flags;
3836 D.NodeMask = this->NodeMask;
3837 D.pRootSignature = this->pRootSignature;
3838 D.InputLayout = this->InputLayout;
3839 D.IBStripCutValue = this->IBStripCutValue;
3840 D.PrimitiveTopologyType = this->PrimitiveTopologyType;
3841 D.VS = this->VS;
3842 D.GS = this->GS;
3843 D.StreamOutput = this->StreamOutput;
3844 D.HS = this->HS;
3845 D.DS = this->DS;
3846 D.PS = this->PS;
3847 D.BlendState = this->BlendState;
3848 D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState));
3849 D.DSVFormat = this->DSVFormat;
3850 D.RasterizerState = this->RasterizerState;
3851 D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
3852 memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
3853 D.SampleDesc = this->SampleDesc;
3854 D.SampleMask = this->SampleMask;
3855 D.CachedPSO = this->CachedPSO;
3856 return D;
3857 }
3858 D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept
3859 {
3860 D3D12_COMPUTE_PIPELINE_STATE_DESC D;
3861 D.Flags = this->Flags;
3862 D.NodeMask = this->NodeMask;
3863 D.pRootSignature = this->pRootSignature;
3864 D.CS = this->CS;
3865 D.CachedPSO = this->CachedPSO;
3866 return D;
3867 }
3868};
3869
3870
3871struct CD3DX12_PIPELINE_MESH_STATE_STREAM
3872{
3873 CD3DX12_PIPELINE_MESH_STATE_STREAM() = default;
3874 CD3DX12_PIPELINE_MESH_STATE_STREAM(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept
3875 : Flags(Desc.Flags)
3876 , NodeMask(Desc.NodeMask)
3877 , pRootSignature(Desc.pRootSignature)
3878 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
3879 , PS(Desc.PS)
3880 , AS(Desc.AS)
3881 , MS(Desc.MS)
3882 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
3883 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))
3884 , DSVFormat(Desc.DSVFormat)
3885 , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
3886 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
3887 , SampleDesc(Desc.SampleDesc)
3888 , SampleMask(Desc.SampleMask)
3889 , CachedPSO(Desc.CachedPSO)
3890 , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT()))
3891 {}
3892 CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
3893 CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
3894 CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
3895 CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
3896 CD3DX12_PIPELINE_STATE_STREAM_PS PS;
3897 CD3DX12_PIPELINE_STATE_STREAM_AS AS;
3898 CD3DX12_PIPELINE_STATE_STREAM_MS MS;
3899 CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
3900 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState;
3901 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
3902 CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;
3903 CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
3904 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
3905 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
3906 CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
3907 CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc;
3908 D3DX12_MESH_SHADER_PIPELINE_STATE_DESC MeshShaderDescV0() const noexcept
3909 {
3910 D3DX12_MESH_SHADER_PIPELINE_STATE_DESC D;
3911 D.Flags = this->Flags;
3912 D.NodeMask = this->NodeMask;
3913 D.pRootSignature = this->pRootSignature;
3914 D.PrimitiveTopologyType = this->PrimitiveTopologyType;
3915 D.PS = this->PS;
3916 D.AS = this->AS;
3917 D.MS = this->MS;
3918 D.BlendState = this->BlendState;
3919 D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState));
3920 D.DSVFormat = this->DSVFormat;
3921 D.RasterizerState = this->RasterizerState;
3922 D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
3923 memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
3924 D.SampleDesc = this->SampleDesc;
3925 D.SampleMask = this->SampleMask;
3926 D.CachedPSO = this->CachedPSO;
3927 return D;
3928 }
3929};
3930
3931// CD3DX12_PIPELINE_STATE_STREAM works on OS Build 15063+ but does not support new subobject(s) added in OS Build 16299+.
3932// See CD3DX12_PIPELINE_STATE_STREAM1 for instance.
3933struct CD3DX12_PIPELINE_STATE_STREAM
3934{
3935 CD3DX12_PIPELINE_STATE_STREAM() = default;
3936 CD3DX12_PIPELINE_STATE_STREAM(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept
3937 : Flags(Desc.Flags)
3938 , NodeMask(Desc.NodeMask)
3939 , pRootSignature(Desc.pRootSignature)
3940 , InputLayout(Desc.InputLayout)
3941 , IBStripCutValue(Desc.IBStripCutValue)
3942 , PrimitiveTopologyType(Desc.PrimitiveTopologyType)
3943 , VS(Desc.VS)
3944 , GS(Desc.GS)
3945 , StreamOutput(Desc.StreamOutput)
3946 , HS(Desc.HS)
3947 , DS(Desc.DS)
3948 , PS(Desc.PS)
3949 , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState))
3950 , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState))
3951 , DSVFormat(Desc.DSVFormat)
3952 , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState))
3953 , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets))
3954 , SampleDesc(Desc.SampleDesc)
3955 , SampleMask(Desc.SampleMask)
3956 , CachedPSO(Desc.CachedPSO)
3957 {}
3958 CD3DX12_PIPELINE_STATE_STREAM(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept
3959 : Flags(Desc.Flags)
3960 , NodeMask(Desc.NodeMask)
3961 , pRootSignature(Desc.pRootSignature)
3962 , CS(CD3DX12_SHADER_BYTECODE(Desc.CS))
3963 , CachedPSO(Desc.CachedPSO)
3964 {}
3965 CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags;
3966 CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask;
3967 CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
3968 CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout;
3969 CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue;
3970 CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType;
3971 CD3DX12_PIPELINE_STATE_STREAM_VS VS;
3972 CD3DX12_PIPELINE_STATE_STREAM_GS GS;
3973 CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput;
3974 CD3DX12_PIPELINE_STATE_STREAM_HS HS;
3975 CD3DX12_PIPELINE_STATE_STREAM_DS DS;
3976 CD3DX12_PIPELINE_STATE_STREAM_PS PS;
3977 CD3DX12_PIPELINE_STATE_STREAM_CS CS;
3978 CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
3979 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState;
3980 CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat;
3981 CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;
3982 CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats;
3983 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
3984 CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
3985 CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO;
3986 D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept
3987 {
3988 D3D12_GRAPHICS_PIPELINE_STATE_DESC D;
3989 D.Flags = this->Flags;
3990 D.NodeMask = this->NodeMask;
3991 D.pRootSignature = this->pRootSignature;
3992 D.InputLayout = this->InputLayout;
3993 D.IBStripCutValue = this->IBStripCutValue;
3994 D.PrimitiveTopologyType = this->PrimitiveTopologyType;
3995 D.VS = this->VS;
3996 D.GS = this->GS;
3997 D.StreamOutput = this->StreamOutput;
3998 D.HS = this->HS;
3999 D.DS = this->DS;
4000 D.PS = this->PS;
4001 D.BlendState = this->BlendState;
4002 D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState));
4003 D.DSVFormat = this->DSVFormat;
4004 D.RasterizerState = this->RasterizerState;
4005 D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets;
4006 memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats));
4007 D.SampleDesc = this->SampleDesc;
4008 D.SampleMask = this->SampleMask;
4009 D.CachedPSO = this->CachedPSO;
4010 return D;
4011 }
4012 D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept
4013 {
4014 D3D12_COMPUTE_PIPELINE_STATE_DESC D;
4015 D.Flags = this->Flags;
4016 D.NodeMask = this->NodeMask;
4017 D.pRootSignature = this->pRootSignature;
4018 D.CS = this->CS;
4019 D.CachedPSO = this->CachedPSO;
4020 return D;
4021 }
4022};
4023
4024struct CD3DX12_PIPELINE_STATE_STREAM2_PARSE_HELPER : public ID3DX12PipelineParserCallbacks
4025{
4026 CD3DX12_PIPELINE_STATE_STREAM2 PipelineStream;
4027 CD3DX12_PIPELINE_STATE_STREAM2_PARSE_HELPER() noexcept
4028 : SeenDSS(false)
4029 {
4030 // Adjust defaults to account for absent members.
4031 PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
4032
4033 // Depth disabled if no DSV format specified.
4034 static_cast<D3D12_DEPTH_STENCIL_DESC1&>(PipelineStream.DepthStencilState).DepthEnable = false;
4035 }
4036
4037 // ID3DX12PipelineParserCallbacks
4038 void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override {PipelineStream.Flags = Flags;}
4039 void NodeMaskCb(UINT NodeMask) override {PipelineStream.NodeMask = NodeMask;}
4040 void RootSignatureCb(ID3D12RootSignature* pRootSignature) override {PipelineStream.pRootSignature = pRootSignature;}
4041 void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override {PipelineStream.InputLayout = InputLayout;}
4042 void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override {PipelineStream.IBStripCutValue = IBStripCutValue;}
4043 void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override {PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType;}
4044 void VSCb(const D3D12_SHADER_BYTECODE& VS) override {PipelineStream.VS = VS;}
4045 void GSCb(const D3D12_SHADER_BYTECODE& GS) override {PipelineStream.GS = GS;}
4046 void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override {PipelineStream.StreamOutput = StreamOutput;}
4047 void HSCb(const D3D12_SHADER_BYTECODE& HS) override {PipelineStream.HS = HS;}
4048 void DSCb(const D3D12_SHADER_BYTECODE& DS) override {PipelineStream.DS = DS;}
4049 void PSCb(const D3D12_SHADER_BYTECODE& PS) override {PipelineStream.PS = PS;}
4050 void CSCb(const D3D12_SHADER_BYTECODE& CS) override {PipelineStream.CS = CS;}
4051 void ASCb(const D3D12_SHADER_BYTECODE& AS) override {PipelineStream.AS = AS;}
4052 void MSCb(const D3D12_SHADER_BYTECODE& MS) override {PipelineStream.MS = MS;}
4053 void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override {PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState);}
4054 void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override
4055 {
4056 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(DepthStencilState);
4057 SeenDSS = true;
4058 }
4059 void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override
4060 {
4061 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(DepthStencilState);
4062 SeenDSS = true;
4063 }
4064 void DSVFormatCb(DXGI_FORMAT DSVFormat) override
4065 {
4066 PipelineStream.DSVFormat = DSVFormat;
4067 if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN)
4068 {
4069 // Re-enable depth for the default state.
4070 static_cast<D3D12_DEPTH_STENCIL_DESC1&>(PipelineStream.DepthStencilState).DepthEnable = true;
4071 }
4072 }
4073 void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override {PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC(RasterizerState);}
4074 void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override {PipelineStream.RTVFormats = RTVFormats;}
4075 void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override {PipelineStream.SampleDesc = SampleDesc;}
4076 void SampleMaskCb(UINT SampleMask) override {PipelineStream.SampleMask = SampleMask;}
4077 void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override {PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc);}
4078 void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override {PipelineStream.CachedPSO = CachedPSO;}
4079
4080private:
4081 bool SeenDSS;
4082};
4083
4084#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
4085struct CD3DX12_PIPELINE_STATE_STREAM3_PARSE_HELPER : public ID3DX12PipelineParserCallbacks
4086{
4087 CD3DX12_PIPELINE_STATE_STREAM3 PipelineStream;
4088 CD3DX12_PIPELINE_STATE_STREAM3_PARSE_HELPER() noexcept
4089 : SeenDSS(false)
4090 {
4091 // Adjust defaults to account for absent members.
4092 PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
4093
4094 // Depth disabled if no DSV format specified.
4095 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = false;
4096 }
4097
4098 // ID3DX12PipelineParserCallbacks
4099 void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override { PipelineStream.Flags = Flags; }
4100 void NodeMaskCb(UINT NodeMask) override { PipelineStream.NodeMask = NodeMask; }
4101 void RootSignatureCb(ID3D12RootSignature* pRootSignature) override { PipelineStream.pRootSignature = pRootSignature; }
4102 void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override { PipelineStream.InputLayout = InputLayout; }
4103 void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override { PipelineStream.IBStripCutValue = IBStripCutValue; }
4104 void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override { PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType; }
4105 void VSCb(const D3D12_SHADER_BYTECODE& VS) override { PipelineStream.VS = VS; }
4106 void GSCb(const D3D12_SHADER_BYTECODE& GS) override { PipelineStream.GS = GS; }
4107 void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override { PipelineStream.StreamOutput = StreamOutput; }
4108 void HSCb(const D3D12_SHADER_BYTECODE& HS) override { PipelineStream.HS = HS; }
4109 void DSCb(const D3D12_SHADER_BYTECODE& DS) override { PipelineStream.DS = DS; }
4110 void PSCb(const D3D12_SHADER_BYTECODE& PS) override { PipelineStream.PS = PS; }
4111 void CSCb(const D3D12_SHADER_BYTECODE& CS) override { PipelineStream.CS = CS; }
4112 void ASCb(const D3D12_SHADER_BYTECODE& AS) override { PipelineStream.AS = AS; }
4113 void MSCb(const D3D12_SHADER_BYTECODE& MS) override { PipelineStream.MS = MS; }
4114 void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override { PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState); }
4115 void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override
4116 {
4117 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
4118 SeenDSS = true;
4119 }
4120 void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override
4121 {
4122 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
4123 SeenDSS = true;
4124 }
4125 void DepthStencilState2Cb(const D3D12_DEPTH_STENCIL_DESC2& DepthStencilState) override
4126 {
4127 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
4128 SeenDSS = true;
4129 }
4130 void DSVFormatCb(DXGI_FORMAT DSVFormat) override
4131 {
4132 PipelineStream.DSVFormat = DSVFormat;
4133 if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN)
4134 {
4135 // Re-enable depth for the default state.
4136 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = true;
4137 }
4138 }
4139 void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC(RasterizerState); }
4140 void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override { PipelineStream.RTVFormats = RTVFormats; }
4141 void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override { PipelineStream.SampleDesc = SampleDesc; }
4142 void SampleMaskCb(UINT SampleMask) override { PipelineStream.SampleMask = SampleMask; }
4143 void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override { PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc); }
4144 void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override { PipelineStream.CachedPSO = CachedPSO; }
4145
4146private:
4147 bool SeenDSS;
4148};
4149#endif // D3D12_SDK_VERSION >= 606
4150
4151#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
4152struct CD3DX12_PIPELINE_STATE_STREAM4_PARSE_HELPER : public ID3DX12PipelineParserCallbacks
4153{
4154 CD3DX12_PIPELINE_STATE_STREAM4 PipelineStream;
4155 CD3DX12_PIPELINE_STATE_STREAM4_PARSE_HELPER() noexcept
4156 : SeenDSS(false)
4157 {
4158 // Adjust defaults to account for absent members.
4159 PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
4160
4161 // Depth disabled if no DSV format specified.
4162 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = false;
4163 }
4164
4165 // ID3DX12PipelineParserCallbacks
4166 void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override { PipelineStream.Flags = Flags; }
4167 void NodeMaskCb(UINT NodeMask) override { PipelineStream.NodeMask = NodeMask; }
4168 void RootSignatureCb(ID3D12RootSignature* pRootSignature) override { PipelineStream.pRootSignature = pRootSignature; }
4169 void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override { PipelineStream.InputLayout = InputLayout; }
4170 void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override { PipelineStream.IBStripCutValue = IBStripCutValue; }
4171 void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override { PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType; }
4172 void VSCb(const D3D12_SHADER_BYTECODE& VS) override { PipelineStream.VS = VS; }
4173 void GSCb(const D3D12_SHADER_BYTECODE& GS) override { PipelineStream.GS = GS; }
4174 void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override { PipelineStream.StreamOutput = StreamOutput; }
4175 void HSCb(const D3D12_SHADER_BYTECODE& HS) override { PipelineStream.HS = HS; }
4176 void DSCb(const D3D12_SHADER_BYTECODE& DS) override { PipelineStream.DS = DS; }
4177 void PSCb(const D3D12_SHADER_BYTECODE& PS) override { PipelineStream.PS = PS; }
4178 void CSCb(const D3D12_SHADER_BYTECODE& CS) override { PipelineStream.CS = CS; }
4179 void ASCb(const D3D12_SHADER_BYTECODE& AS) override { PipelineStream.AS = AS; }
4180 void MSCb(const D3D12_SHADER_BYTECODE& MS) override { PipelineStream.MS = MS; }
4181 void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override { PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState); }
4182 void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override
4183 {
4184 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
4185 SeenDSS = true;
4186 }
4187 void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override
4188 {
4189 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
4190 SeenDSS = true;
4191 }
4192 void DepthStencilState2Cb(const D3D12_DEPTH_STENCIL_DESC2& DepthStencilState) override
4193 {
4194 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
4195 SeenDSS = true;
4196 }
4197 void DSVFormatCb(DXGI_FORMAT DSVFormat) override
4198 {
4199 PipelineStream.DSVFormat = DSVFormat;
4200 if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN)
4201 {
4202 // Re-enable depth for the default state.
4203 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = true;
4204 }
4205 }
4206 void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC1(RasterizerState); }
4207 void RasterizerState1Cb(const D3D12_RASTERIZER_DESC1& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC1(RasterizerState); }
4208 void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override { PipelineStream.RTVFormats = RTVFormats; }
4209 void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override { PipelineStream.SampleDesc = SampleDesc; }
4210 void SampleMaskCb(UINT SampleMask) override { PipelineStream.SampleMask = SampleMask; }
4211 void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override { PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc); }
4212 void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override { PipelineStream.CachedPSO = CachedPSO; }
4213
4214private:
4215 bool SeenDSS;
4216};
4217#endif // D3D12_SDK_VERSION >= 608
4218
4219#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 613)
4220// This SDK 613 version has better primitive topology default handling than the v610 equivalent below.
4221struct CD3DX12_PIPELINE_STATE_STREAM5_PARSE_HELPER : public ID3DX12PipelineParserCallbacks
4222{
4223 CD3DX12_PIPELINE_STATE_STREAM5 PipelineStream;
4224 CD3DX12_PIPELINE_STATE_STREAM5_PARSE_HELPER() noexcept
4225 : SeenDSS(false),
4226 SeenMS(false),
4227 SeenTopology(false)
4228 {
4229 // Adjust defaults to account for absent members.
4230 PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
4231
4232 // Depth disabled if no DSV format specified.
4233 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = false;
4234 }
4235
4236 // ID3DX12PipelineParserCallbacks
4237 void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override { PipelineStream.Flags = Flags; }
4238 void NodeMaskCb(UINT NodeMask) override { PipelineStream.NodeMask = NodeMask; }
4239 void RootSignatureCb(ID3D12RootSignature* pRootSignature) override { PipelineStream.pRootSignature = pRootSignature; }
4240 void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override { PipelineStream.InputLayout = InputLayout; }
4241 void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override { PipelineStream.IBStripCutValue = IBStripCutValue; }
4242 void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override
4243 {
4244 PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType;
4245 SeenTopology = true;
4246 }
4247 void VSCb(const D3D12_SHADER_BYTECODE& VS) override { PipelineStream.VS = VS; }
4248 void GSCb(const D3D12_SHADER_BYTECODE& GS) override { PipelineStream.GS = GS; }
4249 void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override { PipelineStream.StreamOutput = StreamOutput; }
4250 void HSCb(const D3D12_SHADER_BYTECODE& HS) override { PipelineStream.HS = HS; }
4251 void DSCb(const D3D12_SHADER_BYTECODE& DS) override { PipelineStream.DS = DS; }
4252 void PSCb(const D3D12_SHADER_BYTECODE& PS) override { PipelineStream.PS = PS; }
4253 void CSCb(const D3D12_SHADER_BYTECODE& CS) override { PipelineStream.CS = CS; }
4254 void ASCb(const D3D12_SHADER_BYTECODE& AS) override { PipelineStream.AS = AS; }
4255 void MSCb(const D3D12_SHADER_BYTECODE& MS) override { PipelineStream.MS = MS; SeenMS = true; }
4256 void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override { PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState); }
4257 void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override
4258 {
4259 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
4260 SeenDSS = true;
4261 }
4262 void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override
4263 {
4264 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
4265 SeenDSS = true;
4266 }
4267 void DepthStencilState2Cb(const D3D12_DEPTH_STENCIL_DESC2& DepthStencilState) override
4268 {
4269 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
4270 SeenDSS = true;
4271 }
4272 void DSVFormatCb(DXGI_FORMAT DSVFormat) override {PipelineStream.DSVFormat = DSVFormat;}
4273 void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
4274 void RasterizerState1Cb(const D3D12_RASTERIZER_DESC1& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
4275 void RasterizerState2Cb(const D3D12_RASTERIZER_DESC2& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
4276 void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override { PipelineStream.RTVFormats = RTVFormats; }
4277 void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override { PipelineStream.SampleDesc = SampleDesc; }
4278 void SampleMaskCb(UINT SampleMask) override { PipelineStream.SampleMask = SampleMask; }
4279 void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override { PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc); }
4280 void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override { PipelineStream.CachedPSO = CachedPSO; }
4281 void FinalizeCb() override
4282 {
4283 if (!SeenDSS && PipelineStream.DSVFormat != DXGI_FORMAT_UNKNOWN)
4284 {
4285 // Re-enable depth for the default state.
4286 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = true;
4287 }
4288 if (!SeenTopology && SeenMS)
4289 {
4290 PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED;
4291 }
4292 }
4293
4294private:
4295 bool SeenDSS;
4296 bool SeenMS;
4297 bool SeenTopology;
4298};
4299#elif defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
4300struct CD3DX12_PIPELINE_STATE_STREAM5_PARSE_HELPER : public ID3DX12PipelineParserCallbacks
4301{
4302 CD3DX12_PIPELINE_STATE_STREAM5 PipelineStream;
4303 CD3DX12_PIPELINE_STATE_STREAM5_PARSE_HELPER() noexcept
4304 : SeenDSS(false)
4305 {
4306 // Adjust defaults to account for absent members.
4307 PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
4308
4309 // Depth disabled if no DSV format specified.
4310 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = false;
4311 }
4312
4313 // ID3DX12PipelineParserCallbacks
4314 void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override { PipelineStream.Flags = Flags; }
4315 void NodeMaskCb(UINT NodeMask) override { PipelineStream.NodeMask = NodeMask; }
4316 void RootSignatureCb(ID3D12RootSignature* pRootSignature) override { PipelineStream.pRootSignature = pRootSignature; }
4317 void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override { PipelineStream.InputLayout = InputLayout; }
4318 void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override { PipelineStream.IBStripCutValue = IBStripCutValue; }
4319 void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override { PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType; }
4320 void VSCb(const D3D12_SHADER_BYTECODE& VS) override { PipelineStream.VS = VS; }
4321 void GSCb(const D3D12_SHADER_BYTECODE& GS) override { PipelineStream.GS = GS; }
4322 void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override { PipelineStream.StreamOutput = StreamOutput; }
4323 void HSCb(const D3D12_SHADER_BYTECODE& HS) override { PipelineStream.HS = HS; }
4324 void DSCb(const D3D12_SHADER_BYTECODE& DS) override { PipelineStream.DS = DS; }
4325 void PSCb(const D3D12_SHADER_BYTECODE& PS) override { PipelineStream.PS = PS; }
4326 void CSCb(const D3D12_SHADER_BYTECODE& CS) override { PipelineStream.CS = CS; }
4327 void ASCb(const D3D12_SHADER_BYTECODE& AS) override { PipelineStream.AS = AS; }
4328 void MSCb(const D3D12_SHADER_BYTECODE& MS) override { PipelineStream.MS = MS; }
4329 void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override { PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState); }
4330 void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override
4331 {
4332 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
4333 SeenDSS = true;
4334 }
4335 void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override
4336 {
4337 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
4338 SeenDSS = true;
4339 }
4340 void DepthStencilState2Cb(const D3D12_DEPTH_STENCIL_DESC2& DepthStencilState) override
4341 {
4342 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
4343 SeenDSS = true;
4344 }
4345 void DSVFormatCb(DXGI_FORMAT DSVFormat) override
4346 {
4347 PipelineStream.DSVFormat = DSVFormat;
4348 if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN)
4349 {
4350 // Re-enable depth for the default state.
4351 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = true;
4352 }
4353 }
4354 void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
4355 void RasterizerState1Cb(const D3D12_RASTERIZER_DESC1& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
4356 void RasterizerState2Cb(const D3D12_RASTERIZER_DESC2& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
4357 void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override { PipelineStream.RTVFormats = RTVFormats; }
4358 void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override { PipelineStream.SampleDesc = SampleDesc; }
4359 void SampleMaskCb(UINT SampleMask) override { PipelineStream.SampleMask = SampleMask; }
4360 void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override { PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc); }
4361 void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override { PipelineStream.CachedPSO = CachedPSO; }
4362
4363private:
4364 bool SeenDSS;
4365};
4366#endif // D3D12_SDK_VERSION >= 610
4367
4368#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 618)
4369struct CD3DX12_PIPELINE_STATE_STREAM6_PARSE_HELPER : public ID3DX12PipelineParserCallbacks
4370{
4371 CD3DX12_PIPELINE_STATE_STREAM6 PipelineStream;
4372 CD3DX12_PIPELINE_STATE_STREAM6_PARSE_HELPER() noexcept
4373 : SeenDSS(false),
4374 SeenMS(false),
4375 SeenTopology(false)
4376 {
4377 // Adjust defaults to account for absent members.
4378 PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
4379
4380 // Depth disabled if no DSV format specified.
4381 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = false;
4382 }
4383
4384 // ID3DX12PipelineParserCallbacks
4385 void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override { PipelineStream.Flags = Flags; }
4386 void NodeMaskCb(UINT NodeMask) override { PipelineStream.NodeMask = NodeMask; }
4387 void RootSignatureCb(ID3D12RootSignature* pRootSignature) override { PipelineStream.pRootSignature = pRootSignature; }
4388 void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override { PipelineStream.InputLayout = InputLayout; }
4389 void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override { PipelineStream.IBStripCutValue = IBStripCutValue; }
4390 void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override
4391 {
4392 PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType;
4393 SeenTopology = true;
4394 }
4395 void VSCb(const D3D12_SHADER_BYTECODE& VS) override { PipelineStream.VS = VS; }
4396 void GSCb(const D3D12_SHADER_BYTECODE& GS) override { PipelineStream.GS = GS; }
4397 void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override { PipelineStream.StreamOutput = StreamOutput; }
4398 void HSCb(const D3D12_SHADER_BYTECODE& HS) override { PipelineStream.HS = HS; }
4399 void DSCb(const D3D12_SHADER_BYTECODE& DS) override { PipelineStream.DS = DS; }
4400 void PSCb(const D3D12_SHADER_BYTECODE& PS) override { PipelineStream.PS = PS; }
4401 void CSCb(const D3D12_SHADER_BYTECODE& CS) override { PipelineStream.CS = CS; }
4402 void ASCb(const D3D12_SHADER_BYTECODE& AS) override { PipelineStream.AS = AS; }
4403 void MSCb(const D3D12_SHADER_BYTECODE& MS) override { PipelineStream.MS = MS; SeenMS = true; }
4404 void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override { PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState); }
4405 void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override
4406 {
4407 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
4408 SeenDSS = true;
4409 }
4410 void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override
4411 {
4412 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
4413 SeenDSS = true;
4414 }
4415 void DepthStencilState2Cb(const D3D12_DEPTH_STENCIL_DESC2& DepthStencilState) override
4416 {
4417 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC2(DepthStencilState);
4418 SeenDSS = true;
4419 }
4420 void DSVFormatCb(DXGI_FORMAT DSVFormat) override { PipelineStream.DSVFormat = DSVFormat; }
4421 void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
4422 void RasterizerState1Cb(const D3D12_RASTERIZER_DESC1& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
4423 void RasterizerState2Cb(const D3D12_RASTERIZER_DESC2& RasterizerState) override { PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC2(RasterizerState); }
4424 void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override { PipelineStream.RTVFormats = RTVFormats; }
4425 void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override { PipelineStream.SampleDesc = SampleDesc; }
4426 void SampleMaskCb(UINT SampleMask) override { PipelineStream.SampleMask = SampleMask; }
4427 void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override { PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc); }
4428 void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override { PipelineStream.CachedPSO = CachedPSO; }
4429 void FinalizeCb() override
4430 {
4431 if (!SeenDSS && PipelineStream.DSVFormat != DXGI_FORMAT_UNKNOWN)
4432 {
4433 // Re-enable depth for the default state.
4434 static_cast<D3D12_DEPTH_STENCIL_DESC2&>(PipelineStream.DepthStencilState).DepthEnable = true;
4435 }
4436 if (!SeenTopology && SeenMS)
4437 {
4438 PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED;
4439 }
4440 }
4441 void SerializedRootSignatureCb(const D3D12_SERIALIZED_ROOT_SIGNATURE_DESC& SerializedRootSignature) override { PipelineStream.SerializedRootSignature = CD3DX12_SERIALIZED_ROOT_SIGNATURE_DESC(SerializedRootSignature); }
4442
4443private:
4444 bool SeenDSS;
4445 bool SeenMS;
4446 bool SeenTopology;
4447};
4448#endif // D3D12_SDK_VERSION >= 618
4449
4450struct CD3DX12_PIPELINE_STATE_STREAM_PARSE_HELPER : public ID3DX12PipelineParserCallbacks
4451{
4452 CD3DX12_PIPELINE_STATE_STREAM1 PipelineStream;
4453 CD3DX12_PIPELINE_STATE_STREAM_PARSE_HELPER() noexcept
4454 : SeenDSS(false)
4455 {
4456 // Adjust defaults to account for absent members.
4457 PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
4458
4459 // Depth disabled if no DSV format specified.
4460 static_cast<D3D12_DEPTH_STENCIL_DESC1&>(PipelineStream.DepthStencilState).DepthEnable = false;
4461 }
4462
4463 // ID3DX12PipelineParserCallbacks
4464 void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override {PipelineStream.Flags = Flags;}
4465 void NodeMaskCb(UINT NodeMask) override {PipelineStream.NodeMask = NodeMask;}
4466 void RootSignatureCb(ID3D12RootSignature* pRootSignature) override {PipelineStream.pRootSignature = pRootSignature;}
4467 void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override {PipelineStream.InputLayout = InputLayout;}
4468 void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override {PipelineStream.IBStripCutValue = IBStripCutValue;}
4469 void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override {PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType;}
4470 void VSCb(const D3D12_SHADER_BYTECODE& VS) override {PipelineStream.VS = VS;}
4471 void GSCb(const D3D12_SHADER_BYTECODE& GS) override {PipelineStream.GS = GS;}
4472 void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override {PipelineStream.StreamOutput = StreamOutput;}
4473 void HSCb(const D3D12_SHADER_BYTECODE& HS) override {PipelineStream.HS = HS;}
4474 void DSCb(const D3D12_SHADER_BYTECODE& DS) override {PipelineStream.DS = DS;}
4475 void PSCb(const D3D12_SHADER_BYTECODE& PS) override {PipelineStream.PS = PS;}
4476 void CSCb(const D3D12_SHADER_BYTECODE& CS) override {PipelineStream.CS = CS;}
4477 void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override {PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState);}
4478 void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override
4479 {
4480 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(DepthStencilState);
4481 SeenDSS = true;
4482 }
4483 void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override
4484 {
4485 PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(DepthStencilState);
4486 SeenDSS = true;
4487 }
4488 void DSVFormatCb(DXGI_FORMAT DSVFormat) override
4489 {
4490 PipelineStream.DSVFormat = DSVFormat;
4491 if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN)
4492 {
4493 // Re-enable depth for the default state.
4494 static_cast<D3D12_DEPTH_STENCIL_DESC1&>(PipelineStream.DepthStencilState).DepthEnable = true;
4495 }
4496 }
4497 void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override {PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC(RasterizerState);}
4498 void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override {PipelineStream.RTVFormats = RTVFormats;}
4499 void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override {PipelineStream.SampleDesc = SampleDesc;}
4500 void SampleMaskCb(UINT SampleMask) override {PipelineStream.SampleMask = SampleMask;}
4501 void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override {PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc);}
4502 void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override {PipelineStream.CachedPSO = CachedPSO;}
4503
4504private:
4505 bool SeenDSS;
4506};
4507
4508inline D3D12_PIPELINE_STATE_SUBOBJECT_TYPE D3DX12GetBaseSubobjectType(D3D12_PIPELINE_STATE_SUBOBJECT_TYPE SubobjectType) noexcept
4509{
4510 switch (SubobjectType)
4511 {
4512 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL1:
4513 return D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL;
4514#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
4515 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL2:
4516 return D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL;
4517#endif
4518#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
4519 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER1:
4520 return D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER;
4521#endif
4522 default:
4523 return SubobjectType;
4524 }
4525}
4526
4527inline HRESULT D3DX12ParsePipelineStream(const D3D12_PIPELINE_STATE_STREAM_DESC& Desc, ID3DX12PipelineParserCallbacks* pCallbacks)
4528{
4529 if (pCallbacks == nullptr)
4530 {
4531 return E_INVALIDARG;
4532 }
4533
4534 if (Desc.SizeInBytes == 0 || Desc.pPipelineStateSubobjectStream == nullptr)
4535 {
4536 pCallbacks->ErrorBadInputParameter(1); // first parameter issue
4537 return E_INVALIDARG;
4538 }
4539
4540 bool SubobjectSeen[D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MAX_VALID] = {};
4541 for (SIZE_T CurOffset = 0, SizeOfSubobject = 0; CurOffset < Desc.SizeInBytes; CurOffset += SizeOfSubobject)
4542 {
4543 BYTE* pStream = static_cast<BYTE*>(Desc.pPipelineStateSubobjectStream)+CurOffset;
4544 auto SubobjectType = *reinterpret_cast<D3D12_PIPELINE_STATE_SUBOBJECT_TYPE*>(pStream);
4545 if (SubobjectType < 0 || SubobjectType >= D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MAX_VALID)
4546 {
4547 pCallbacks->ErrorUnknownSubobject(SubobjectType);
4548 return E_INVALIDARG;
4549 }
4550 if (SubobjectSeen[D3DX12GetBaseSubobjectType(SubobjectType)])
4551 {
4552 pCallbacks->ErrorDuplicateSubobject(SubobjectType);
4553 return E_INVALIDARG; // disallow subobject duplicates in a stream
4554 }
4555 SubobjectSeen[SubobjectType] = true;
4556 switch (SubobjectType)
4557 {
4558 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_ROOT_SIGNATURE:
4559 pCallbacks->RootSignatureCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::pRootSignature)*>(pStream));
4560 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::pRootSignature);
4561 break;
4562 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VS:
4563 pCallbacks->VSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::VS)*>(pStream));
4564 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::VS);
4565 break;
4566 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PS:
4567 pCallbacks->PSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::PS)*>(pStream));
4568 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::PS);
4569 break;
4570 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DS:
4571 pCallbacks->DSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::DS)*>(pStream));
4572 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::DS);
4573 break;
4574 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_HS:
4575 pCallbacks->HSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::HS)*>(pStream));
4576 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::HS);
4577 break;
4578 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_GS:
4579 pCallbacks->GSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::GS)*>(pStream));
4580 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::GS);
4581 break;
4582 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CS:
4583 pCallbacks->CSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::CS)*>(pStream));
4584 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::CS);
4585 break;
4586 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_AS:
4587 pCallbacks->ASCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM2::AS)*>(pStream));
4588 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM2::AS);
4589 break;
4590 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MS:
4591 pCallbacks->MSCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM2::MS)*>(pStream));
4592 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM2::MS);
4593 break;
4594 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_STREAM_OUTPUT:
4595 pCallbacks->StreamOutputCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::StreamOutput)*>(pStream));
4596 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::StreamOutput);
4597 break;
4598 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_BLEND:
4599 pCallbacks->BlendStateCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::BlendState)*>(pStream));
4600 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::BlendState);
4601 break;
4602 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_MASK:
4603 pCallbacks->SampleMaskCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::SampleMask)*>(pStream));
4604 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::SampleMask);
4605 break;
4606 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER:
4607 pCallbacks->RasterizerStateCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::RasterizerState)*>(pStream));
4608 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::RasterizerState);
4609 break;
4610#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
4611 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER1:
4612 pCallbacks->RasterizerState1Cb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM4::RasterizerState)*>(pStream));
4613 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM4::RasterizerState);
4614 break;
4615#endif
4616#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
4617 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER2:
4618 pCallbacks->RasterizerState2Cb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM5::RasterizerState)*>(pStream));
4619 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM5::RasterizerState);
4620 break;
4621#endif
4622 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL:
4623 pCallbacks->DepthStencilStateCb(*reinterpret_cast<CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL*>(pStream));
4624 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL);
4625 break;
4626 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL1:
4627 pCallbacks->DepthStencilState1Cb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::DepthStencilState)*>(pStream));
4628 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::DepthStencilState);
4629 break;
4630#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
4631 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL2:
4632 pCallbacks->DepthStencilState2Cb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM3::DepthStencilState)*>(pStream));
4633 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM3::DepthStencilState);
4634 break;
4635#endif
4636 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_INPUT_LAYOUT:
4637 pCallbacks->InputLayoutCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::InputLayout)*>(pStream));
4638 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::InputLayout);
4639 break;
4640 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_IB_STRIP_CUT_VALUE:
4641 pCallbacks->IBStripCutValueCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::IBStripCutValue)*>(pStream));
4642 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::IBStripCutValue);
4643 break;
4644 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY:
4645 pCallbacks->PrimitiveTopologyTypeCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::PrimitiveTopologyType)*>(pStream));
4646 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::PrimitiveTopologyType);
4647 break;
4648 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RENDER_TARGET_FORMATS:
4649 pCallbacks->RTVFormatsCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::RTVFormats)*>(pStream));
4650 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::RTVFormats);
4651 break;
4652 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL_FORMAT:
4653 pCallbacks->DSVFormatCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::DSVFormat)*>(pStream));
4654 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::DSVFormat);
4655 break;
4656 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_DESC:
4657 pCallbacks->SampleDescCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::SampleDesc)*>(pStream));
4658 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::SampleDesc);
4659 break;
4660 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_NODE_MASK:
4661 pCallbacks->NodeMaskCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::NodeMask)*>(pStream));
4662 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::NodeMask);
4663 break;
4664 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CACHED_PSO:
4665 pCallbacks->CachedPSOCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::CachedPSO)*>(pStream));
4666 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::CachedPSO);
4667 break;
4668 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_FLAGS:
4669 pCallbacks->FlagsCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM::Flags)*>(pStream));
4670 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::Flags);
4671 break;
4672 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VIEW_INSTANCING:
4673 pCallbacks->ViewInstancingCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM1::ViewInstancingDesc)*>(pStream));
4674 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM1::ViewInstancingDesc);
4675 break;
4676#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 618)
4677 case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SERIALIZED_ROOT_SIGNATURE:
4678 pCallbacks->SerializedRootSignatureCb(*reinterpret_cast<decltype(CD3DX12_PIPELINE_STATE_STREAM6::SerializedRootSignature)*>(pStream));
4679 SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM6::SerializedRootSignature);
4680 break;
4681#endif
4682 default:
4683 pCallbacks->ErrorUnknownSubobject(SubobjectType);
4684 return E_INVALIDARG;
4685 }
4686 }
4687#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 613)
4688 pCallbacks->FinalizeCb();
4689#endif
4690
4691 return S_OK;
4692}
4693
4694//------------------------------------------------------------------------------------------------
4695#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)
4696inline bool operator==(const D3D12_RENDER_PASS_BEGINNING_ACCESS_PRESERVE_LOCAL_PARAMETERS& a, const D3D12_RENDER_PASS_ENDING_ACCESS_PRESERVE_LOCAL_PARAMETERS& b) noexcept
4697{
4698 return ((a.AdditionalWidth == b.AdditionalWidth) && (a.AdditionalHeight == b.AdditionalHeight));
4699}
4700
4701inline bool operator==(const D3D12_RENDER_PASS_BEGINNING_ACCESS_PRESERVE_LOCAL_PARAMETERS& a, const D3D12_RENDER_PASS_BEGINNING_ACCESS_PRESERVE_LOCAL_PARAMETERS& b) noexcept
4702{
4703 return ((a.AdditionalWidth == b.AdditionalWidth) && (a.AdditionalHeight == b.AdditionalHeight));
4704}
4705
4706inline bool operator==(const D3D12_RENDER_PASS_ENDING_ACCESS_PRESERVE_LOCAL_PARAMETERS& a, const D3D12_RENDER_PASS_ENDING_ACCESS_PRESERVE_LOCAL_PARAMETERS& b) noexcept
4707{
4708 return ((a.AdditionalWidth == b.AdditionalWidth) && (a.AdditionalHeight == b.AdditionalHeight));
4709}
4710#endif
4711
4712inline bool operator==( const D3D12_RENDER_PASS_BEGINNING_ACCESS_CLEAR_PARAMETERS &a, const D3D12_RENDER_PASS_BEGINNING_ACCESS_CLEAR_PARAMETERS &b) noexcept
4713{
4714 return a.ClearValue == b.ClearValue;
4715}
4716
4717inline bool operator==( const D3D12_RENDER_PASS_ENDING_ACCESS_RESOLVE_PARAMETERS &a, const D3D12_RENDER_PASS_ENDING_ACCESS_RESOLVE_PARAMETERS &b) noexcept
4718{
4719 if (a.pSrcResource != b.pSrcResource) return false;
4720 if (a.pDstResource != b.pDstResource) return false;
4721 if (a.SubresourceCount != b.SubresourceCount) return false;
4722 if (a.Format != b.Format) return false;
4723 if (a.ResolveMode != b.ResolveMode) return false;
4724 if (a.PreserveResolveSource != b.PreserveResolveSource) return false;
4725 return true;
4726}
4727
4728inline bool operator==( const D3D12_RENDER_PASS_BEGINNING_ACCESS &a, const D3D12_RENDER_PASS_BEGINNING_ACCESS &b) noexcept
4729{
4730 if (a.Type != b.Type) return false;
4731 switch (a.Type)
4732 {
4733 case D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_CLEAR:
4734 if (!(a.Clear == b.Clear)) return false;
4735 break;
4736#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)
4737 case D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_PRESERVE_LOCAL_RENDER:
4738 case D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_PRESERVE_LOCAL_SRV:
4739 case D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_PRESERVE_LOCAL_UAV:
4740 if (!(a.PreserveLocal == b.PreserveLocal)) return false;
4741 break;
4742#endif
4743 default:
4744 break;
4745 }
4746 return true;
4747}
4748
4749inline bool operator==(const D3D12_RENDER_PASS_ENDING_ACCESS& a, const D3D12_RENDER_PASS_ENDING_ACCESS& b) noexcept
4750{
4751 if (a.Type != b.Type) return false;
4752 switch (a.Type)
4753 {
4754 case D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_RESOLVE:
4755 if (!(a.Resolve == b.Resolve)) return false;
4756 break;
4757#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)
4758 case D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE_LOCAL_RENDER:
4759 case D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE_LOCAL_SRV:
4760 case D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE_LOCAL_UAV:
4761 if (!(a.PreserveLocal == b.PreserveLocal)) return false;
4762 break;
4763#endif
4764 default:
4765 break;
4766 }
4767
4768 return true;
4769}
4770
4771inline bool operator==( const D3D12_RENDER_PASS_RENDER_TARGET_DESC &a, const D3D12_RENDER_PASS_RENDER_TARGET_DESC &b) noexcept
4772{
4773 if (a.cpuDescriptor.ptr != b.cpuDescriptor.ptr) return false;
4774 if (!(a.BeginningAccess == b.BeginningAccess)) return false;
4775 if (!(a.EndingAccess == b.EndingAccess)) return false;
4776 return true;
4777}
4778inline bool operator==( const D3D12_RENDER_PASS_DEPTH_STENCIL_DESC &a, const D3D12_RENDER_PASS_DEPTH_STENCIL_DESC &b) noexcept
4779{
4780 if (a.cpuDescriptor.ptr != b.cpuDescriptor.ptr) return false;
4781 if (!(a.DepthBeginningAccess == b.DepthBeginningAccess)) return false;
4782 if (!(a.StencilBeginningAccess == b.StencilBeginningAccess)) return false;
4783 if (!(a.DepthEndingAccess == b.DepthEndingAccess)) return false;
4784 if (!(a.StencilEndingAccess == b.StencilEndingAccess)) return false;
4785 return true;
4786}
4787
4788
4789#ifndef D3DX12_NO_STATE_OBJECT_HELPERS
4790
4791//================================================================================================
4792// D3DX12 State Object Creation Helpers
4793//
4794// Helper classes for creating new style state objects out of an arbitrary set of subobjects.
4795// Uses STL
4796//
4797// Start by instantiating CD3DX12_STATE_OBJECT_DESC (see its public methods).
4798// One of its methods is CreateSubobject(), which has a comment showing a couple of options for
4799// defining subobjects using the helper classes for each subobject (CD3DX12_DXIL_LIBRARY_SUBOBJECT
4800// etc.). The subobject helpers each have methods specific to the subobject for configuring its
4801// contents.
4802//
4803//================================================================================================
4804#include <list>
4805#include <forward_list>
4806#include <vector>
4807#include <memory>
4808#include <string>
4809#include <vector>
4810#ifndef D3DX12_USE_ATL
4811#include <wrl/client.h>
4812#define D3DX12_COM_PTR Microsoft::WRL::ComPtr
4813#define D3DX12_COM_PTR_GET(x) x.Get()
4814#define D3DX12_COM_PTR_ADDRESSOF(x) x.GetAddressOf()
4815#else
4816#include <atlbase.h>
4817#define D3DX12_COM_PTR ATL::CComPtr
4818#define D3DX12_COM_PTR_GET(x) x.p
4819#define D3DX12_COM_PTR_ADDRESSOF(x) &x.p
4820#endif
4821
4822//------------------------------------------------------------------------------------------------
4823class CD3DX12_STATE_OBJECT_DESC
4824{
4825public:
4826 CD3DX12_STATE_OBJECT_DESC() noexcept
4827 {
4828 Init(D3D12_STATE_OBJECT_TYPE_COLLECTION);
4829 }
4830 CD3DX12_STATE_OBJECT_DESC(D3D12_STATE_OBJECT_TYPE Type) noexcept
4831 {
4832 Init(Type);
4833 }
4834 void SetStateObjectType(D3D12_STATE_OBJECT_TYPE Type) noexcept { m_Desc.Type = Type; }
4835 CD3DX12_STATE_OBJECT_DESC(const CD3DX12_STATE_OBJECT_DESC& other) = delete;
4836 CD3DX12_STATE_OBJECT_DESC& operator=(const CD3DX12_STATE_OBJECT_DESC& other) = delete;
4837 CD3DX12_STATE_OBJECT_DESC(CD3DX12_STATE_OBJECT_DESC&& other) = default;
4838 CD3DX12_STATE_OBJECT_DESC& operator=(CD3DX12_STATE_OBJECT_DESC&& other) = default;
4839 operator const D3D12_STATE_OBJECT_DESC& ()
4840 {
4841#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 612)
4842 m_RepointedSubobjectVectors.clear();
4843 m_RepointedPrograms.clear();
4844#endif
4845 m_RepointedAssociations.clear();
4846 m_SubobjectArray.clear();
4847 m_SubobjectArray.reserve(m_Desc.NumSubobjects);
4848 // Flatten subobjects into an array (each flattened subobject still has a
4849 // member that's a pointer to its desc that's not flattened)
4850 for (auto Iter = m_SubobjectList.begin();
4851 Iter != m_SubobjectList.end(); Iter++)
4852 {
4853 m_SubobjectArray.push_back(*Iter);
4854 // Store new location in array so we can redirect pointers contained in subobjects
4855 Iter->pSubobjectArrayLocation = &m_SubobjectArray.back();
4856 }
4857 // For subobjects with pointer fields, create a new copy of those subobject definitions
4858 // with fixed pointers
4859 for (UINT i = 0; i < m_Desc.NumSubobjects; i++)
4860 {
4861 if (m_SubobjectArray[i].Type == D3D12_STATE_SUBOBJECT_TYPE_SUBOBJECT_TO_EXPORTS_ASSOCIATION)
4862 {
4863 auto pOriginalSubobjectAssociation =
4864 static_cast<const D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION*>(m_SubobjectArray[i].pDesc);
4865 D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION Repointed = *pOriginalSubobjectAssociation;
4866 auto pWrapper =
4867 static_cast<const SUBOBJECT_WRAPPER*>(pOriginalSubobjectAssociation->pSubobjectToAssociate);
4868 Repointed.pSubobjectToAssociate = pWrapper->pSubobjectArrayLocation;
4869 m_RepointedAssociations.push_back(Repointed);
4870 m_SubobjectArray[i].pDesc = &m_RepointedAssociations.back();
4871 }
4872#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 612)
4873 else if (m_SubobjectArray[i].Type == D3D12_STATE_SUBOBJECT_TYPE_GENERIC_PROGRAM)
4874 {
4875 auto originalGenericProgramDesc =
4876 static_cast<const D3D12_GENERIC_PROGRAM_DESC*>(m_SubobjectArray[i].pDesc);
4877 D3D12_GENERIC_PROGRAM_DESC Repointed = *originalGenericProgramDesc;
4878 if (originalGenericProgramDesc->NumSubobjects > 0)
4879 {
4880 m_RepointedSubobjectVectors.emplace_back(std::vector<const D3D12_STATE_SUBOBJECT*>());
4881 std::vector<D3D12_STATE_SUBOBJECT const*>& repointedGenericProgramSubobjects = m_RepointedSubobjectVectors.back();
4882 repointedGenericProgramSubobjects.resize(originalGenericProgramDesc->NumSubobjects);
4883 for (UINT s = 0; s < originalGenericProgramDesc->NumSubobjects; s++)
4884 {
4885 auto pWrapper =
4886 static_cast<const SUBOBJECT_WRAPPER*>(originalGenericProgramDesc->ppSubobjects[s]);
4887 repointedGenericProgramSubobjects[s] = pWrapper->pSubobjectArrayLocation;
4888 }
4889 // Below: using ugly way to get pointer in case .data() is not defined
4890 Repointed.ppSubobjects = &repointedGenericProgramSubobjects[0];
4891 }
4892 m_RepointedPrograms.push_back(Repointed);
4893 m_SubobjectArray[i].pDesc = &m_RepointedPrograms.back();
4894 }
4895#endif
4896 }
4897 // Below: using ugly way to get pointer in case .data() is not defined
4898 m_Desc.pSubobjects = m_Desc.NumSubobjects ? &m_SubobjectArray[0] : nullptr;
4899 return m_Desc;
4900 }
4901 operator const D3D12_STATE_OBJECT_DESC* ()
4902 {
4903 // Cast calls the above final preparation work
4904 return &static_cast<const D3D12_STATE_OBJECT_DESC&>(*this);
4905 }
4906
4907 // CreateSubobject creates a sububject helper (e.g. CD3DX12_HIT_GROUP_SUBOBJECT)
4908 // whose lifetime is owned by this class.
4909 // e.g.
4910 //
4911 // CD3DX12_STATE_OBJECT_DESC Collection1(D3D12_STATE_OBJECT_TYPE_COLLECTION);
4912 // auto Lib0 = Collection1.CreateSubobject<CD3DX12_DXIL_LIBRARY_SUBOBJECT>();
4913 // Lib0->SetDXILLibrary(&pMyAppDxilLibs[0]);
4914 // Lib0->DefineExport(L"rayGenShader0"); // in practice these export listings might be
4915 // // data/engine driven
4916 // etc.
4917 //
4918 // Alternatively, users can instantiate sububject helpers explicitly, such as via local
4919 // variables instead, passing the state object desc that should point to it into the helper
4920 // constructor (or call mySubobjectHelper.AddToStateObject(Collection1)).
4921 // In this alternative scenario, the user must keep the subobject alive as long as the state
4922 // object it is associated with is alive, else its pointer references will be stale.
4923 // e.g.
4924 //
4925 // CD3DX12_STATE_OBJECT_DESC RaytracingState2(D3D12_STATE_OBJECT_TYPE_RAYTRACING_PIPELINE);
4926 // CD3DX12_DXIL_LIBRARY_SUBOBJECT LibA(RaytracingState2);
4927 // LibA.SetDXILLibrary(&pMyAppDxilLibs[4]); // not manually specifying exports
4928 // // - meaning all exports in the libraries
4929 // // are exported
4930 // etc.
4931
4932 template<typename T>
4933 T* CreateSubobject()
4934 {
4935 T* pSubobject = new T(*this);
4936 m_OwnedSubobjectHelpers.emplace_back(pSubobject);
4937 return pSubobject;
4938 }
4939
4940 template<typename T, typename U>
4941 T* CreateSubobject(U&& arg)
4942 {
4943 T* pSubobject = new T(std::forward<U>(arg), *this);
4944 m_OwnedSubobjectHelpers.emplace_back(pSubobject);
4945 return pSubobject;
4946 }
4947
4948private:
4949 D3D12_STATE_SUBOBJECT* TrackSubobject(D3D12_STATE_SUBOBJECT_TYPE Type, void* pDesc)
4950 {
4951 SUBOBJECT_WRAPPER Subobject;
4952 Subobject.pSubobjectArrayLocation = nullptr;
4953 Subobject.Type = Type;
4954 Subobject.pDesc = pDesc;
4955 m_SubobjectList.push_back(Subobject);
4956 m_Desc.NumSubobjects++;
4957 return &m_SubobjectList.back();
4958 }
4959 void Init(D3D12_STATE_OBJECT_TYPE Type) noexcept
4960 {
4961 SetStateObjectType(Type);
4962 m_Desc.pSubobjects = nullptr;
4963 m_Desc.NumSubobjects = 0;
4964 m_SubobjectList.clear();
4965 m_SubobjectArray.clear();
4966 m_RepointedAssociations.clear();
4967#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 612)
4968 m_RepointedSubobjectVectors.clear();
4969 m_RepointedPrograms.clear();
4970#endif
4971 }
4972 typedef struct SUBOBJECT_WRAPPER : public D3D12_STATE_SUBOBJECT
4973 {
4974 D3D12_STATE_SUBOBJECT* pSubobjectArrayLocation; // new location when flattened into array
4975 // for repointing pointers in subobjects
4976 } SUBOBJECT_WRAPPER;
4977 D3D12_STATE_OBJECT_DESC m_Desc;
4978 std::list<SUBOBJECT_WRAPPER> m_SubobjectList; // Pointers to list nodes handed out so
4979 // these can be edited live
4980 std::vector<D3D12_STATE_SUBOBJECT> m_SubobjectArray; // Built at the end, copying list contents
4981
4982 std::list<D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION>
4983 m_RepointedAssociations; // subobject type that contains pointers to other subobjects,
4984 // repointed to flattened array
4985
4986#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 612)
4987 std::list<std::vector<D3D12_STATE_SUBOBJECT const*>>
4988 m_RepointedSubobjectVectors;
4989 std::list<D3D12_GENERIC_PROGRAM_DESC>
4990 m_RepointedPrograms;
4991#endif
4992
4993 template<typename CStr, typename StdStr>
4994 class StringContainer
4995 {
4996 public:
4997 CStr LocalCopy(CStr string, bool bSingleString = false)
4998 {
4999 if (string)
5000 {
5001 if (bSingleString)
5002 {
5003 m_Strings.clear();
5004 m_Strings.push_back(string);
5005 }
5006 else
5007 {
5008 m_Strings.push_back(string);
5009 }
5010 return m_Strings.back().c_str();
5011 }
5012 else
5013 {
5014 return nullptr;
5015 }
5016 }
5017 void clear() noexcept { m_Strings.clear(); }
5018 private:
5019 std::list<StdStr> m_Strings;
5020 };
5021
5022public:
5023 class SUBOBJECT_HELPER_BASE
5024 {
5025 public:
5026 SUBOBJECT_HELPER_BASE() noexcept { Init(); }
5027 virtual ~SUBOBJECT_HELPER_BASE() = default;
5028 virtual D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept = 0;
5029 SUBOBJECT_HELPER_BASE(const SUBOBJECT_HELPER_BASE& other) = delete;
5030 SUBOBJECT_HELPER_BASE& operator=(const SUBOBJECT_HELPER_BASE& other) = delete;
5031 SUBOBJECT_HELPER_BASE(SUBOBJECT_HELPER_BASE&& other) = default;
5032 SUBOBJECT_HELPER_BASE& operator=(SUBOBJECT_HELPER_BASE&& other) = default;
5033 void AddToStateObject(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5034 {
5035 m_pSubobject = ContainingStateObject.TrackSubobject(Type(), Data());
5036 }
5037 operator const D3D12_STATE_SUBOBJECT& () const noexcept { return *m_pSubobject; }
5038 protected:
5039 virtual void* Data() noexcept = 0;
5040 void Init() noexcept { m_pSubobject = nullptr; }
5041 D3D12_STATE_SUBOBJECT* m_pSubobject;
5042 };
5043
5044private:
5045 std::list<std::unique_ptr<SUBOBJECT_HELPER_BASE>> m_OwnedSubobjectHelpers;
5046
5047 friend class CD3DX12_DXIL_LIBRARY_SUBOBJECT;
5048 friend class CD3DX12_EXISTING_COLLECTION_SUBOBJECT;
5049 friend class CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT;
5050 friend class CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION;
5051 friend class CD3DX12_HIT_GROUP_SUBOBJECT;
5052 friend class CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT;
5053 friend class CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT;
5054 friend class CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT;
5055 friend class CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT;
5056 friend class CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT;
5057 friend class CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT;
5058 friend class CD3DX12_NODE_MASK_SUBOBJECT;
5059 //TODO: SDK Version check should include all the newly added subobject type for the public release.
5060 // The SDK version check will be changed based on when we release state objects.
5061#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 612)
5062 friend class CD3DX12_GENERIC_PROGRAM_SUBOBJECT;
5063 friend class CD3DX12_WORK_GRAPH_SUBOBJECT;
5064 friend class CD3DX12_STREAM_OUTPUT_SUBOBJECT;
5065 friend class CD3DX12_BLEND_SUBOBJECT;
5066 friend class CD3DX12_RASTERIZER_SUBOBJECT;
5067 friend class CD3DX12_DEPTH_STENCIL2_SUBOBJECT;
5068 friend class CD3DX12_INPUT_LAYOUT_SUBOBJECT;
5069 friend class CD3DX12_IB_STRIP_CUT_VALUE_SUBOBJECT;
5070 friend class CD3DX12_PRIMITIVE_TOPOLOGY_SUBOBJECT;
5071 friend class CD3DX12_RENDER_TARGET_FORMATS_SUBOBJECT;
5072 friend class CD3DX12_DEPTH_STENCIL_FORMAT_SUBOBJECT;
5073 friend class CD3DX12_SAMPLE_DESC_SUBOBJECT;
5074 friend class CD3DX12_FLAGS_SUBOBJECT;
5075 friend class CD3DX12_VIEW_INSTANCING_SUBOBJECT;
5076 friend class CD3DX12_DEPTH_STENCIL_SUBOBJECT;
5077 friend class CD3DX12_DEPTH_STENCIL1_SUBOBJECT;
5078 friend class CD3DX12_SAMPLE_MASK_SUBOBJECT;
5079 friend class CD3DX12_NODE_OUTPUT_OVERRIDES;
5080 friend class CD3DX12_NODE_HELPER_BASE;
5081 friend class CD3DX12_SHADER_NODE;
5082 friend class CD3DX12_BROADCASTING_LAUNCH_NODE_OVERRIDES;
5083 friend class CD3DX12_COALESCING_LAUNCH_NODE_OVERRIDES;
5084 friend class CD3DX12_THREAD_LAUNCH_NODE_OVERRIDES;
5085 friend class CD3DX12_COMMON_COMPUTE_NODE_OVERRIDES;
5086#endif // D3D12_SDK_VERSION >= 612
5087#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 618)
5088 friend class CD3DX12_GLOBAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT;
5089 friend class CD3DX12_LOCAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT;
5090 friend class CD3DX12_COMPILER_EXISTING_COLLECTION_SUBOBJECT;
5091 friend class CD3DX12_EXISTING_COLLECTION_BY_KEY_SUBOBJECT;
5092#endif
5093};
5094
5095//------------------------------------------------------------------------------------------------
5096class CD3DX12_DXIL_LIBRARY_SUBOBJECT
5097 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
5098{
5099public:
5100 CD3DX12_DXIL_LIBRARY_SUBOBJECT() noexcept
5101 {
5102 Init();
5103 }
5104 CD3DX12_DXIL_LIBRARY_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5105 {
5106 Init();
5107 AddToStateObject(ContainingStateObject);
5108 }
5109 CD3DX12_DXIL_LIBRARY_SUBOBJECT(const CD3DX12_DXIL_LIBRARY_SUBOBJECT& other) = delete;
5110 CD3DX12_DXIL_LIBRARY_SUBOBJECT& operator=(const CD3DX12_DXIL_LIBRARY_SUBOBJECT& other) = delete;
5111 CD3DX12_DXIL_LIBRARY_SUBOBJECT(CD3DX12_DXIL_LIBRARY_SUBOBJECT&& other) = default;
5112 CD3DX12_DXIL_LIBRARY_SUBOBJECT& operator=(CD3DX12_DXIL_LIBRARY_SUBOBJECT&& other) = default;
5113 void SetDXILLibrary(const D3D12_SHADER_BYTECODE* pCode) noexcept
5114 {
5115 static const D3D12_SHADER_BYTECODE Default = {};
5116 m_Desc.DXILLibrary = pCode ? *pCode : Default;
5117 }
5118 void DefineExport(
5119 LPCWSTR Name,
5120 LPCWSTR ExportToRename = nullptr,
5121 D3D12_EXPORT_FLAGS Flags = D3D12_EXPORT_FLAG_NONE)
5122 {
5123 D3D12_EXPORT_DESC Export;
5124 Export.Name = m_Strings.LocalCopy(Name);
5125 Export.ExportToRename = m_Strings.LocalCopy(ExportToRename);
5126 Export.Flags = Flags;
5127 m_Exports.push_back(Export);
5128 m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined
5129 m_Desc.NumExports = static_cast<UINT>(m_Exports.size());
5130 }
5131 template<size_t N>
5132 void DefineExports(LPCWSTR(&Exports)[N])
5133 {
5134 for (UINT i = 0; i < N; i++)
5135 {
5136 DefineExport(Exports[i]);
5137 }
5138 }
5139 void DefineExports(const LPCWSTR* Exports, UINT N)
5140 {
5141 for (UINT i = 0; i < N; i++)
5142 {
5143 DefineExport(Exports[i]);
5144 }
5145 }
5146 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
5147 {
5148 return D3D12_STATE_SUBOBJECT_TYPE_DXIL_LIBRARY;
5149 }
5150 operator const D3D12_DXIL_LIBRARY_DESC&() const noexcept { return m_Desc; }
5151private:
5152 void Init() noexcept
5153 {
5154 SUBOBJECT_HELPER_BASE::Init();
5155 m_Desc = {};
5156 m_Strings.clear();
5157 m_Exports.clear();
5158 }
5159 void* Data() noexcept override { return &m_Desc; }
5160 D3D12_DXIL_LIBRARY_DESC m_Desc;
5161 CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring> m_Strings;
5162 std::vector<D3D12_EXPORT_DESC> m_Exports;
5163};
5164
5165//------------------------------------------------------------------------------------------------
5166class CD3DX12_EXISTING_COLLECTION_SUBOBJECT
5167 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
5168{
5169public:
5170 CD3DX12_EXISTING_COLLECTION_SUBOBJECT() noexcept
5171 {
5172 Init();
5173 }
5174 CD3DX12_EXISTING_COLLECTION_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5175 {
5176 Init();
5177 AddToStateObject(ContainingStateObject);
5178 }
5179 CD3DX12_EXISTING_COLLECTION_SUBOBJECT(const CD3DX12_EXISTING_COLLECTION_SUBOBJECT& other) = delete;
5180 CD3DX12_EXISTING_COLLECTION_SUBOBJECT& operator=(const CD3DX12_EXISTING_COLLECTION_SUBOBJECT& other) = delete;
5181 CD3DX12_EXISTING_COLLECTION_SUBOBJECT(CD3DX12_EXISTING_COLLECTION_SUBOBJECT&& other) = default;
5182 CD3DX12_EXISTING_COLLECTION_SUBOBJECT& operator=(CD3DX12_EXISTING_COLLECTION_SUBOBJECT&& other) = default;
5183 void SetExistingCollection(ID3D12StateObject*pExistingCollection) noexcept
5184 {
5185 m_Desc.pExistingCollection = pExistingCollection;
5186 m_CollectionRef = pExistingCollection;
5187 }
5188 void DefineExport(
5189 LPCWSTR Name,
5190 LPCWSTR ExportToRename = nullptr,
5191 D3D12_EXPORT_FLAGS Flags = D3D12_EXPORT_FLAG_NONE)
5192 {
5193 D3D12_EXPORT_DESC Export;
5194 Export.Name = m_Strings.LocalCopy(Name);
5195 Export.ExportToRename = m_Strings.LocalCopy(ExportToRename);
5196 Export.Flags = Flags;
5197 m_Exports.push_back(Export);
5198 m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined
5199 m_Desc.NumExports = static_cast<UINT>(m_Exports.size());
5200 }
5201 template<size_t N>
5202 void DefineExports(LPCWSTR(&Exports)[N])
5203 {
5204 for (UINT i = 0; i < N; i++)
5205 {
5206 DefineExport(Exports[i]);
5207 }
5208 }
5209 void DefineExports(const LPCWSTR* Exports, UINT N)
5210 {
5211 for (UINT i = 0; i < N; i++)
5212 {
5213 DefineExport(Exports[i]);
5214 }
5215 }
5216 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
5217 {
5218 return D3D12_STATE_SUBOBJECT_TYPE_EXISTING_COLLECTION;
5219 }
5220 operator const D3D12_EXISTING_COLLECTION_DESC&() const noexcept { return m_Desc; }
5221private:
5222 void Init() noexcept
5223 {
5224 SUBOBJECT_HELPER_BASE::Init();
5225 m_Desc = {};
5226 m_CollectionRef = nullptr;
5227 m_Strings.clear();
5228 m_Exports.clear();
5229 }
5230 void* Data() noexcept override { return &m_Desc; }
5231 D3D12_EXISTING_COLLECTION_DESC m_Desc;
5232 D3DX12_COM_PTR<ID3D12StateObject> m_CollectionRef;
5233 CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring> m_Strings;
5234 std::vector<D3D12_EXPORT_DESC> m_Exports;
5235};
5236
5237//------------------------------------------------------------------------------------------------
5238class CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT
5239 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
5240{
5241public:
5242 CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT() noexcept
5243 {
5244 Init();
5245 }
5246 CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5247 {
5248 Init();
5249 AddToStateObject(ContainingStateObject);
5250 }
5251 CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT(const CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT& other) = delete;
5252 CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT& operator=(const CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT& other) = delete;
5253 CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT(CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT&& other) = default;
5254 CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT& operator=(CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT&& other) = default;
5255 void SetSubobjectToAssociate(const D3D12_STATE_SUBOBJECT& SubobjectToAssociate) noexcept
5256 {
5257 m_Desc.pSubobjectToAssociate = &SubobjectToAssociate;
5258 }
5259 void AddExport(LPCWSTR Export)
5260 {
5261 m_Desc.NumExports++;
5262 m_Exports.push_back(m_Strings.LocalCopy(Export));
5263 m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined
5264 }
5265 template<size_t N>
5266 void AddExports(LPCWSTR (&Exports)[N])
5267 {
5268 for (UINT i = 0; i < N; i++)
5269 {
5270 AddExport(Exports[i]);
5271 }
5272 }
5273 void AddExports(const LPCWSTR* Exports, UINT N)
5274 {
5275 for (UINT i = 0; i < N; i++)
5276 {
5277 AddExport(Exports[i]);
5278 }
5279 }
5280 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
5281 {
5282 return D3D12_STATE_SUBOBJECT_TYPE_SUBOBJECT_TO_EXPORTS_ASSOCIATION;
5283 }
5284 operator const D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION&() const noexcept { return m_Desc; }
5285private:
5286 void Init() noexcept
5287 {
5288 SUBOBJECT_HELPER_BASE::Init();
5289 m_Desc = {};
5290 m_Strings.clear();
5291 m_Exports.clear();
5292 }
5293 void* Data() noexcept override { return &m_Desc; }
5294 D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION m_Desc;
5295 CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring> m_Strings;
5296 std::vector<LPCWSTR> m_Exports;
5297};
5298
5299//------------------------------------------------------------------------------------------------
5300class CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION
5301 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
5302{
5303public:
5304 CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION() noexcept
5305 {
5306 Init();
5307 }
5308 CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5309 {
5310 Init();
5311 AddToStateObject(ContainingStateObject);
5312 }
5313 CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION(const CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION& other) = delete;
5314 CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION& operator=(const CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION& other) = delete;
5315 CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION(CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION&& other) = default;
5316 CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION& operator=(CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION&& other) = default;
5317 void SetSubobjectNameToAssociate(LPCWSTR SubobjectToAssociate)
5318 {
5319 m_Desc.SubobjectToAssociate = m_SubobjectName.LocalCopy(SubobjectToAssociate, true);
5320 }
5321 void AddExport(LPCWSTR Export)
5322 {
5323 m_Desc.NumExports++;
5324 m_Exports.push_back(m_Strings.LocalCopy(Export));
5325 m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined
5326 }
5327 template<size_t N>
5328 void AddExports(LPCWSTR (&Exports)[N])
5329 {
5330 for (UINT i = 0; i < N; i++)
5331 {
5332 AddExport(Exports[i]);
5333 }
5334 }
5335 void AddExports(const LPCWSTR* Exports, UINT N)
5336 {
5337 for (UINT i = 0; i < N; i++)
5338 {
5339 AddExport(Exports[i]);
5340 }
5341 }
5342 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
5343 {
5344 return D3D12_STATE_SUBOBJECT_TYPE_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION;
5345 }
5346 operator const D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION&() const noexcept { return m_Desc; }
5347private:
5348 void Init() noexcept
5349 {
5350 SUBOBJECT_HELPER_BASE::Init();
5351 m_Desc = {};
5352 m_Strings.clear();
5353 m_SubobjectName.clear();
5354 m_Exports.clear();
5355 }
5356 void* Data() noexcept override { return &m_Desc; }
5357 D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION m_Desc;
5358 CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring> m_Strings;
5359 CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring> m_SubobjectName;
5360 std::vector<LPCWSTR> m_Exports;
5361};
5362
5363//------------------------------------------------------------------------------------------------
5364class CD3DX12_HIT_GROUP_SUBOBJECT
5365 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
5366{
5367public:
5368 CD3DX12_HIT_GROUP_SUBOBJECT() noexcept
5369 {
5370 Init();
5371 }
5372 CD3DX12_HIT_GROUP_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5373 {
5374 Init();
5375 AddToStateObject(ContainingStateObject);
5376 }
5377 CD3DX12_HIT_GROUP_SUBOBJECT(const CD3DX12_HIT_GROUP_SUBOBJECT& other) = delete;
5378 CD3DX12_HIT_GROUP_SUBOBJECT& operator=(const CD3DX12_HIT_GROUP_SUBOBJECT& other) = delete;
5379 CD3DX12_HIT_GROUP_SUBOBJECT(CD3DX12_HIT_GROUP_SUBOBJECT&& other) = default;
5380 CD3DX12_HIT_GROUP_SUBOBJECT& operator=(CD3DX12_HIT_GROUP_SUBOBJECT&& other) = default;
5381 void SetHitGroupExport(LPCWSTR exportName)
5382 {
5383 m_Desc.HitGroupExport = m_Strings[0].LocalCopy(exportName, true);
5384 }
5385 void SetHitGroupType(D3D12_HIT_GROUP_TYPE Type) noexcept { m_Desc.Type = Type; }
5386 void SetAnyHitShaderImport(LPCWSTR importName)
5387 {
5388 m_Desc.AnyHitShaderImport = m_Strings[1].LocalCopy(importName, true);
5389 }
5390 void SetClosestHitShaderImport(LPCWSTR importName)
5391 {
5392 m_Desc.ClosestHitShaderImport = m_Strings[2].LocalCopy(importName, true);
5393 }
5394 void SetIntersectionShaderImport(LPCWSTR importName)
5395 {
5396 m_Desc.IntersectionShaderImport = m_Strings[3].LocalCopy(importName, true);
5397 }
5398 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
5399 {
5400 return D3D12_STATE_SUBOBJECT_TYPE_HIT_GROUP;
5401 }
5402 operator const D3D12_HIT_GROUP_DESC&() const noexcept { return m_Desc; }
5403private:
5404 void Init() noexcept
5405 {
5406 SUBOBJECT_HELPER_BASE::Init();
5407 m_Desc = {};
5408 for (UINT i = 0; i < m_NumStrings; i++)
5409 {
5410 m_Strings[i].clear();
5411 }
5412 }
5413 void* Data() noexcept override { return &m_Desc; }
5414 D3D12_HIT_GROUP_DESC m_Desc;
5415 static constexpr UINT m_NumStrings = 4;
5416 CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring>
5417 m_Strings[m_NumStrings]; // one string for every entrypoint name
5418};
5419
5420//------------------------------------------------------------------------------------------------
5421class CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT
5422 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
5423{
5424public:
5425 CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT() noexcept
5426 : m_Desc({})
5427 {
5428 Init();
5429 }
5430 CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5431 : m_Desc({})
5432 {
5433 Init();
5434 AddToStateObject(ContainingStateObject);
5435 }
5436 CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT(const D3D12_RAYTRACING_SHADER_CONFIG &desc)
5437 : m_Desc(desc)
5438 {
5439 Init();
5440 }
5441 CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT(const D3D12_RAYTRACING_SHADER_CONFIG &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5442 : m_Desc(desc)
5443 {
5444 Init();
5445 AddToStateObject(ContainingStateObject);
5446 }
5447 CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT(const CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT& other) = delete;
5448 CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT& operator=(const CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT& other) = delete;
5449 CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT(CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT&& other) = default;
5450 CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT& operator=(CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT&& other) = default;
5451 void Config(UINT MaxPayloadSizeInBytes, UINT MaxAttributeSizeInBytes) noexcept
5452 {
5453 m_Desc.MaxPayloadSizeInBytes = MaxPayloadSizeInBytes;
5454 m_Desc.MaxAttributeSizeInBytes = MaxAttributeSizeInBytes;
5455 }
5456 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
5457 {
5458 return D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_SHADER_CONFIG;
5459 }
5460 operator const D3D12_RAYTRACING_SHADER_CONFIG&() const noexcept { return m_Desc; }
5461 operator D3D12_RAYTRACING_SHADER_CONFIG&() noexcept { return m_Desc; }
5462private:
5463 void Init() noexcept
5464 {
5465 SUBOBJECT_HELPER_BASE::Init();
5466 }
5467 void* Data() noexcept override { return &m_Desc; }
5468 D3D12_RAYTRACING_SHADER_CONFIG m_Desc;
5469};
5470
5471//------------------------------------------------------------------------------------------------
5472class CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT
5473 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
5474{
5475public:
5476 CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT() noexcept
5477 : m_Desc({})
5478 {
5479 Init();
5480 }
5481 CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5482 : m_Desc({})
5483 {
5484 Init();
5485 AddToStateObject(ContainingStateObject);
5486 }
5487 CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT(const D3D12_RAYTRACING_PIPELINE_CONFIG &desc)
5488 : m_Desc(desc)
5489 {
5490 Init();
5491 }
5492 CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT(const D3D12_RAYTRACING_PIPELINE_CONFIG &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5493 : m_Desc(desc)
5494 {
5495 Init();
5496 AddToStateObject(ContainingStateObject);
5497 }
5498 CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT(const CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT& other) = delete;
5499 CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT& operator=(const CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT& other) = delete;
5500 CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT(CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT&& other) = default;
5501 CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT& operator=(CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT&& other) = default;
5502 void Config(UINT MaxTraceRecursionDepth) noexcept
5503 {
5504 m_Desc.MaxTraceRecursionDepth = MaxTraceRecursionDepth;
5505 }
5506 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
5507 {
5508 return D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_PIPELINE_CONFIG;
5509 }
5510 operator const D3D12_RAYTRACING_PIPELINE_CONFIG&() const noexcept { return m_Desc; }
5511 operator D3D12_RAYTRACING_PIPELINE_CONFIG&() noexcept { return m_Desc; }
5512private:
5513 void Init() noexcept
5514 {
5515 SUBOBJECT_HELPER_BASE::Init();
5516 }
5517 void* Data() noexcept override { return &m_Desc; }
5518 D3D12_RAYTRACING_PIPELINE_CONFIG m_Desc;
5519};
5520
5521//------------------------------------------------------------------------------------------------
5522class CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT
5523 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
5524{
5525public:
5526 CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT() noexcept
5527 : m_Desc({})
5528 {
5529 Init();
5530 }
5531 CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5532 : m_Desc({})
5533 {
5534 Init();
5535 AddToStateObject(ContainingStateObject);
5536 }
5537 CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT(const D3D12_RAYTRACING_PIPELINE_CONFIG1 &desc)
5538 : m_Desc(desc)
5539 {
5540 Init();
5541 }
5542 CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT(const D3D12_RAYTRACING_PIPELINE_CONFIG1 &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5543 : m_Desc(desc)
5544 {
5545 Init();
5546 AddToStateObject(ContainingStateObject);
5547 }
5548 CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT(const CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT& other) = delete;
5549 CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT& operator=(const CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT& other) = delete;
5550 CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT(CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT&& other) = default;
5551 CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT& operator=(CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT&& other) = default;
5552 void Config(UINT MaxTraceRecursionDepth, D3D12_RAYTRACING_PIPELINE_FLAGS Flags) noexcept
5553 {
5554 m_Desc.MaxTraceRecursionDepth = MaxTraceRecursionDepth;
5555 m_Desc.Flags = Flags;
5556 }
5557 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
5558 {
5559 return D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_PIPELINE_CONFIG1;
5560 }
5561 operator const D3D12_RAYTRACING_PIPELINE_CONFIG1&() const noexcept { return m_Desc; }
5562 operator D3D12_RAYTRACING_PIPELINE_CONFIG1&() noexcept { return m_Desc; }
5563private:
5564 void Init() noexcept
5565 {
5566 SUBOBJECT_HELPER_BASE::Init();
5567 }
5568 void* Data() noexcept override { return &m_Desc; }
5569 D3D12_RAYTRACING_PIPELINE_CONFIG1 m_Desc;
5570};
5571
5572//------------------------------------------------------------------------------------------------
5573class CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT
5574 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
5575{
5576public:
5577 CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT() noexcept
5578 {
5579 Init();
5580 }
5581 CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5582 {
5583 Init();
5584 AddToStateObject(ContainingStateObject);
5585 }
5586 CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT(const CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT& other) = delete;
5587 CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT& operator=(const CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT& other) = delete;
5588 CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT(CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT&& other) = default;
5589 CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT& operator=(CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT&& other) = default;
5590 void SetRootSignature(ID3D12RootSignature* pRootSig) noexcept
5591 {
5592 m_pRootSig = pRootSig;
5593 }
5594 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
5595 {
5596 return D3D12_STATE_SUBOBJECT_TYPE_GLOBAL_ROOT_SIGNATURE;
5597 }
5598 operator ID3D12RootSignature*() const noexcept { return D3DX12_COM_PTR_GET(m_pRootSig); }
5599private:
5600 void Init() noexcept
5601 {
5602 SUBOBJECT_HELPER_BASE::Init();
5603 m_pRootSig = nullptr;
5604 }
5605 void* Data() noexcept override { return D3DX12_COM_PTR_ADDRESSOF(m_pRootSig); }
5606 D3DX12_COM_PTR<ID3D12RootSignature> m_pRootSig;
5607};
5608
5609
5610//------------------------------------------------------------------------------------------------
5611class CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT
5612 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
5613{
5614public:
5615 CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT() noexcept
5616 {
5617 Init();
5618 }
5619 CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5620 {
5621 Init();
5622 AddToStateObject(ContainingStateObject);
5623 }
5624 CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT(const CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT& other) = delete;
5625 CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT& operator=(const CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT& other) = delete;
5626 CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT(CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT&& other) = default;
5627 CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT& operator=(CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT&& other) = default;
5628 void SetRootSignature(ID3D12RootSignature* pRootSig) noexcept
5629 {
5630 m_pRootSig = pRootSig;
5631 }
5632 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
5633 {
5634 return D3D12_STATE_SUBOBJECT_TYPE_LOCAL_ROOT_SIGNATURE;
5635 }
5636 operator ID3D12RootSignature*() const noexcept { return D3DX12_COM_PTR_GET(m_pRootSig); }
5637private:
5638 void Init() noexcept
5639 {
5640 SUBOBJECT_HELPER_BASE::Init();
5641 m_pRootSig = nullptr;
5642 }
5643 void* Data() noexcept override { return D3DX12_COM_PTR_ADDRESSOF(m_pRootSig); }
5644 D3DX12_COM_PTR<ID3D12RootSignature> m_pRootSig;
5645};
5646
5647#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 618)
5648//------------------------------------------------------------------------------------------------
5649class CD3DX12_GLOBAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT
5650 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
5651{
5652public:
5653 CD3DX12_GLOBAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT() noexcept
5654 : m_Desc({})
5655 {
5656 Init();
5657 }
5658 CD3DX12_GLOBAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5659 : m_Desc({})
5660 {
5661 Init();
5662 AddToStateObject(ContainingStateObject);
5663 }
5664 CD3DX12_GLOBAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT(const CD3DX12_GLOBAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT& other) = delete;
5665 CD3DX12_GLOBAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT& operator=(const CD3DX12_GLOBAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT& other) = delete;
5666 CD3DX12_GLOBAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT(CD3DX12_GLOBAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT&& other) = default;
5667 CD3DX12_GLOBAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT& operator=(CD3DX12_GLOBAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT&& other) = default;
5668 void SetRootSignature(const D3D12_SERIALIZED_ROOT_SIGNATURE_DESC* pDesc) noexcept
5669 {
5670 if (pDesc)
5671 {
5672 m_Desc.Desc = {};
5673 m_Desc.Desc.pSerializedBlob = pDesc->pSerializedBlob;
5674 m_Desc.Desc.SerializedBlobSizeInBytes = pDesc->SerializedBlobSizeInBytes;
5675 }
5676 }
5677 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
5678 {
5679 return D3D12_STATE_SUBOBJECT_TYPE_GLOBAL_SERIALIZED_ROOT_SIGNATURE;
5680 }
5681 operator const D3D12_GLOBAL_SERIALIZED_ROOT_SIGNATURE&() const noexcept { return m_Desc; }
5682 operator D3D12_GLOBAL_SERIALIZED_ROOT_SIGNATURE&() noexcept { return m_Desc; }
5683private:
5684 void Init() noexcept
5685 {
5686 SUBOBJECT_HELPER_BASE::Init();
5687 m_Desc = {};
5688 }
5689 void* Data() noexcept override { return &m_Desc; }
5690 D3D12_GLOBAL_SERIALIZED_ROOT_SIGNATURE m_Desc;
5691};
5692
5693//------------------------------------------------------------------------------------------------
5694class CD3DX12_LOCAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT
5695 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
5696{
5697public:
5698 CD3DX12_LOCAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT() noexcept
5699 : m_Desc({})
5700 {
5701 Init();
5702 }
5703 CD3DX12_LOCAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5704 : m_Desc({})
5705 {
5706 Init();
5707 AddToStateObject(ContainingStateObject);
5708 }
5709 CD3DX12_LOCAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT(const CD3DX12_LOCAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT& other) = delete;
5710 CD3DX12_LOCAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT& operator=(const CD3DX12_LOCAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT& other) = delete;
5711 CD3DX12_LOCAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT(CD3DX12_LOCAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT&& other) = default;
5712 CD3DX12_LOCAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT& operator=(CD3DX12_LOCAL_SERIALIZED_ROOT_SIGNATURE_SUBOBJECT&& other) = default;
5713 void SetRootSignature(const D3D12_SERIALIZED_ROOT_SIGNATURE_DESC* pDesc) noexcept
5714 {
5715 if (pDesc)
5716 {
5717 m_Desc.Desc = {};
5718 m_Desc.Desc.pSerializedBlob = pDesc->pSerializedBlob;
5719 m_Desc.Desc.SerializedBlobSizeInBytes = pDesc->SerializedBlobSizeInBytes;
5720 }
5721 }
5722 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
5723 {
5724 return D3D12_STATE_SUBOBJECT_TYPE_LOCAL_SERIALIZED_ROOT_SIGNATURE;
5725 }
5726 operator const D3D12_LOCAL_SERIALIZED_ROOT_SIGNATURE&() const noexcept { return m_Desc; }
5727 operator D3D12_LOCAL_SERIALIZED_ROOT_SIGNATURE&() noexcept { return m_Desc; }
5728private:
5729 void Init() noexcept
5730 {
5731 SUBOBJECT_HELPER_BASE::Init();
5732 m_Desc = {};
5733 }
5734 void* Data() noexcept override { return &m_Desc; }
5735 D3D12_LOCAL_SERIALIZED_ROOT_SIGNATURE m_Desc;
5736};
5737
5738
5739//------------------------------------------------------------------------------------------------
5740class CD3DX12_EXISTING_COLLECTION_BY_KEY_SUBOBJECT
5741 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
5742{
5743public:
5744 CD3DX12_EXISTING_COLLECTION_BY_KEY_SUBOBJECT() noexcept
5745 {
5746 Init();
5747 }
5748 CD3DX12_EXISTING_COLLECTION_BY_KEY_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5749 {
5750 Init();
5751 AddToStateObject(ContainingStateObject);
5752 }
5753 CD3DX12_EXISTING_COLLECTION_BY_KEY_SUBOBJECT(const CD3DX12_EXISTING_COLLECTION_BY_KEY_SUBOBJECT& other) = delete;
5754 CD3DX12_EXISTING_COLLECTION_BY_KEY_SUBOBJECT& operator=(const CD3DX12_EXISTING_COLLECTION_BY_KEY_SUBOBJECT& other) = delete;
5755 CD3DX12_EXISTING_COLLECTION_BY_KEY_SUBOBJECT(CD3DX12_EXISTING_COLLECTION_BY_KEY_SUBOBJECT&& other) = default;
5756 CD3DX12_EXISTING_COLLECTION_BY_KEY_SUBOBJECT& operator=(CD3DX12_EXISTING_COLLECTION_BY_KEY_SUBOBJECT&& other) = default;
5757 void SetExistingCollection(const void* pKey, UINT KeySize) noexcept
5758 {
5759 const unsigned char* pKeyBytes = static_cast<const unsigned char *>(pKey);
5760 m_Key.clear();
5761 m_Key.insert(m_Key.begin(), pKeyBytes, pKeyBytes + KeySize);
5762 m_Desc.pKey = m_Key.data();
5763 m_Desc.KeySize = KeySize;
5764 }
5765 void DefineExport(
5766 LPCWSTR Name,
5767 LPCWSTR ExportToRename = nullptr,
5768 D3D12_EXPORT_FLAGS Flags = D3D12_EXPORT_FLAG_NONE)
5769 {
5770 D3D12_EXPORT_DESC Export;
5771 Export.Name = m_Strings.LocalCopy(Name);
5772 Export.ExportToRename = m_Strings.LocalCopy(ExportToRename);
5773 Export.Flags = Flags;
5774 m_Exports.push_back(Export);
5775 m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined
5776 m_Desc.NumExports = static_cast<UINT>(m_Exports.size());
5777 }
5778 template<size_t N>
5779 void DefineExports(LPCWSTR(&Exports)[N])
5780 {
5781 for (UINT i = 0; i < N; i++)
5782 {
5783 DefineExport(Exports[i]);
5784 }
5785 }
5786 void DefineExports(const LPCWSTR* Exports, UINT N)
5787 {
5788 for (UINT i = 0; i < N; i++)
5789 {
5790 DefineExport(Exports[i]);
5791 }
5792 }
5793 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
5794 {
5795 return D3D12_STATE_SUBOBJECT_TYPE_EXISTING_COLLECTION_BY_KEY;
5796 }
5797 operator const D3D12_EXISTING_COLLECTION_BY_KEY_DESC&() const noexcept { return m_Desc; }
5798private:
5799 void Init() noexcept
5800 {
5801 SUBOBJECT_HELPER_BASE::Init();
5802 m_Desc = {};
5803 m_Strings.clear();
5804 m_Exports.clear();
5805 }
5806 void* Data() noexcept override { return &m_Desc; }
5807 D3D12_EXISTING_COLLECTION_BY_KEY_DESC m_Desc;
5808 std::vector<unsigned char> m_Key;
5809 CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring> m_Strings;
5810 std::vector<D3D12_EXPORT_DESC> m_Exports;
5811};
5812
5813#endif // defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 618)
5814
5815//------------------------------------------------------------------------------------------------
5816class CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT
5817 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
5818{
5819public:
5820 CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT() noexcept
5821 : m_Desc({})
5822 {
5823 Init();
5824 }
5825 CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5826 : m_Desc({})
5827 {
5828 Init();
5829 AddToStateObject(ContainingStateObject);
5830 }
5831 CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT(const D3D12_STATE_OBJECT_CONFIG &desc) noexcept
5832 : m_Desc(desc)
5833 {
5834 Init();
5835 }
5836 CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT(const D3D12_STATE_OBJECT_CONFIG &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5837 : m_Desc(desc)
5838 {
5839 Init();
5840 AddToStateObject(ContainingStateObject);
5841 }
5842 CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT(const CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT& other) = delete;
5843 CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT& operator=(const CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT& other) = delete;
5844 CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT(CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT&& other) = default;
5845 CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT& operator=(CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT&& other) = default;
5846 void SetFlags(D3D12_STATE_OBJECT_FLAGS Flags) noexcept
5847 {
5848 m_Desc.Flags = Flags;
5849 }
5850 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
5851 {
5852 return D3D12_STATE_SUBOBJECT_TYPE_STATE_OBJECT_CONFIG;
5853 }
5854 operator const D3D12_STATE_OBJECT_CONFIG&() const noexcept { return m_Desc; }
5855 operator D3D12_STATE_OBJECT_CONFIG&() noexcept { return m_Desc; }
5856private:
5857 void Init() noexcept
5858 {
5859 SUBOBJECT_HELPER_BASE::Init();
5860 }
5861 void* Data() noexcept override { return &m_Desc; }
5862 D3D12_STATE_OBJECT_CONFIG m_Desc;
5863};
5864
5865//------------------------------------------------------------------------------------------------
5866class CD3DX12_NODE_MASK_SUBOBJECT
5867 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
5868{
5869public:
5870 CD3DX12_NODE_MASK_SUBOBJECT() noexcept
5871 : m_Desc({})
5872 {
5873 Init();
5874 }
5875 CD3DX12_NODE_MASK_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5876 : m_Desc({})
5877 {
5878 Init();
5879 AddToStateObject(ContainingStateObject);
5880 }
5881 CD3DX12_NODE_MASK_SUBOBJECT(const D3D12_NODE_MASK &desc) noexcept
5882 : m_Desc(desc)
5883 {
5884 Init();
5885 }
5886 CD3DX12_NODE_MASK_SUBOBJECT(const D3D12_NODE_MASK &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5887 : m_Desc(desc)
5888 {
5889 Init();
5890 AddToStateObject(ContainingStateObject);
5891 }
5892 CD3DX12_NODE_MASK_SUBOBJECT(const CD3DX12_NODE_MASK_SUBOBJECT& other) = delete;
5893 CD3DX12_NODE_MASK_SUBOBJECT& operator=(const CD3DX12_NODE_MASK_SUBOBJECT& other) = delete;
5894 CD3DX12_NODE_MASK_SUBOBJECT(CD3DX12_NODE_MASK_SUBOBJECT&& other) = default;
5895 CD3DX12_NODE_MASK_SUBOBJECT& operator=(CD3DX12_NODE_MASK_SUBOBJECT&& other) = default;
5896 void SetNodeMask(UINT NodeMask) noexcept
5897 {
5898 m_Desc.NodeMask = NodeMask;
5899 }
5900 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
5901 {
5902 return D3D12_STATE_SUBOBJECT_TYPE_NODE_MASK;
5903 }
5904 operator const D3D12_NODE_MASK&() const noexcept { return m_Desc; }
5905 operator D3D12_NODE_MASK&() noexcept { return m_Desc; }
5906private:
5907 void Init() noexcept
5908 {
5909 SUBOBJECT_HELPER_BASE::Init();
5910 }
5911 void* Data() noexcept override { return &m_Desc; }
5912 D3D12_NODE_MASK m_Desc;
5913};
5914
5915#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 612)
5916//------------------------------------------------------------------------------------------------
5917class CD3DX12_STREAM_OUTPUT_SUBOBJECT
5918 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
5919{
5920public:
5921 CD3DX12_STREAM_OUTPUT_SUBOBJECT()
5922 {
5923 Init();
5924 }
5925 CD3DX12_STREAM_OUTPUT_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
5926 {
5927 Init();
5928 AddToStateObject(ContainingStateObject);
5929 }
5930 void AddSODeclEntry(const D3D12_SO_DECLARATION_ENTRY &entry)
5931 {
5932 m_soDecalEntries.emplace_back(D3D12_SO_DECLARATION_ENTRY{
5933 entry.Stream,
5934 m_Strings.LocalCopy(entry.SemanticName),
5935 entry.SemanticIndex,
5936 entry.StartComponent,
5937 entry.ComponentCount,
5938 entry.OutputSlot
5939 });
5940 m_Desc.NumEntries++;
5941 // Below: using ugly way to get pointer in case .data() is not defined
5942 m_Desc.pSODeclaration = &m_soDecalEntries[0];
5943 }
5944 void SetSODeclEntries(const D3D12_SO_DECLARATION_ENTRY* soDeclEntries, UINT numEntries)
5945 {
5946 m_soDecalEntries.resize(numEntries);
5947 for (UINT i = 0; i < numEntries; i++)
5948 {
5949 m_soDecalEntries[i] = D3D12_SO_DECLARATION_ENTRY{
5950 soDeclEntries[i].Stream,
5951 m_Strings.LocalCopy(soDeclEntries[i].SemanticName),
5952 soDeclEntries[i].SemanticIndex,
5953 soDeclEntries[i].StartComponent,
5954 soDeclEntries[i].ComponentCount,
5955 soDeclEntries[i].OutputSlot
5956 };
5957 }
5958 m_Desc.NumEntries = numEntries;
5959 // Below: using ugly way to get pointer in case .data() is not defined
5960 if (numEntries > 0)
5961 {
5962 m_Desc.pSODeclaration = &m_soDecalEntries[0];
5963 }
5964 }
5965 void SetBufferStrides(const UINT* bufferStrides, UINT numStrides)
5966 {
5967 for (UINT i = 0; i < numStrides; ++i)
5968 {
5969 m_Strides[i] = bufferStrides[i];
5970 }
5971 m_Desc.pBufferStrides = m_Strides;
5972 m_Desc.NumStrides = numStrides;
5973 }
5974 void SetRasterizedStream(UINT rasterizedStream)
5975 {
5976 m_Desc.RasterizedStream = rasterizedStream;
5977 }
5978 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
5979 {
5980 return D3D12_STATE_SUBOBJECT_TYPE_STREAM_OUTPUT;
5981 }
5982 operator const D3D12_STREAM_OUTPUT_DESC& () const noexcept { return m_Desc; }
5983
5984private:
5985 void Init()
5986 {
5987 SUBOBJECT_HELPER_BASE::Init();
5988 m_Desc = {};
5989 }
5990 void* Data() noexcept override { return &m_Desc; }
5991 D3D12_STREAM_OUTPUT_DESC m_Desc;
5992 CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCSTR, std::string> m_Strings;
5993 std::vector<D3D12_SO_DECLARATION_ENTRY> m_soDecalEntries;
5994 UINT m_Strides[D3D12_SO_STREAM_COUNT];
5995};
5996
5997//------------------------------------------------------------------------------------------------
5998class CD3DX12_BLEND_SUBOBJECT
5999 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
6000{
6001public:
6002 CD3DX12_BLEND_SUBOBJECT()
6003 : m_Desc(CD3DX12_BLEND_DESC(D3D12_DEFAULT))
6004 {
6005 Init();
6006 }
6007 CD3DX12_BLEND_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6008 : m_Desc(CD3DX12_BLEND_DESC(D3D12_DEFAULT))
6009 {
6010 Init();
6011 AddToStateObject(ContainingStateObject);
6012 }
6013 CD3DX12_BLEND_SUBOBJECT(const D3D12_BLEND_DESC &desc)
6014 : m_Desc(desc)
6015 {
6016 Init();
6017 }
6018 CD3DX12_BLEND_SUBOBJECT(const D3D12_BLEND_DESC &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6019 : m_Desc(desc)
6020 {
6021 Init();
6022 AddToStateObject(ContainingStateObject);
6023 }
6024 void SetAlphaToCoverageEnable(bool alphaToCoverageEnable)
6025 {
6026 m_Desc.AlphaToCoverageEnable = alphaToCoverageEnable;
6027 }
6028 void SetIndependentBlendEnable(bool independentBlendEnable)
6029 {
6030 m_Desc.IndependentBlendEnable = independentBlendEnable;
6031 }
6032 void SetRenderTarget(UINT renderTargetIndex, const D3D12_RENDER_TARGET_BLEND_DESC& renderTargetBlendDesc)
6033 {
6034 m_Desc.RenderTarget[renderTargetIndex].BlendEnable = renderTargetBlendDesc.BlendEnable;
6035 m_Desc.RenderTarget[renderTargetIndex].BlendOp = renderTargetBlendDesc.BlendOp;
6036 m_Desc.RenderTarget[renderTargetIndex].BlendOpAlpha = renderTargetBlendDesc.BlendOpAlpha;
6037 m_Desc.RenderTarget[renderTargetIndex].DestBlend = renderTargetBlendDesc.DestBlend;
6038 m_Desc.RenderTarget[renderTargetIndex].DestBlendAlpha = renderTargetBlendDesc.DestBlendAlpha;
6039 m_Desc.RenderTarget[renderTargetIndex].LogicOp = renderTargetBlendDesc.LogicOp;
6040 m_Desc.RenderTarget[renderTargetIndex].LogicOpEnable = renderTargetBlendDesc.LogicOpEnable;
6041 m_Desc.RenderTarget[renderTargetIndex].RenderTargetWriteMask = renderTargetBlendDesc.RenderTargetWriteMask;
6042 m_Desc.RenderTarget[renderTargetIndex].SrcBlend = renderTargetBlendDesc.SrcBlend;
6043 m_Desc.RenderTarget[renderTargetIndex].SrcBlendAlpha = renderTargetBlendDesc.SrcBlendAlpha;
6044 }
6045 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
6046 {
6047 return D3D12_STATE_SUBOBJECT_TYPE_BLEND;
6048 }
6049 operator const D3D12_BLEND_DESC& () const noexcept { return m_Desc; }
6050 operator D3D12_BLEND_DESC& () noexcept { return m_Desc; }
6051private:
6052 void Init() noexcept
6053 {
6054 SUBOBJECT_HELPER_BASE::Init();
6055 }
6056 void* Data() noexcept override { return &m_Desc; }
6057 CD3DX12_BLEND_DESC m_Desc;
6058};
6059
6060//------------------------------------------------------------------------------------------------
6061class CD3DX12_RASTERIZER_SUBOBJECT
6062 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
6063{
6064public:
6065 CD3DX12_RASTERIZER_SUBOBJECT()
6066 : m_Desc(CD3DX12_RASTERIZER_DESC2(D3D12_DEFAULT))
6067 {
6068 Init();
6069 }
6070 CD3DX12_RASTERIZER_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6071 : m_Desc(CD3DX12_RASTERIZER_DESC2(D3D12_DEFAULT))
6072 {
6073 Init();
6074 AddToStateObject(ContainingStateObject);
6075 }
6076 CD3DX12_RASTERIZER_SUBOBJECT(const D3D12_RASTERIZER_DESC2 &desc)
6077 : m_Desc(desc)
6078 {
6079 Init();
6080 }
6081 CD3DX12_RASTERIZER_SUBOBJECT(const D3D12_RASTERIZER_DESC2 &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6082 : m_Desc(desc)
6083 {
6084 Init();
6085 AddToStateObject(ContainingStateObject);
6086 }
6087 void SetFillMode(D3D12_FILL_MODE fillMode)
6088 {
6089 m_Desc.FillMode = fillMode;
6090 }
6091 void SetCullMode(D3D12_CULL_MODE cullMode)
6092 {
6093 m_Desc.CullMode = cullMode;
6094 }
6095 void SetFrontCounterClockwise(BOOL frontCounterClockwise)
6096 {
6097 m_Desc.FrontCounterClockwise = frontCounterClockwise;
6098 }
6099 void SetDepthBias(FLOAT depthBias)
6100 {
6101 m_Desc.DepthBias = depthBias;
6102 }
6103 void SetDepthBiasClamp(FLOAT depthBiasClamp)
6104 {
6105 m_Desc.DepthBiasClamp = depthBiasClamp;
6106 }
6107 void SetSlopeScaledDepthBias(FLOAT slopeScaledDepthBias)
6108 {
6109 m_Desc.SlopeScaledDepthBias = slopeScaledDepthBias;
6110 }
6111 void SetDepthClipEnable(BOOL depthClipEnable)
6112 {
6113 m_Desc.DepthClipEnable = depthClipEnable;
6114 }
6115 void SetLineRasterizationMode(D3D12_LINE_RASTERIZATION_MODE lineRasterizationMode)
6116 {
6117 m_Desc.LineRasterizationMode = lineRasterizationMode;
6118 }
6119 void SetForcedSampleCount(UINT forcedSampleCount)
6120 {
6121 m_Desc.ForcedSampleCount = forcedSampleCount;
6122 }
6123 void SetConservativeRaster(D3D12_CONSERVATIVE_RASTERIZATION_MODE conservativeRaster)
6124 {
6125 m_Desc.ConservativeRaster = conservativeRaster;
6126 }
6127 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
6128 {
6129 return D3D12_STATE_SUBOBJECT_TYPE_RASTERIZER;
6130 }
6131 operator const D3D12_RASTERIZER_DESC2& () const noexcept { return m_Desc; }
6132 operator D3D12_RASTERIZER_DESC2& () noexcept { return m_Desc; }
6133private:
6134 void Init() noexcept
6135 {
6136 SUBOBJECT_HELPER_BASE::Init();
6137 }
6138 void* Data() noexcept override { return &m_Desc; }
6139 CD3DX12_RASTERIZER_DESC2 m_Desc;
6140};
6141
6142//------------------------------------------------------------------------------------------------
6143class CD3DX12_DEPTH_STENCIL2_SUBOBJECT
6144 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
6145{
6146public:
6147 CD3DX12_DEPTH_STENCIL2_SUBOBJECT()
6148 : m_Desc(CD3DX12_DEPTH_STENCIL_DESC2(D3D12_DEFAULT))
6149 {
6150 Init();
6151 }
6152 CD3DX12_DEPTH_STENCIL2_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6153 : m_Desc(CD3DX12_DEPTH_STENCIL_DESC2(D3D12_DEFAULT))
6154 {
6155 Init();
6156 AddToStateObject(ContainingStateObject);
6157 }
6158 CD3DX12_DEPTH_STENCIL2_SUBOBJECT(const D3D12_DEPTH_STENCIL_DESC2 &desc)
6159 : m_Desc(desc)
6160 {
6161 Init();
6162 }
6163 CD3DX12_DEPTH_STENCIL2_SUBOBJECT(const D3D12_DEPTH_STENCIL_DESC2 &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6164 : m_Desc(desc)
6165 {
6166 Init();
6167 AddToStateObject(ContainingStateObject);
6168 }
6169 void SetDepthEnable(BOOL depthEnable)
6170 {
6171 m_Desc.DepthEnable = depthEnable;
6172 }
6173 void SetDepthWriteMask(D3D12_DEPTH_WRITE_MASK depthWriteMask)
6174 {
6175 m_Desc.DepthWriteMask = depthWriteMask;
6176 }
6177 void SetDepthFunc(D3D12_COMPARISON_FUNC depthFunc)
6178 {
6179 m_Desc.DepthFunc = depthFunc;
6180 }
6181 void SetStencilEnable(BOOL stencilEnable)
6182 {
6183 m_Desc.StencilEnable = stencilEnable;
6184 }
6185 void SetFrontFace(D3D12_DEPTH_STENCILOP_DESC1 frontFace)
6186 {
6187 m_Desc.FrontFace = {
6188 frontFace.StencilFailOp,
6189 frontFace.StencilDepthFailOp,
6190 frontFace.StencilPassOp,
6191 frontFace.StencilFunc,
6192 frontFace.StencilReadMask,
6193 frontFace.StencilWriteMask
6194 };
6195 }
6196 void SetBackFace(D3D12_DEPTH_STENCILOP_DESC1 backFace)
6197 {
6198 m_Desc.BackFace = {
6199 backFace.StencilFailOp,
6200 backFace.StencilDepthFailOp,
6201 backFace.StencilPassOp,
6202 backFace.StencilFunc,
6203 backFace.StencilReadMask,
6204 backFace.StencilWriteMask
6205 };
6206 }
6207 void SetDepthBoundsTestEnable(BOOL depthBoundsTestEnable)
6208 {
6209 m_Desc.DepthBoundsTestEnable = depthBoundsTestEnable;
6210 }
6211 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
6212 {
6213 return D3D12_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL2;
6214 }
6215 operator const D3D12_DEPTH_STENCIL_DESC2& () const noexcept { return m_Desc; }
6216 operator D3D12_DEPTH_STENCIL_DESC2& () noexcept { return m_Desc; }
6217private:
6218 void Init() noexcept
6219 {
6220 SUBOBJECT_HELPER_BASE::Init();
6221 }
6222 void* Data() noexcept override { return &m_Desc; }
6223 CD3DX12_DEPTH_STENCIL_DESC2 m_Desc;
6224};
6225
6226//------------------------------------------------------------------------------------------------
6227class CD3DX12_INPUT_LAYOUT_SUBOBJECT
6228 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
6229{
6230public:
6231 CD3DX12_INPUT_LAYOUT_SUBOBJECT()
6232 {
6233 Init();
6234 }
6235 CD3DX12_INPUT_LAYOUT_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6236 {
6237 Init();
6238 AddToStateObject(ContainingStateObject);
6239 }
6240 void AddInputLayoutElementDesc(D3D12_INPUT_ELEMENT_DESC inputLayoutElementDesc)
6241 {
6242 m_inputLayoutElements.emplace_back(
6243 D3D12_INPUT_ELEMENT_DESC{
6244 m_Strings.LocalCopy(inputLayoutElementDesc.SemanticName),
6245 inputLayoutElementDesc.SemanticIndex,
6246 inputLayoutElementDesc.Format,
6247 inputLayoutElementDesc.InputSlot,
6248 inputLayoutElementDesc.AlignedByteOffset,
6249 inputLayoutElementDesc.InputSlotClass,
6250 inputLayoutElementDesc.InstanceDataStepRate
6251 });
6252 ++m_Desc.NumElements;
6253 // Below: using ugly way to get pointer in case .data() is not defined
6254 m_Desc.pInputElementDescs = &m_inputLayoutElements[0];
6255 }
6256 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
6257 {
6258 return D3D12_STATE_SUBOBJECT_TYPE_INPUT_LAYOUT;
6259 }
6260 operator const D3D12_INPUT_LAYOUT_DESC& () const noexcept { return m_Desc; }
6261private:
6262 void Init() noexcept
6263 {
6264 SUBOBJECT_HELPER_BASE::Init();
6265 m_Desc = {};
6266 m_inputLayoutElements.clear();
6267 }
6268 void* Data() noexcept override { return &m_Desc; }
6269 D3D12_INPUT_LAYOUT_DESC m_Desc;
6270 std::vector<D3D12_INPUT_ELEMENT_DESC> m_inputLayoutElements;
6271 CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCSTR, std::string> m_Strings;
6272};
6273
6274//------------------------------------------------------------------------------------------------
6275class CD3DX12_IB_STRIP_CUT_VALUE_SUBOBJECT
6276 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
6277{
6278public:
6279 CD3DX12_IB_STRIP_CUT_VALUE_SUBOBJECT()
6280 : m_Desc(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_DISABLED)
6281 {
6282 Init();
6283 }
6284 CD3DX12_IB_STRIP_CUT_VALUE_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6285 : m_Desc(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_DISABLED)
6286 {
6287 Init();
6288 AddToStateObject(ContainingStateObject);
6289 }
6290 CD3DX12_IB_STRIP_CUT_VALUE_SUBOBJECT(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE desc)
6291 : m_Desc(desc)
6292 {
6293 Init();
6294 }
6295 CD3DX12_IB_STRIP_CUT_VALUE_SUBOBJECT(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6296 : m_Desc(desc)
6297 {
6298 Init();
6299 AddToStateObject(ContainingStateObject);
6300 }
6301 void SetIBStripCutValue(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE ibStripCutValue)
6302 {
6303 m_Desc = ibStripCutValue;
6304 }
6305 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
6306 {
6307 return D3D12_STATE_SUBOBJECT_TYPE_IB_STRIP_CUT_VALUE;
6308 }
6309 operator const D3D12_INDEX_BUFFER_STRIP_CUT_VALUE& () const noexcept { return m_Desc; }
6310 operator D3D12_INDEX_BUFFER_STRIP_CUT_VALUE& () noexcept { return m_Desc; }
6311private:
6312 void Init() noexcept
6313 {
6314 SUBOBJECT_HELPER_BASE::Init();
6315 }
6316 void* Data() noexcept override { return &m_Desc; }
6317 D3D12_INDEX_BUFFER_STRIP_CUT_VALUE m_Desc;
6318};
6319
6320//------------------------------------------------------------------------------------------------
6321class CD3DX12_PRIMITIVE_TOPOLOGY_SUBOBJECT
6322 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
6323{
6324public:
6325 CD3DX12_PRIMITIVE_TOPOLOGY_SUBOBJECT()
6326 : m_Desc(D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED)
6327 {
6328 Init();
6329 }
6330 CD3DX12_PRIMITIVE_TOPOLOGY_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6331 : m_Desc(D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED)
6332 {
6333 Init();
6334 AddToStateObject(ContainingStateObject);
6335 }
6336 CD3DX12_PRIMITIVE_TOPOLOGY_SUBOBJECT(D3D12_PRIMITIVE_TOPOLOGY_TYPE desc)
6337 : m_Desc(desc)
6338 {
6339 Init();
6340 }
6341 CD3DX12_PRIMITIVE_TOPOLOGY_SUBOBJECT(D3D12_PRIMITIVE_TOPOLOGY_TYPE desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6342 : m_Desc(desc)
6343 {
6344 Init();
6345 AddToStateObject(ContainingStateObject);
6346 }
6347 void SetPrimitiveTopologyType(D3D12_PRIMITIVE_TOPOLOGY_TYPE primitiveTopologytype)
6348 {
6349 m_Desc = primitiveTopologytype;
6350 }
6351 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
6352 {
6353 return D3D12_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY;
6354 }
6355 operator const D3D12_PRIMITIVE_TOPOLOGY_TYPE& () const noexcept { return m_Desc; }
6356 operator D3D12_PRIMITIVE_TOPOLOGY_TYPE& () noexcept { return m_Desc; }
6357private:
6358 void Init() noexcept
6359 {
6360 SUBOBJECT_HELPER_BASE::Init();
6361 }
6362 void* Data() noexcept override { return &m_Desc; }
6363 D3D12_PRIMITIVE_TOPOLOGY_TYPE m_Desc;
6364};
6365
6366//------------------------------------------------------------------------------------------------
6367class CD3DX12_RENDER_TARGET_FORMATS_SUBOBJECT
6368 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
6369{
6370public:
6371 CD3DX12_RENDER_TARGET_FORMATS_SUBOBJECT()
6372 : m_Desc({})
6373 {
6374 Init();
6375 }
6376 CD3DX12_RENDER_TARGET_FORMATS_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6377 : m_Desc({})
6378 {
6379 Init();
6380 AddToStateObject(ContainingStateObject);
6381 }
6382 CD3DX12_RENDER_TARGET_FORMATS_SUBOBJECT(const D3D12_RT_FORMAT_ARRAY &desc)
6383 : m_Desc(desc)
6384 {
6385 Init();
6386 }
6387 CD3DX12_RENDER_TARGET_FORMATS_SUBOBJECT(const D3D12_RT_FORMAT_ARRAY &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6388 : m_Desc(desc)
6389 {
6390 Init();
6391 AddToStateObject(ContainingStateObject);
6392 }
6393 void SetNumRenderTargets(UINT numRenderTargets)
6394 {
6395 m_Desc.NumRenderTargets = numRenderTargets;
6396 }
6397 void SetRenderTargetFormat(UINT renderTarget, DXGI_FORMAT renderTargetFormat)
6398 {
6399 m_Desc.RTFormats[renderTarget] = renderTargetFormat;
6400 }
6401 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
6402 {
6403 return D3D12_STATE_SUBOBJECT_TYPE_RENDER_TARGET_FORMATS;
6404 }
6405 operator const D3D12_RT_FORMAT_ARRAY& () const noexcept { return m_Desc; }
6406 operator D3D12_RT_FORMAT_ARRAY& () noexcept { return m_Desc; }
6407private:
6408 void Init() noexcept
6409 {
6410 SUBOBJECT_HELPER_BASE::Init();
6411 }
6412 void* Data() noexcept override { return &m_Desc; }
6413 D3D12_RT_FORMAT_ARRAY m_Desc;
6414};
6415
6416//------------------------------------------------------------------------------------------------
6417class CD3DX12_DEPTH_STENCIL_FORMAT_SUBOBJECT
6418 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
6419{
6420public:
6421 CD3DX12_DEPTH_STENCIL_FORMAT_SUBOBJECT()
6422 : m_Desc(DXGI_FORMAT_UNKNOWN)
6423 {
6424 Init();
6425 }
6426 CD3DX12_DEPTH_STENCIL_FORMAT_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6427 : m_Desc(DXGI_FORMAT_UNKNOWN)
6428 {
6429 Init();
6430 AddToStateObject(ContainingStateObject);
6431 }
6432 CD3DX12_DEPTH_STENCIL_FORMAT_SUBOBJECT(DXGI_FORMAT desc)
6433 : m_Desc(desc)
6434 {
6435 Init();
6436 }
6437 CD3DX12_DEPTH_STENCIL_FORMAT_SUBOBJECT(DXGI_FORMAT desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6438 : m_Desc(desc)
6439 {
6440 Init();
6441 AddToStateObject(ContainingStateObject);
6442 }
6443 void SetDepthStencilFormat(DXGI_FORMAT depthStencilFormat)
6444 {
6445 m_Desc = depthStencilFormat;
6446 }
6447 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
6448 {
6449 return D3D12_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL_FORMAT;
6450 }
6451 operator const DXGI_FORMAT& () const noexcept { return m_Desc; }
6452 operator DXGI_FORMAT& () noexcept { return m_Desc; }
6453private:
6454 void Init() noexcept
6455 {
6456 SUBOBJECT_HELPER_BASE::Init();
6457 }
6458 void* Data() noexcept override { return &m_Desc; }
6459 DXGI_FORMAT m_Desc;
6460};
6461
6462//------------------------------------------------------------------------------------------------
6463class CD3DX12_SAMPLE_DESC_SUBOBJECT
6464 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
6465{
6466public:
6467 CD3DX12_SAMPLE_DESC_SUBOBJECT()
6468 : m_Desc({1, 0})
6469 {
6470 Init();
6471 }
6472 CD3DX12_SAMPLE_DESC_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6473 : m_Desc({1, 0})
6474 {
6475 Init();
6476 AddToStateObject(ContainingStateObject);
6477 }
6478 CD3DX12_SAMPLE_DESC_SUBOBJECT(const DXGI_SAMPLE_DESC &desc)
6479 : m_Desc(desc)
6480 {
6481 Init();
6482 }
6483 CD3DX12_SAMPLE_DESC_SUBOBJECT(const DXGI_SAMPLE_DESC &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6484 : m_Desc(desc)
6485 {
6486 Init();
6487 AddToStateObject(ContainingStateObject);
6488 }
6489 void SetCount(UINT count)
6490 {
6491 m_Desc.Count = count;
6492 }
6493 void SetQuality(UINT quality)
6494 {
6495 m_Desc.Quality = quality;
6496 }
6497 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
6498 {
6499 return D3D12_STATE_SUBOBJECT_TYPE_SAMPLE_DESC;
6500 }
6501 operator const DXGI_SAMPLE_DESC& () const noexcept { return m_Desc; }
6502 operator DXGI_SAMPLE_DESC& () noexcept { return m_Desc; }
6503private:
6504 void Init() noexcept
6505 {
6506 SUBOBJECT_HELPER_BASE::Init();
6507 m_Desc = {};
6508 }
6509 void* Data() noexcept override { return &m_Desc; }
6510 DXGI_SAMPLE_DESC m_Desc;
6511};
6512
6513//------------------------------------------------------------------------------------------------
6514class CD3DX12_FLAGS_SUBOBJECT
6515 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
6516{
6517public:
6518 CD3DX12_FLAGS_SUBOBJECT()
6519 : m_Desc(D3D12_PIPELINE_STATE_FLAG_NONE)
6520 {
6521 Init();
6522 }
6523 CD3DX12_FLAGS_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6524 : m_Desc(D3D12_PIPELINE_STATE_FLAG_NONE)
6525 {
6526 Init();
6527 AddToStateObject(ContainingStateObject);
6528 }
6529 CD3DX12_FLAGS_SUBOBJECT(D3D12_PIPELINE_STATE_FLAGS desc)
6530 : m_Desc(desc)
6531 {
6532 Init();
6533 }
6534 CD3DX12_FLAGS_SUBOBJECT(D3D12_PIPELINE_STATE_FLAGS desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6535 : m_Desc(desc)
6536 {
6537 Init();
6538 AddToStateObject(ContainingStateObject);
6539 }
6540 void SetFlags(D3D12_PIPELINE_STATE_FLAGS flags)
6541 {
6542 m_Desc = flags;
6543 }
6544 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
6545 {
6546 return D3D12_STATE_SUBOBJECT_TYPE_FLAGS;
6547 }
6548 operator const D3D12_PIPELINE_STATE_FLAGS& () const noexcept { return m_Desc; }
6549 operator D3D12_PIPELINE_STATE_FLAGS& () noexcept { return m_Desc; }
6550private:
6551 void Init() noexcept
6552 {
6553 SUBOBJECT_HELPER_BASE::Init();
6554 }
6555 void* Data() noexcept override { return &m_Desc; }
6556 D3D12_PIPELINE_STATE_FLAGS m_Desc;
6557};
6558
6559//------------------------------------------------------------------------------------------------
6560class CD3DX12_VIEW_INSTANCING_SUBOBJECT
6561 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
6562{
6563public:
6564 CD3DX12_VIEW_INSTANCING_SUBOBJECT()
6565 {
6566 Init();
6567 }
6568 CD3DX12_VIEW_INSTANCING_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6569 {
6570 Init();
6571 AddToStateObject(ContainingStateObject);
6572 }
6573 void AddViewInstanceLocation(D3D12_VIEW_INSTANCE_LOCATION viewInstanceLocation)
6574 {
6575 m_Desc.ViewInstanceCount++;
6576 m_viewInstanceLocations.emplace_back(
6577 D3D12_VIEW_INSTANCE_LOCATION
6578 {
6579 viewInstanceLocation.ViewportArrayIndex,
6580 viewInstanceLocation.RenderTargetArrayIndex
6581 }
6582 );
6583 // Below: using ugly way to get pointer in case .data() is not defined
6584 m_Desc.pViewInstanceLocations = &m_viewInstanceLocations[0];
6585 }
6586 void SetFlags(D3D12_VIEW_INSTANCING_FLAGS flags)
6587 {
6588 m_Desc.Flags = flags;
6589 }
6590 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
6591 {
6592 return D3D12_STATE_SUBOBJECT_TYPE_VIEW_INSTANCING;
6593 }
6594 operator const D3D12_VIEW_INSTANCING_DESC& () const noexcept { return m_Desc; }
6595private:
6596 void Init() noexcept
6597 {
6598 SUBOBJECT_HELPER_BASE::Init();
6599 m_Desc = CD3DX12_VIEW_INSTANCING_DESC(D3D12_DEFAULT);
6600 m_viewInstanceLocations.clear();
6601 }
6602 void* Data() noexcept override { return &m_Desc; }
6603 CD3DX12_VIEW_INSTANCING_DESC m_Desc;
6604 std::vector<D3D12_VIEW_INSTANCE_LOCATION> m_viewInstanceLocations;
6605};
6606
6607//------------------------------------------------------------------------------------------------
6608class CD3DX12_DEPTH_STENCIL_SUBOBJECT
6609 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
6610{
6611public:
6612 CD3DX12_DEPTH_STENCIL_SUBOBJECT()
6613 : m_Desc(CD3DX12_DEPTH_STENCIL_DESC(D3D12_DEFAULT))
6614 {
6615 Init();
6616 }
6617 CD3DX12_DEPTH_STENCIL_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6618 : m_Desc(CD3DX12_DEPTH_STENCIL_DESC(D3D12_DEFAULT))
6619 {
6620 Init();
6621 AddToStateObject(ContainingStateObject);
6622 }
6623 CD3DX12_DEPTH_STENCIL_SUBOBJECT(const D3D12_DEPTH_STENCIL_DESC &desc)
6624 : m_Desc(desc)
6625 {
6626 Init();
6627 }
6628 CD3DX12_DEPTH_STENCIL_SUBOBJECT(const D3D12_DEPTH_STENCIL_DESC &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6629 : m_Desc(desc)
6630 {
6631 Init();
6632 AddToStateObject(ContainingStateObject);
6633 }
6634 void SetDepthEnable(BOOL depthEnable)
6635 {
6636 m_Desc.DepthEnable = depthEnable;
6637 }
6638 void SetDepthWriteMask(D3D12_DEPTH_WRITE_MASK depthWriteMask)
6639 {
6640 m_Desc.DepthWriteMask = depthWriteMask;
6641 }
6642 void SetDepthFunc(D3D12_COMPARISON_FUNC depthFunc)
6643 {
6644 m_Desc.DepthFunc = depthFunc;
6645 }
6646 void SetStencilEnable(BOOL stencilEnable)
6647 {
6648 m_Desc.StencilEnable = stencilEnable;
6649 }
6650 void SetStencilReadMask(UINT8 stencilReadMask)
6651 {
6652 m_Desc.StencilReadMask = stencilReadMask;
6653 }
6654 void SetStencilWriteMask(UINT8 stencilWriteMask)
6655 {
6656 m_Desc.StencilWriteMask = stencilWriteMask;
6657 }
6658 void SetFrontFace(D3D12_DEPTH_STENCILOP_DESC frontFace)
6659 {
6660 m_Desc.FrontFace = {
6661 frontFace.StencilFailOp,
6662 frontFace.StencilDepthFailOp,
6663 frontFace.StencilPassOp,
6664 frontFace.StencilFunc
6665 };
6666 }
6667 void SetBackFace(D3D12_DEPTH_STENCILOP_DESC backFace)
6668 {
6669 m_Desc.BackFace = {
6670 backFace.StencilFailOp,
6671 backFace.StencilDepthFailOp,
6672 backFace.StencilPassOp,
6673 backFace.StencilFunc
6674 };
6675 }
6676 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
6677 {
6678 return D3D12_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL;
6679 }
6680 operator const D3D12_DEPTH_STENCIL_DESC& () const noexcept { return m_Desc; }
6681 operator D3D12_DEPTH_STENCIL_DESC& () noexcept { return m_Desc; }
6682private:
6683 void Init() noexcept
6684 {
6685 SUBOBJECT_HELPER_BASE::Init();
6686 }
6687 void* Data() noexcept override { return &m_Desc; }
6688 CD3DX12_DEPTH_STENCIL_DESC m_Desc;
6689};
6690
6691//------------------------------------------------------------------------------------------------
6692class CD3DX12_DEPTH_STENCIL1_SUBOBJECT
6693 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
6694{
6695public:
6696 CD3DX12_DEPTH_STENCIL1_SUBOBJECT()
6697 : m_Desc(CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEFAULT))
6698 {
6699 Init();
6700 }
6701 CD3DX12_DEPTH_STENCIL1_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6702 : m_Desc(CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEFAULT))
6703 {
6704 Init();
6705 AddToStateObject(ContainingStateObject);
6706 }
6707 CD3DX12_DEPTH_STENCIL1_SUBOBJECT(const D3D12_DEPTH_STENCIL_DESC1 &desc)
6708 : m_Desc(desc)
6709 {
6710 Init();
6711 }
6712 CD3DX12_DEPTH_STENCIL1_SUBOBJECT(const D3D12_DEPTH_STENCIL_DESC1 &desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6713 : m_Desc(desc)
6714 {
6715 Init();
6716 AddToStateObject(ContainingStateObject);
6717 }
6718 void SetDepthEnable(BOOL depthEnable)
6719 {
6720 m_Desc.DepthEnable = depthEnable;
6721 }
6722 void SetDepthWriteMask(D3D12_DEPTH_WRITE_MASK depthWriteMask)
6723 {
6724 m_Desc.DepthWriteMask = depthWriteMask;
6725 }
6726 void SetDepthFunc(D3D12_COMPARISON_FUNC depthFunc)
6727 {
6728 m_Desc.DepthFunc = depthFunc;
6729 }
6730 void SetStencilEnable(BOOL stencilEnable)
6731 {
6732 m_Desc.StencilEnable = stencilEnable;
6733 }
6734 void SetStencilReadMask(UINT8 stencilReadMask)
6735 {
6736 m_Desc.StencilReadMask = stencilReadMask;
6737 }
6738 void SetStencilWriteMask(UINT8 stencilWriteMask)
6739 {
6740 m_Desc.StencilWriteMask = stencilWriteMask;
6741 }
6742 void SetFrontFace(D3D12_DEPTH_STENCILOP_DESC frontFace)
6743 {
6744 m_Desc.FrontFace = {
6745 frontFace.StencilFailOp,
6746 frontFace.StencilDepthFailOp,
6747 frontFace.StencilPassOp,
6748 frontFace.StencilFunc
6749 };
6750 }
6751 void SetBackFace(D3D12_DEPTH_STENCILOP_DESC backFace)
6752 {
6753 m_Desc.BackFace = {
6754 backFace.StencilFailOp,
6755 backFace.StencilDepthFailOp,
6756 backFace.StencilPassOp,
6757 backFace.StencilFunc
6758 };
6759 }
6760 void SetDepthBoundsTestEnable(BOOL depthBoundsTestEnable)
6761 {
6762 m_Desc.DepthBoundsTestEnable = depthBoundsTestEnable;
6763 }
6764 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
6765 {
6766 return D3D12_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL1;
6767 }
6768 operator const D3D12_DEPTH_STENCIL_DESC1& () const noexcept { return m_Desc; }
6769 operator D3D12_DEPTH_STENCIL_DESC1& () noexcept { return m_Desc; }
6770private:
6771 void Init() noexcept
6772 {
6773 SUBOBJECT_HELPER_BASE::Init();
6774 }
6775 void* Data() noexcept override { return &m_Desc; }
6776 CD3DX12_DEPTH_STENCIL_DESC1 m_Desc;
6777};
6778
6779//------------------------------------------------------------------------------------------------
6780class CD3DX12_SAMPLE_MASK_SUBOBJECT
6781 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
6782{
6783public:
6784 CD3DX12_SAMPLE_MASK_SUBOBJECT()
6785 : m_Desc(0xffffffffu)
6786 {
6787 Init();
6788 }
6789 CD3DX12_SAMPLE_MASK_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6790 : m_Desc(0xffffffffu)
6791 {
6792 Init();
6793 AddToStateObject(ContainingStateObject);
6794 }
6795 CD3DX12_SAMPLE_MASK_SUBOBJECT(UINT desc)
6796 : m_Desc(desc)
6797 {
6798 Init();
6799 }
6800 CD3DX12_SAMPLE_MASK_SUBOBJECT(UINT desc, CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6801 : m_Desc(desc)
6802 {
6803 Init();
6804 AddToStateObject(ContainingStateObject);
6805 }
6806 void SetSampleMask(UINT sampleMask)
6807 {
6808 m_Desc = sampleMask;
6809 }
6810 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
6811 {
6812 return D3D12_STATE_SUBOBJECT_TYPE_SAMPLE_MASK;
6813 }
6814 operator const UINT& () const noexcept { return m_Desc; }
6815 operator UINT& () noexcept { return m_Desc; }
6816private:
6817 void Init() noexcept
6818 {
6819 SUBOBJECT_HELPER_BASE::Init();
6820 }
6821 void* Data() noexcept override { return &m_Desc; }
6822 UINT m_Desc;
6823};
6824
6825//------------------------------------------------------------------------------------------------
6826class CD3DX12_GENERIC_PROGRAM_SUBOBJECT
6827 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
6828{
6829public:
6830 CD3DX12_GENERIC_PROGRAM_SUBOBJECT()
6831 {
6832 Init();
6833 }
6834 CD3DX12_GENERIC_PROGRAM_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
6835 {
6836 Init();
6837 AddToStateObject(ContainingStateObject);
6838 }
6839 void SetProgramName(LPCWSTR ProgramName)
6840 {
6841 m_Desc.ProgramName = m_Strings.LocalCopy(ProgramName);
6842 }
6843 void AddExport(LPCWSTR exportName)
6844 {
6845 m_Exports.emplace_back(m_Strings.LocalCopy(exportName));
6846 m_Desc.NumExports++;
6847 // Below: using ugly way to get pointer in case .data() is not defined
6848 m_Desc.pExports = &m_Exports[0];
6849 }
6850 void AddSubobject(const D3D12_STATE_SUBOBJECT& subobject)
6851 {
6852 m_Subobjects.emplace_back(&subobject);
6853 m_Desc.NumSubobjects++;
6854 // Below: using ugly way to get pointer in case .data() is not defined
6855 m_Desc.ppSubobjects = &m_Subobjects[0];
6856 }
6857 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
6858 {
6859 return D3D12_STATE_SUBOBJECT_TYPE_GENERIC_PROGRAM;
6860 }
6861 operator const D3D12_GENERIC_PROGRAM_DESC& () const noexcept { return m_Desc; }
6862private:
6863 void Init() noexcept
6864 {
6865 SUBOBJECT_HELPER_BASE::Init();
6866 m_Desc = {};
6867 }
6868 void* Data() noexcept override { return &m_Desc; }
6869 D3D12_GENERIC_PROGRAM_DESC m_Desc;
6870 std::vector<LPCWSTR> m_Exports;
6871 std::vector<D3D12_STATE_SUBOBJECT const*> m_Subobjects;
6872 CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring> m_Strings;
6873};
6874
6875//------------------------------------------------------------------------------------------------
6876class CD3DX12_NODE_OUTPUT_OVERRIDES
6877{
6878public:
6879 CD3DX12_NODE_OUTPUT_OVERRIDES(const D3D12_NODE_OUTPUT_OVERRIDES** ppOwner, UINT* pNumOutputOverrides) noexcept
6880 {
6881 m_Desc.clear();
6882 m_ppOwner = ppOwner;
6883 *m_ppOwner = nullptr;
6884 m_pNumOutputOverrides = pNumOutputOverrides;
6885 *m_pNumOutputOverrides = 0;
6886 }
6887 void NewOutputOverride()
6888 {
6889 m_Desc.emplace_back(D3D12_NODE_OUTPUT_OVERRIDES{});
6890 *m_ppOwner = m_Desc.data();
6891 (*m_pNumOutputOverrides)++;
6892 }
6893 void OutputIndex(UINT index)
6894 {
6895 m_Desc.back().OutputIndex = index;
6896 }
6897 void NewName(LPCWSTR Name, UINT ArrayIndex = 0)
6898 {
6899 m_NodeIDs.emplace_front(D3D12_NODE_ID{ m_Strings.LocalCopy(Name),ArrayIndex });
6900 m_Desc.back().pNewName = &m_NodeIDs.front();
6901 }
6902 void AllowSparseNodes(BOOL bAllow)
6903 {
6904 m_UINTs.emplace_front((UINT)bAllow);
6905 m_Desc.back().pAllowSparseNodes = (BOOL*)&m_UINTs.front();
6906 }
6907 void MaxOutputRecords(UINT maxOutputRecords) noexcept
6908 {
6909 m_UINTs.emplace_front(maxOutputRecords);
6910 m_Desc.back().pMaxRecords = &m_UINTs.front();
6911 }
6912 void MaxOutputRecordsSharedWith(UINT outputIndex) noexcept
6913 {
6914 m_UINTs.emplace_front(outputIndex);
6915 m_Desc.back().pMaxRecordsSharedWithOutputIndex = &m_UINTs.front();
6916 }
6917private:
6918 std::vector<D3D12_NODE_OUTPUT_OVERRIDES> m_Desc;
6919 // Cached parameters
6920 CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring> m_Strings;
6921 std::forward_list<UINT> m_UINTs;
6922 std::forward_list<D3D12_NODE_ID> m_NodeIDs;
6923 const D3D12_NODE_OUTPUT_OVERRIDES** m_ppOwner;
6924 UINT* m_pNumOutputOverrides;
6925};
6926
6927//------------------------------------------------------------------------------------------------
6928class CD3DX12_WORK_GRAPH_SUBOBJECT;
6929
6930//------------------------------------------------------------------------------------------------
6931class CD3DX12_NODE_HELPER_BASE
6932{
6933protected:
6934 struct Backreference
6935 {
6936 CD3DX12_WORK_GRAPH_SUBOBJECT *m_pGraph;
6937 UINT m_NodeIndex;
6938 };
6939public:
6940 CD3DX12_NODE_HELPER_BASE(const Backreference &BackRef)
6941 : m_BackRef(BackRef)
6942 {
6943 }
6944 virtual ~CD3DX12_NODE_HELPER_BASE() = default;
6945protected:
6946 D3D12_NODE *GetNode() const;
6947 const Backreference m_BackRef;
6948 CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring> m_Strings;
6949};
6950
6951//------------------------------------------------------------------------------------------------
6952class CD3DX12_SHADER_NODE // Not specifying launch mode.
6953 // Don't need to distinguish if no parameter overriding is happening
6954 : public CD3DX12_NODE_HELPER_BASE
6955{
6956public:
6957 CD3DX12_SHADER_NODE(
6958 const Backreference &BackRef,
6959 LPCWSTR _Shader = nullptr)
6960 : CD3DX12_NODE_HELPER_BASE(BackRef)
6961 {
6962 GetNode()->NodeType = D3D12_NODE_TYPE_SHADER;
6963 Shader(_Shader);
6964 }
6965 void Shader(LPCWSTR _Shader)
6966 {
6967 GetNode()->Shader.Shader = m_Strings.LocalCopy(_Shader);
6968 }
6969 LPCWSTR GetShaderName() const { return GetNode()->Shader.Shader; }
6970};
6971
6972#endif // D3D12_SDK_VERSION >= 612
6973
6974
6975#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 612)
6976
6977//------------------------------------------------------------------------------------------------
6978// Use this class when defining a broadcasting launch node where configuration parameters
6979// need to be overridden. If overrides are not needed, just use CD3DX12_COMPUTE_SHADER_NODE
6980class CD3DX12_BROADCASTING_LAUNCH_NODE_OVERRIDES
6981 : public CD3DX12_NODE_HELPER_BASE
6982{
6983public:
6984 CD3DX12_BROADCASTING_LAUNCH_NODE_OVERRIDES(
6985 const Backreference &BackRef,
6986 LPCWSTR _Shader = nullptr) :
6987 CD3DX12_NODE_HELPER_BASE(BackRef),
6988 m_NodeOutputOverrides(&Overrides.pOutputOverrides, &Overrides.NumOutputOverrides)
6989 {
6990 Overrides = {};
6991 D3D12_NODE *pNode = GetNode();
6992 pNode->NodeType = D3D12_NODE_TYPE_SHADER;
6993 pNode->Shader.OverridesType = D3D12_NODE_OVERRIDES_TYPE_BROADCASTING_LAUNCH;
6994 pNode->Shader.pBroadcastingLaunchOverrides = &Overrides;
6995 Shader(_Shader);
6996 }
6997 void Shader(LPCWSTR _Shader)
6998 {
6999 GetNode()->Shader.Shader = m_Strings.LocalCopy(_Shader);
7000 }
7001 LPCWSTR GetShaderName() const { return GetNode()->Shader.Shader; }
7002 void LocalRootArgumentsTableIndex(UINT index)
7003 {
7004 m_UINTs.emplace_front(index);
7005 Overrides.pLocalRootArgumentsTableIndex = &m_UINTs.front();
7006 }
7007 void ProgramEntry(BOOL bIsProgramEntry)
7008 {
7009 m_UINTs.emplace_front(bIsProgramEntry);
7010 Overrides.pProgramEntry = (BOOL*)&m_UINTs.front();
7011 }
7012 void NewName(D3D12_NODE_ID NodeID)
7013 {
7014 m_NodeIDs.emplace_front(D3D12_NODE_ID{ m_Strings.LocalCopy(NodeID.Name),NodeID.ArrayIndex });
7015 Overrides.pNewName = &m_NodeIDs.front();
7016 }
7017 void ShareInputOf(D3D12_NODE_ID NodeID)
7018 {
7019 m_NodeIDs.emplace_front(D3D12_NODE_ID{ m_Strings.LocalCopy(NodeID.Name),NodeID.ArrayIndex });
7020 Overrides.pShareInputOf = &m_NodeIDs.front();
7021 }
7022 void DispatchGrid(UINT x, UINT y, UINT z)
7023 {
7024 m_UINT3s.emplace_front(UINT3{ x,y,z });
7025 Overrides.pDispatchGrid = (UINT*)&m_UINT3s.front();
7026 }
7027 void MaxDispatchGrid(UINT x, UINT y, UINT z)
7028 {
7029 m_UINT3s.emplace_front(UINT3{x,y,z});
7030 Overrides.pMaxDispatchGrid = (UINT*)&m_UINT3s.front();
7031 }
7032 CD3DX12_NODE_OUTPUT_OVERRIDES& NodeOutputOverrides()
7033 {
7034 return m_NodeOutputOverrides;
7035 }
7036 D3D12_BROADCASTING_LAUNCH_OVERRIDES Overrides;
7037private:
7038 // Cached parameters
7039 std::forward_list<UINT> m_UINTs;
7040 struct UINT3
7041 {
7042 UINT x;
7043 UINT y;
7044 UINT z;
7045 };
7046 std::forward_list<UINT3> m_UINT3s;
7047 std::forward_list<D3D12_NODE_ID> m_NodeIDs;
7048 CD3DX12_NODE_OUTPUT_OVERRIDES m_NodeOutputOverrides;
7049};
7050
7051//------------------------------------------------------------------------------------------------
7052// Use this class when defining a coalescing launch node where configuration parameters
7053// need to be overridden. If overrides are not needed, just use CD3DX12_COMPUTE_SHADER_NODE
7054class CD3DX12_COALESCING_LAUNCH_NODE_OVERRIDES
7055 : public CD3DX12_NODE_HELPER_BASE
7056{
7057public:
7058 CD3DX12_COALESCING_LAUNCH_NODE_OVERRIDES(
7059 const Backreference &BackRef,
7060 LPCWSTR _Shader = nullptr) :
7061 CD3DX12_NODE_HELPER_BASE(BackRef),
7062 m_NodeOutputOverrides(&Overrides.pOutputOverrides, &Overrides.NumOutputOverrides)
7063 {
7064 Overrides = {};
7065 D3D12_NODE *pNode = GetNode();
7066 pNode->NodeType = D3D12_NODE_TYPE_SHADER;
7067 pNode->Shader.OverridesType = D3D12_NODE_OVERRIDES_TYPE_COALESCING_LAUNCH;
7068 pNode->Shader.pCoalescingLaunchOverrides = &Overrides;
7069 Shader(_Shader);
7070 }
7071 void Shader(LPCWSTR _Shader)
7072 {
7073 GetNode()->Shader.Shader = m_Strings.LocalCopy(_Shader);
7074 }
7075 LPCWSTR GetShaderName() const { return GetNode()->Shader.Shader; }
7076 void LocalRootArgumentsTableIndex(UINT index)
7077 {
7078 m_UINTs.emplace_front(index);
7079 Overrides.pLocalRootArgumentsTableIndex = &m_UINTs.front();
7080 }
7081 void ProgramEntry(BOOL bIsProgramEntry)
7082 {
7083 m_UINTs.emplace_front(bIsProgramEntry);
7084 Overrides.pProgramEntry = (BOOL*)&m_UINTs.front();
7085 }
7086 void NewName(D3D12_NODE_ID NodeID)
7087 {
7088 m_NodeIDs.emplace_front(D3D12_NODE_ID{ m_Strings.LocalCopy(NodeID.Name),NodeID.ArrayIndex });
7089 Overrides.pNewName = &m_NodeIDs.front();
7090 }
7091 void ShareInputOf(D3D12_NODE_ID NodeID)
7092 {
7093 m_NodeIDs.emplace_front(D3D12_NODE_ID{ m_Strings.LocalCopy(NodeID.Name),NodeID.ArrayIndex });
7094 Overrides.pShareInputOf = &m_NodeIDs.front();
7095 }
7096 CD3DX12_NODE_OUTPUT_OVERRIDES& NodeOutputOverrides()
7097 {
7098 return m_NodeOutputOverrides;
7099 }
7100 D3D12_COALESCING_LAUNCH_OVERRIDES Overrides;
7101private:
7102 // Cached parameters
7103 std::forward_list<UINT> m_UINTs;
7104 struct UINT3
7105 {
7106 UINT x;
7107 UINT y;
7108 UINT z;
7109 };
7110 std::forward_list<UINT3> m_UINT3s;
7111 std::forward_list<D3D12_NODE_ID> m_NodeIDs;
7112 CD3DX12_NODE_OUTPUT_OVERRIDES m_NodeOutputOverrides;
7113};
7114
7115//------------------------------------------------------------------------------------------------
7116// Use this class when defining a thread launch node where configuration parameters
7117// need to be overridden. If overrides are not needed, just use CD3DX12_COMPUTE_SHADER_NODE
7118class CD3DX12_THREAD_LAUNCH_NODE_OVERRIDES
7119 : public CD3DX12_NODE_HELPER_BASE
7120{
7121public:
7122 CD3DX12_THREAD_LAUNCH_NODE_OVERRIDES(
7123 const Backreference &BackRef,
7124 LPCWSTR _Shader = nullptr) :
7125 CD3DX12_NODE_HELPER_BASE(BackRef),
7126 m_NodeOutputOverrides(&Overrides.pOutputOverrides, &Overrides.NumOutputOverrides)
7127 {
7128 Overrides = {};
7129 D3D12_NODE *pNode = GetNode();
7130 pNode->NodeType = D3D12_NODE_TYPE_SHADER;
7131 pNode->Shader.OverridesType = D3D12_NODE_OVERRIDES_TYPE_THREAD_LAUNCH;
7132 pNode->Shader.pThreadLaunchOverrides = &Overrides;
7133 Shader(_Shader);
7134 }
7135 void Shader(LPCWSTR _Shader)
7136 {
7137 GetNode()->Shader.Shader = m_Strings.LocalCopy(_Shader);
7138 }
7139 LPCWSTR GetShaderName() const { return GetNode()->Shader.Shader; }
7140 void LocalRootArgumentsTableIndex(UINT index)
7141 {
7142 m_UINTs.emplace_front(index);
7143 Overrides.pLocalRootArgumentsTableIndex = &m_UINTs.front();
7144 }
7145 void ProgramEntry(BOOL bIsProgramEntry)
7146 {
7147 m_UINTs.emplace_front(bIsProgramEntry);
7148 Overrides.pProgramEntry = (BOOL*)&m_UINTs.front();
7149 }
7150 void NewName(D3D12_NODE_ID NodeID)
7151 {
7152 m_NodeIDs.emplace_front(D3D12_NODE_ID{ m_Strings.LocalCopy(NodeID.Name),NodeID.ArrayIndex });
7153 Overrides.pNewName = &m_NodeIDs.front();
7154 }
7155 void ShareInputOf(D3D12_NODE_ID NodeID)
7156 {
7157 m_NodeIDs.emplace_front(D3D12_NODE_ID{ m_Strings.LocalCopy(NodeID.Name),NodeID.ArrayIndex });
7158 Overrides.pShareInputOf = &m_NodeIDs.front();
7159 }
7160 CD3DX12_NODE_OUTPUT_OVERRIDES& NodeOutputOverrides()
7161 {
7162 return m_NodeOutputOverrides;
7163 }
7164 D3D12_THREAD_LAUNCH_OVERRIDES Overrides;
7165private:
7166 // Cached parameters
7167 std::forward_list<UINT> m_UINTs;
7168 std::forward_list<D3D12_NODE_ID> m_NodeIDs;
7169 CD3DX12_NODE_OUTPUT_OVERRIDES m_NodeOutputOverrides;
7170};
7171
7172//------------------------------------------------------------------------------------------------
7173// Use this class when defining a node where configuration parameters
7174// need to be overridden for parameters that are common to all launch node types.
7175// This option is a convenience if you don't want to determine what the launch mode is
7176// and just want to override a setting that isn't specific to launch mode.
7177// If overrides are not needed, just use CD3DX12_COMPUTE_SHADER_NODE
7178class CD3DX12_COMMON_COMPUTE_NODE_OVERRIDES
7179 : public CD3DX12_NODE_HELPER_BASE
7180{
7181public:
7182 CD3DX12_COMMON_COMPUTE_NODE_OVERRIDES(
7183 const Backreference &BackRef,
7184 LPCWSTR _Shader = nullptr) :
7185 CD3DX12_NODE_HELPER_BASE(BackRef),
7186 m_NodeOutputOverrides(&Overrides.pOutputOverrides, &Overrides.NumOutputOverrides)
7187 {
7188 Overrides = {};
7189 D3D12_NODE *pNode = GetNode();
7190 pNode->NodeType = D3D12_NODE_TYPE_SHADER;
7191 pNode->Shader.OverridesType = D3D12_NODE_OVERRIDES_TYPE_COMMON_COMPUTE;
7192 pNode->Shader.pThreadLaunchOverrides = &Overrides;
7193 Shader(_Shader);
7194 }
7195 void Shader(LPCWSTR _Shader)
7196 {
7197 GetNode()->Shader.Shader = m_Strings.LocalCopy(_Shader);
7198 }
7199 LPCWSTR GetShaderName() const { return GetNode()->Shader.Shader; }
7200 void LocalRootArgumentsTableIndex(UINT index)
7201 {
7202 m_UINTs.emplace_front(index);
7203 Overrides.pLocalRootArgumentsTableIndex = &m_UINTs.front();
7204 }
7205 void ProgramEntry(BOOL bIsProgramEntry)
7206 {
7207 m_UINTs.emplace_front(bIsProgramEntry);
7208 Overrides.pProgramEntry = (BOOL*)&m_UINTs.front();
7209 }
7210 void NewName(D3D12_NODE_ID NodeID)
7211 {
7212 m_NodeIDs.emplace_front(D3D12_NODE_ID{ m_Strings.LocalCopy(NodeID.Name),NodeID.ArrayIndex });
7213 Overrides.pNewName = &m_NodeIDs.front();
7214 }
7215 void ShareInputOf(D3D12_NODE_ID NodeID)
7216 {
7217 m_NodeIDs.emplace_front(D3D12_NODE_ID{ m_Strings.LocalCopy(NodeID.Name),NodeID.ArrayIndex });
7218 Overrides.pShareInputOf = &m_NodeIDs.front();
7219 }
7220 CD3DX12_NODE_OUTPUT_OVERRIDES& NodeOutputOverrides()
7221 {
7222 return m_NodeOutputOverrides;
7223 }
7224 D3D12_THREAD_LAUNCH_OVERRIDES Overrides;
7225private:
7226 // Cached parameters
7227 std::forward_list<UINT> m_UINTs;
7228 std::forward_list<D3D12_NODE_ID> m_NodeIDs;
7229 CD3DX12_NODE_OUTPUT_OVERRIDES m_NodeOutputOverrides;
7230};
7231
7232//------------------------------------------------------------------------------------------------
7233class CD3DX12_WORK_GRAPH_SUBOBJECT
7234 : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE
7235{
7236public:
7237 CD3DX12_WORK_GRAPH_SUBOBJECT() noexcept
7238 {
7239 Init();
7240 }
7241 CD3DX12_WORK_GRAPH_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject)
7242 {
7243 Init();
7244 AddToStateObject(ContainingStateObject);
7245 }
7246 D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override
7247 {
7248 return D3D12_STATE_SUBOBJECT_TYPE_WORK_GRAPH;
7249 }
7250 void IncludeAllAvailableNodes()
7251 {
7252 m_Desc.Flags |= D3D12_WORK_GRAPH_FLAG_INCLUDE_ALL_AVAILABLE_NODES;
7253 }
7254
7255
7256 void SetProgramName(LPCWSTR ProgramName)
7257 {
7258 m_Desc.ProgramName = m_Strings.LocalCopy(ProgramName);
7259 }
7260 void AddEntrypoint(D3D12_NODE_ID Entrypoint)
7261 {
7262 m_Entrypoints.emplace_back(D3D12_NODE_ID{ m_Strings.LocalCopy(Entrypoint.Name),Entrypoint.ArrayIndex });
7263 m_Desc.NumEntrypoints++;
7264 m_Desc.pEntrypoints = m_Entrypoints.data();
7265 }
7266
7267 template<typename T>
7268 T* CreateNode()
7269 {
7270 m_NodeDescs.push_back({});
7271 m_Desc.NumExplicitlyDefinedNodes++;
7272 m_Desc.pExplicitlyDefinedNodes = m_NodeDescs.data();
7273 T* pNodeHelper = new T({this, (UINT)m_NodeDescs.size() - 1});
7274 m_OwnedNodeHelpers.emplace_back(pNodeHelper);
7275 return pNodeHelper;
7276 }
7277 CD3DX12_SHADER_NODE* CreateShaderNode(LPCWSTR Shader = nullptr)
7278 {
7279 auto pNode = CreateNode<CD3DX12_SHADER_NODE>();
7280 pNode->Shader(Shader);
7281 return pNode;
7282 }
7283 CD3DX12_BROADCASTING_LAUNCH_NODE_OVERRIDES* CreateBroadcastingLaunchNodeOverrides(LPCWSTR Shader = nullptr)
7284 {
7285 auto pNode = CreateNode<CD3DX12_BROADCASTING_LAUNCH_NODE_OVERRIDES>();
7286 pNode->Shader(Shader);
7287 return pNode;
7288 }
7289 CD3DX12_COALESCING_LAUNCH_NODE_OVERRIDES* CreateCoalescingLaunchNodeOverrides(LPCWSTR Shader = nullptr)
7290 {
7291 auto pNode = CreateNode<CD3DX12_COALESCING_LAUNCH_NODE_OVERRIDES>();
7292 pNode->Shader(Shader);
7293 return pNode;
7294 }
7295 CD3DX12_THREAD_LAUNCH_NODE_OVERRIDES* CreateThreadLaunchNodeOverrides(LPCWSTR Shader = nullptr)
7296 {
7297 auto pNode = CreateNode<CD3DX12_THREAD_LAUNCH_NODE_OVERRIDES>();
7298 pNode->Shader(Shader);
7299 return pNode;
7300 }
7301 CD3DX12_COMMON_COMPUTE_NODE_OVERRIDES* CreateCommonComputeNodeOverrides(LPCWSTR Shader = nullptr)
7302 {
7303 auto pNode = CreateNode<CD3DX12_COMMON_COMPUTE_NODE_OVERRIDES>();
7304 pNode->Shader(Shader);
7305 return pNode;
7306 }
7307#endif // D3D12_SDK_VERSION >= 612
7308
7309
7310#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 612)
7311
7312 operator const D3D12_WORK_GRAPH_DESC& () noexcept
7313 {
7314 return m_Desc;
7315 }
7316private:
7317 void Init() noexcept
7318 {
7319 SUBOBJECT_HELPER_BASE::Init();
7320 m_Desc = {};
7321 m_Entrypoints.clear();
7322 m_NodeDescs.clear();
7323 }
7324 void* Data() noexcept override { return &m_Desc; }
7325 D3D12_WORK_GRAPH_DESC m_Desc;
7326 std::vector<D3D12_NODE_ID> m_Entrypoints;
7327 std::vector<D3D12_NODE> m_NodeDescs;
7328 CD3DX12_STATE_OBJECT_DESC::StringContainer<LPCWSTR, std::wstring> m_Strings;
7329 std::vector<std::unique_ptr<const CD3DX12_NODE_HELPER_BASE>> m_OwnedNodeHelpers;
7330 friend class CD3DX12_NODE_HELPER_BASE;
7331};
7332
7333inline D3D12_NODE * CD3DX12_NODE_HELPER_BASE::GetNode() const
7334{
7335 return &m_BackRef.m_pGraph->m_NodeDescs[m_BackRef.m_NodeIndex];
7336}
7337#endif // D3D12_SDK_VERSION >= 612
7338
7339#undef D3DX12_COM_PTR
7340#undef D3DX12_COM_PTR_GET
7341#undef D3DX12_COM_PTR_ADDRESSOF
7342
7343#endif // !D3DX12_NO_STATE_OBJECT_HELPERS
7344
7345
7346#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
7347
7348//================================================================================================
7349// D3DX12 Enhanced Barrier Helpers
7350//================================================================================================
7351
7352class CD3DX12_BARRIER_SUBRESOURCE_RANGE : public D3D12_BARRIER_SUBRESOURCE_RANGE
7353{
7354public:
7355 CD3DX12_BARRIER_SUBRESOURCE_RANGE() = default;
7356 CD3DX12_BARRIER_SUBRESOURCE_RANGE(const D3D12_BARRIER_SUBRESOURCE_RANGE &o) noexcept :
7357 D3D12_BARRIER_SUBRESOURCE_RANGE(o)
7358 {}
7359 explicit CD3DX12_BARRIER_SUBRESOURCE_RANGE(UINT Subresource) noexcept :
7360 D3D12_BARRIER_SUBRESOURCE_RANGE{ Subresource, 0, 0, 0, 0, 0 }
7361 {}
7362 CD3DX12_BARRIER_SUBRESOURCE_RANGE(
7363 UINT firstMipLevel,
7364 UINT numMips,
7365 UINT firstArraySlice,
7366 UINT numArraySlices,
7367 UINT firstPlane = 0,
7368 UINT numPlanes = 1) noexcept :
7369 D3D12_BARRIER_SUBRESOURCE_RANGE
7370 {
7371 firstMipLevel,
7372 numMips,
7373 firstArraySlice,
7374 numArraySlices,
7375 firstPlane,
7376 numPlanes
7377 }
7378 {}
7379};
7380
7381class CD3DX12_GLOBAL_BARRIER : public D3D12_GLOBAL_BARRIER
7382{
7383public:
7384 CD3DX12_GLOBAL_BARRIER() = default;
7385 CD3DX12_GLOBAL_BARRIER(const D3D12_GLOBAL_BARRIER &o) noexcept : D3D12_GLOBAL_BARRIER(o){}
7386 CD3DX12_GLOBAL_BARRIER(
7387 D3D12_BARRIER_SYNC syncBefore,
7388 D3D12_BARRIER_SYNC syncAfter,
7389 D3D12_BARRIER_ACCESS accessBefore,
7390 D3D12_BARRIER_ACCESS accessAfter) noexcept : D3D12_GLOBAL_BARRIER {
7391 syncBefore,
7392 syncAfter,
7393 accessBefore,
7394 accessAfter
7395 }
7396 {}
7397};
7398
7399class CD3DX12_BUFFER_BARRIER : public D3D12_BUFFER_BARRIER
7400{
7401public:
7402 CD3DX12_BUFFER_BARRIER() = default;
7403 CD3DX12_BUFFER_BARRIER(const D3D12_BUFFER_BARRIER &o) noexcept : D3D12_BUFFER_BARRIER(o){}
7404 CD3DX12_BUFFER_BARRIER(
7405 D3D12_BARRIER_SYNC syncBefore,
7406 D3D12_BARRIER_SYNC syncAfter,
7407 D3D12_BARRIER_ACCESS accessBefore,
7408 D3D12_BARRIER_ACCESS accessAfter,
7409 ID3D12Resource *pRes) noexcept : D3D12_BUFFER_BARRIER {
7410 syncBefore,
7411 syncAfter,
7412 accessBefore,
7413 accessAfter,
7414 pRes,
7415 0, ULLONG_MAX
7416 }
7417 {}
7418};
7419
7420class CD3DX12_TEXTURE_BARRIER : public D3D12_TEXTURE_BARRIER
7421{
7422public:
7423 CD3DX12_TEXTURE_BARRIER() = default;
7424 CD3DX12_TEXTURE_BARRIER(const D3D12_TEXTURE_BARRIER &o) noexcept : D3D12_TEXTURE_BARRIER(o){}
7425 CD3DX12_TEXTURE_BARRIER(
7426 D3D12_BARRIER_SYNC syncBefore,
7427 D3D12_BARRIER_SYNC syncAfter,
7428 D3D12_BARRIER_ACCESS accessBefore,
7429 D3D12_BARRIER_ACCESS accessAfter,
7430 D3D12_BARRIER_LAYOUT layoutBefore,
7431 D3D12_BARRIER_LAYOUT layoutAfter,
7432 ID3D12Resource *pRes,
7433 const D3D12_BARRIER_SUBRESOURCE_RANGE &subresources,
7434 D3D12_TEXTURE_BARRIER_FLAGS flag = D3D12_TEXTURE_BARRIER_FLAG_NONE) noexcept : D3D12_TEXTURE_BARRIER {
7435 syncBefore,
7436 syncAfter,
7437 accessBefore,
7438 accessAfter,
7439 layoutBefore,
7440 layoutAfter,
7441 pRes,
7442 subresources,
7443 flag
7444 }
7445 {}
7446};
7447
7448class CD3DX12_BARRIER_GROUP : public D3D12_BARRIER_GROUP
7449{
7450public:
7451 CD3DX12_BARRIER_GROUP() = default;
7452 CD3DX12_BARRIER_GROUP(const D3D12_BARRIER_GROUP &o) noexcept : D3D12_BARRIER_GROUP(o){}
7453 CD3DX12_BARRIER_GROUP(UINT32 numBarriers, const D3D12_BUFFER_BARRIER *pBarriers) noexcept
7454 {
7455 Type = D3D12_BARRIER_TYPE_BUFFER;
7456 NumBarriers = numBarriers;
7457 pBufferBarriers = pBarriers;
7458 }
7459 CD3DX12_BARRIER_GROUP(UINT32 numBarriers, const D3D12_TEXTURE_BARRIER *pBarriers) noexcept
7460 {
7461 Type = D3D12_BARRIER_TYPE_TEXTURE;
7462 NumBarriers = numBarriers;
7463 pTextureBarriers = pBarriers;
7464 }
7465 CD3DX12_BARRIER_GROUP(UINT32 numBarriers, const D3D12_GLOBAL_BARRIER *pBarriers) noexcept
7466 {
7467 Type = D3D12_BARRIER_TYPE_GLOBAL;
7468 NumBarriers = numBarriers;
7469 pGlobalBarriers = pBarriers;
7470 }
7471};
7472
7473#endif // D3D12_SDK_VERSION >= 608
7474
7475
7476#ifndef D3DX12_NO_CHECK_FEATURE_SUPPORT_CLASS
7477
7478//================================================================================================
7479// D3DX12 Check Feature Support
7480//================================================================================================
7481
7482#include <vector>
7483
7484class CD3DX12FeatureSupport
7485{
7486public: // Function declaration
7487 // Default constructor that creates an empty object
7488 CD3DX12FeatureSupport() noexcept;
7489
7490 // Initialize data from the given device
7491 HRESULT Init(ID3D12Device* pDevice);
7492
7493 // Retreives the status of the object. If an error occurred in the initialization process, the function returns the error code.
7494 HRESULT GetStatus() const noexcept { return m_hStatus; }
7495
7496 // Getter functions for each feature class
7497 // D3D12_OPTIONS
7498 BOOL DoublePrecisionFloatShaderOps() const noexcept;
7499 BOOL OutputMergerLogicOp() const noexcept;
7500 D3D12_SHADER_MIN_PRECISION_SUPPORT MinPrecisionSupport() const noexcept;
7501 D3D12_TILED_RESOURCES_TIER TiledResourcesTier() const noexcept;
7502 D3D12_RESOURCE_BINDING_TIER ResourceBindingTier() const noexcept;
7503 BOOL PSSpecifiedStencilRefSupported() const noexcept;
7504 BOOL TypedUAVLoadAdditionalFormats() const noexcept;
7505 BOOL ROVsSupported() const noexcept;
7506 D3D12_CONSERVATIVE_RASTERIZATION_TIER ConservativeRasterizationTier() const noexcept;
7507 BOOL StandardSwizzle64KBSupported() const noexcept;
7508 BOOL CrossAdapterRowMajorTextureSupported() const noexcept;
7509 BOOL VPAndRTArrayIndexFromAnyShaderFeedingRasterizerSupportedWithoutGSEmulation() const noexcept;
7510 D3D12_RESOURCE_HEAP_TIER ResourceHeapTier() const noexcept;
7511 D3D12_CROSS_NODE_SHARING_TIER CrossNodeSharingTier() const noexcept;
7512 UINT MaxGPUVirtualAddressBitsPerResource() const noexcept;
7513
7514 // FEATURE_LEVELS
7515 D3D_FEATURE_LEVEL MaxSupportedFeatureLevel() const noexcept;
7516
7517 // FORMAT_SUPPORT
7518 HRESULT FormatSupport(DXGI_FORMAT Format, D3D12_FORMAT_SUPPORT1& Support1, D3D12_FORMAT_SUPPORT2& Support2) const;
7519
7520 // MUTLTISAMPLE_QUALITY_LEVELS
7521 HRESULT MultisampleQualityLevels(DXGI_FORMAT Format, UINT SampleCount, D3D12_MULTISAMPLE_QUALITY_LEVEL_FLAGS Flags, UINT& NumQualityLevels) const;
7522
7523 // FORMAT_INFO
7524 HRESULT FormatInfo(DXGI_FORMAT Format, UINT8& PlaneCount) const;
7525
7526 // GPU_VIRTUAL_ADDRESS_SUPPORT
7527 UINT MaxGPUVirtualAddressBitsPerProcess() const noexcept;
7528
7529 // SHADER_MODEL
7530 D3D_SHADER_MODEL HighestShaderModel() const noexcept;
7531
7532 // D3D12_OPTIONS1
7533 BOOL WaveOps() const noexcept;
7534 UINT WaveLaneCountMin() const noexcept;
7535 UINT WaveLaneCountMax() const noexcept;
7536 UINT TotalLaneCount() const noexcept;
7537 BOOL ExpandedComputeResourceStates() const noexcept;
7538 BOOL Int64ShaderOps() const noexcept;
7539
7540 // PROTECTED_RESOURCE_SESSION_SUPPORT
7541 D3D12_PROTECTED_RESOURCE_SESSION_SUPPORT_FLAGS ProtectedResourceSessionSupport(UINT NodeIndex = 0) const;
7542
7543 // ROOT_SIGNATURE
7544 D3D_ROOT_SIGNATURE_VERSION HighestRootSignatureVersion() const noexcept;
7545
7546 // ARCHITECTURE1
7547 BOOL TileBasedRenderer(UINT NodeIndex = 0) const;
7548 BOOL UMA(UINT NodeIndex = 0) const;
7549 BOOL CacheCoherentUMA(UINT NodeIndex = 0) const;
7550 BOOL IsolatedMMU(UINT NodeIndex = 0) const;
7551
7552 // D3D12_OPTIONS2
7553 BOOL DepthBoundsTestSupported() const noexcept;
7554 D3D12_PROGRAMMABLE_SAMPLE_POSITIONS_TIER ProgrammableSamplePositionsTier() const noexcept;
7555
7556 // SHADER_CACHE
7557 D3D12_SHADER_CACHE_SUPPORT_FLAGS ShaderCacheSupportFlags() const noexcept;
7558
7559 // COMMAND_QUEUE_PRIORITY
7560 BOOL CommandQueuePrioritySupported(D3D12_COMMAND_LIST_TYPE CommandListType, UINT Priority);
7561
7562 // D3D12_OPTIONS3
7563 BOOL CopyQueueTimestampQueriesSupported() const noexcept;
7564 BOOL CastingFullyTypedFormatSupported() const noexcept;
7565 D3D12_COMMAND_LIST_SUPPORT_FLAGS WriteBufferImmediateSupportFlags() const noexcept;
7566 D3D12_VIEW_INSTANCING_TIER ViewInstancingTier() const noexcept;
7567 BOOL BarycentricsSupported() const noexcept;
7568
7569 // EXISTING_HEAPS
7570 BOOL ExistingHeapsSupported() const noexcept;
7571
7572 // D3D12_OPTIONS4
7573 BOOL MSAA64KBAlignedTextureSupported() const noexcept;
7574 D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER SharedResourceCompatibilityTier() const noexcept;
7575 BOOL Native16BitShaderOpsSupported() const noexcept;
7576
7577 // SERIALIZATION
7578 D3D12_HEAP_SERIALIZATION_TIER HeapSerializationTier(UINT NodeIndex = 0) const;
7579
7580 // CROSS_NODE
7581 // CrossNodeSharingTier handled in D3D12Options
7582 BOOL CrossNodeAtomicShaderInstructions() const noexcept;
7583
7584 // D3D12_OPTIONS5
7585 BOOL SRVOnlyTiledResourceTier3() const noexcept;
7586 D3D12_RENDER_PASS_TIER RenderPassesTier() const noexcept;
7587 D3D12_RAYTRACING_TIER RaytracingTier() const noexcept;
7588
7589#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 4)
7590 // DISPLAYABLE
7591 BOOL DisplayableTexture() const noexcept;
7592 // SharedResourceCompatibilityTier handled in D3D12Options4
7593#endif
7594
7595 // D3D12_OPTIONS6
7596 BOOL AdditionalShadingRatesSupported() const noexcept;
7597 BOOL PerPrimitiveShadingRateSupportedWithViewportIndexing() const noexcept;
7598 D3D12_VARIABLE_SHADING_RATE_TIER VariableShadingRateTier() const noexcept;
7599 UINT ShadingRateImageTileSize() const noexcept;
7600 BOOL BackgroundProcessingSupported() const noexcept;
7601
7602 // QUERY_META_COMMAND
7603 HRESULT QueryMetaCommand(D3D12_FEATURE_DATA_QUERY_META_COMMAND& dQueryMetaCommand) const;
7604
7605 // D3D12_OPTIONS7
7606 D3D12_MESH_SHADER_TIER MeshShaderTier() const noexcept;
7607 D3D12_SAMPLER_FEEDBACK_TIER SamplerFeedbackTier() const noexcept;
7608
7609 // PROTECTED_RESOURCE_SESSION_TYPE_COUNT
7610 UINT ProtectedResourceSessionTypeCount(UINT NodeIndex = 0) const;
7611
7612 // PROTECTED_RESOURCE_SESSION_TYPES
7613 std::vector<GUID> ProtectedResourceSessionTypes(UINT NodeIndex = 0) const;
7614
7615#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 3)
7616 // D3D12_OPTIONS8
7617 BOOL UnalignedBlockTexturesSupported() const noexcept;
7618
7619 // D3D12_OPTIONS9
7620 BOOL MeshShaderPipelineStatsSupported() const noexcept;
7621 BOOL MeshShaderSupportsFullRangeRenderTargetArrayIndex() const noexcept;
7622 BOOL AtomicInt64OnTypedResourceSupported() const noexcept;
7623 BOOL AtomicInt64OnGroupSharedSupported() const noexcept;
7624 BOOL DerivativesInMeshAndAmplificationShadersSupported() const noexcept;
7625 D3D12_WAVE_MMA_TIER WaveMMATier() const noexcept;
7626#endif
7627
7628#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 4)
7629 // D3D12_OPTIONS10
7630 BOOL VariableRateShadingSumCombinerSupported() const noexcept;
7631 BOOL MeshShaderPerPrimitiveShadingRateSupported() const noexcept;
7632
7633 // D3D12_OPTIONS11
7634 BOOL AtomicInt64OnDescriptorHeapResourceSupported() const noexcept;
7635#endif
7636
7637#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 600)
7638 // D3D12_OPTIONS12
7639 D3D12_TRI_STATE MSPrimitivesPipelineStatisticIncludesCulledPrimitives() const noexcept;
7640 BOOL EnhancedBarriersSupported() const noexcept;
7641 BOOL RelaxedFormatCastingSupported() const noexcept;
7642#endif
7643
7644#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 602)
7645 // D3D12_OPTIONS13
7646 BOOL UnrestrictedBufferTextureCopyPitchSupported() const noexcept;
7647 BOOL UnrestrictedVertexElementAlignmentSupported() const noexcept;
7648 BOOL InvertedViewportHeightFlipsYSupported() const noexcept;
7649 BOOL InvertedViewportDepthFlipsZSupported() const noexcept;
7650 BOOL TextureCopyBetweenDimensionsSupported() const noexcept;
7651 BOOL AlphaBlendFactorSupported() const noexcept;
7652#endif
7653
7654#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
7655 // D3D12_OPTIONS14
7656 BOOL AdvancedTextureOpsSupported() const noexcept;
7657 BOOL WriteableMSAATexturesSupported() const noexcept;
7658 BOOL IndependentFrontAndBackStencilRefMaskSupported() const noexcept;
7659
7660 // D3D12_OPTIONS15
7661 BOOL TriangleFanSupported() const noexcept;
7662 BOOL DynamicIndexBufferStripCutSupported() const noexcept;
7663#endif
7664
7665#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
7666 // D3D12_OPTIONS16
7667 BOOL DynamicDepthBiasSupported() const noexcept;
7668#endif
7669
7670#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)
7671 BOOL GPUUploadHeapSupported() const noexcept;
7672
7673 // D3D12_OPTIONS17
7674 BOOL NonNormalizedCoordinateSamplersSupported() const noexcept;
7675 BOOL ManualWriteTrackingResourceSupported() const noexcept;
7676
7677 // D3D12_OPTIONS18
7678 BOOL RenderPassesValid() const noexcept;
7679#endif
7680
7681#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
7682 BOOL MismatchingOutputDimensionsSupported() const noexcept;
7683 UINT SupportedSampleCountsWithNoOutputs() const noexcept;
7684 BOOL PointSamplingAddressesNeverRoundUp() const noexcept;
7685 BOOL RasterizerDesc2Supported() const noexcept;
7686 BOOL NarrowQuadrilateralLinesSupported() const noexcept;
7687 BOOL AnisoFilterWithPointMipSupported() const noexcept;
7688 UINT MaxSamplerDescriptorHeapSize() const noexcept;
7689 UINT MaxSamplerDescriptorHeapSizeWithStaticSamplers() const noexcept;
7690 UINT MaxViewDescriptorHeapSize() const noexcept;
7691#endif
7692
7693#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 611)
7694 BOOL ComputeOnlyWriteWatchSupported() const noexcept;
7695#endif
7696
7697#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 612)
7698 D3D12_EXECUTE_INDIRECT_TIER ExecuteIndirectTier() const noexcept;
7699 D3D12_WORK_GRAPHS_TIER WorkGraphsTier() const noexcept;
7700#endif
7701
7702#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 617)
7703 D3D12_TIGHT_ALIGNMENT_TIER TightAlignmentSupportTier() const noexcept;
7704#endif
7705
7706private: // Private structs and helpers declaration
7707 struct ProtectedResourceSessionTypesLocal : D3D12_FEATURE_DATA_PROTECTED_RESOURCE_SESSION_TYPES
7708 {
7709 std::vector<GUID> TypeVec;
7710 };
7711
7712 // Helper function to decide the highest shader model supported by the system
7713 // Stores the result in m_dShaderModel
7714 // Must be updated whenever a new shader model is added to the d3d12.h header
7715 HRESULT QueryHighestShaderModel();
7716
7717 // Helper function to decide the highest root signature supported
7718 // Must be updated whenever a new root signature version is added to the d3d12.h header
7719 HRESULT QueryHighestRootSignatureVersion();
7720
7721 // Helper funcion to decide the highest feature level
7722 HRESULT QueryHighestFeatureLevel();
7723
7724 // Helper function to initialize local protected resource session types structs
7725 HRESULT QueryProtectedResourceSessionTypes(UINT NodeIndex, UINT Count);
7726
7727private: // Member data
7728 // Pointer to the underlying device
7729 ID3D12Device* m_pDevice;
7730
7731 // Stores the error code from initialization
7732 HRESULT m_hStatus;
7733
7734 // Feature support data structs
7735 D3D12_FEATURE_DATA_D3D12_OPTIONS m_dOptions;
7736 D3D_FEATURE_LEVEL m_eMaxFeatureLevel;
7737 D3D12_FEATURE_DATA_GPU_VIRTUAL_ADDRESS_SUPPORT m_dGPUVASupport;
7738 D3D12_FEATURE_DATA_SHADER_MODEL m_dShaderModel;
7739 D3D12_FEATURE_DATA_D3D12_OPTIONS1 m_dOptions1;
7740 std::vector<D3D12_FEATURE_DATA_PROTECTED_RESOURCE_SESSION_SUPPORT> m_dProtectedResourceSessionSupport;
7741 D3D12_FEATURE_DATA_ROOT_SIGNATURE m_dRootSignature;
7742 std::vector<D3D12_FEATURE_DATA_ARCHITECTURE1> m_dArchitecture1;
7743 D3D12_FEATURE_DATA_D3D12_OPTIONS2 m_dOptions2;
7744 D3D12_FEATURE_DATA_SHADER_CACHE m_dShaderCache;
7745 D3D12_FEATURE_DATA_COMMAND_QUEUE_PRIORITY m_dCommandQueuePriority;
7746 D3D12_FEATURE_DATA_D3D12_OPTIONS3 m_dOptions3;
7747 D3D12_FEATURE_DATA_EXISTING_HEAPS m_dExistingHeaps;
7748 D3D12_FEATURE_DATA_D3D12_OPTIONS4 m_dOptions4;
7749 std::vector<D3D12_FEATURE_DATA_SERIALIZATION> m_dSerialization; // Cat2 NodeIndex
7750 D3D12_FEATURE_DATA_CROSS_NODE m_dCrossNode;
7751 D3D12_FEATURE_DATA_D3D12_OPTIONS5 m_dOptions5;
7752#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 4)
7753 D3D12_FEATURE_DATA_DISPLAYABLE m_dDisplayable;
7754#endif
7755 D3D12_FEATURE_DATA_D3D12_OPTIONS6 m_dOptions6;
7756 D3D12_FEATURE_DATA_D3D12_OPTIONS7 m_dOptions7;
7757 std::vector<D3D12_FEATURE_DATA_PROTECTED_RESOURCE_SESSION_TYPE_COUNT> m_dProtectedResourceSessionTypeCount; // Cat2 NodeIndex
7758 std::vector<ProtectedResourceSessionTypesLocal> m_dProtectedResourceSessionTypes; // Cat3
7759#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 3)
7760 D3D12_FEATURE_DATA_D3D12_OPTIONS8 m_dOptions8;
7761 D3D12_FEATURE_DATA_D3D12_OPTIONS9 m_dOptions9;
7762#endif
7763#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 4)
7764 D3D12_FEATURE_DATA_D3D12_OPTIONS10 m_dOptions10;
7765 D3D12_FEATURE_DATA_D3D12_OPTIONS11 m_dOptions11;
7766#endif
7767#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 600)
7768 D3D12_FEATURE_DATA_D3D12_OPTIONS12 m_dOptions12;
7769#endif
7770#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 602)
7771 D3D12_FEATURE_DATA_D3D12_OPTIONS13 m_dOptions13;
7772#endif
7773#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
7774 D3D12_FEATURE_DATA_D3D12_OPTIONS14 m_dOptions14;
7775 D3D12_FEATURE_DATA_D3D12_OPTIONS15 m_dOptions15;
7776#endif
7777#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
7778 D3D12_FEATURE_DATA_D3D12_OPTIONS16 m_dOptions16;
7779#endif
7780#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)
7781 D3D12_FEATURE_DATA_D3D12_OPTIONS17 m_dOptions17;
7782#endif
7783#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)
7784 D3D12_FEATURE_DATA_D3D12_OPTIONS18 m_dOptions18;
7785#endif
7786#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
7787 D3D12_FEATURE_DATA_D3D12_OPTIONS19 m_dOptions19;
7788#endif
7789#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 611)
7790 D3D12_FEATURE_DATA_D3D12_OPTIONS20 m_dOptions20;
7791#endif
7792#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 612)
7793 D3D12_FEATURE_DATA_D3D12_OPTIONS21 m_dOptions21;
7794#endif
7795#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 617)
7796 D3D12_FEATURE_DATA_TIGHT_ALIGNMENT m_dTightAlignment;
7797#endif
7798};
7799
7800// Implementations for CD3DX12FeatureSupport functions
7801
7802// Macro to set up a getter function for each entry in feature support data
7803// The getter function will have the same name as the feature option name
7804#define FEATURE_SUPPORT_GET(RETTYPE,FEATURE,OPTION) \
7805inline RETTYPE CD3DX12FeatureSupport::OPTION() const noexcept \
7806{ \
7807 return FEATURE.OPTION; \
7808}
7809
7810// Macro to set up a getter function for each entry in feature support data
7811// Also specifies the name for the function which can be different from the feature name
7812#define FEATURE_SUPPORT_GET_NAME(RETTYPE,FEATURE,OPTION,NAME) \
7813inline RETTYPE CD3DX12FeatureSupport::NAME() const noexcept \
7814{\
7815 return FEATURE.OPTION; \
7816}
7817
7818// Macro to set up a getter function for feature data indexed by the graphics node ID
7819// The default parameter is 0, or the first availabe graphics device node
7820#define FEATURE_SUPPORT_GET_NODE_INDEXED(RETTYPE,FEATURE,OPTION) \
7821inline RETTYPE CD3DX12FeatureSupport::OPTION(UINT NodeIndex) const \
7822{\
7823 return FEATURE[NodeIndex].OPTION; \
7824}
7825
7826// Macro to set up a getter function for feature data indexed by NodeIndex
7827// Allows a custom name for the getter function
7828#define FEATURE_SUPPORT_GET_NODE_INDEXED_NAME(RETTYPE,FEATURE,OPTION,NAME) \
7829inline RETTYPE CD3DX12FeatureSupport::NAME(UINT NodeIndex) const \
7830{\
7831 return FEATURE[NodeIndex].OPTION; \
7832}
7833
7834inline CD3DX12FeatureSupport::CD3DX12FeatureSupport() noexcept
7835: m_pDevice(nullptr)
7836, m_hStatus(E_INVALIDARG)
7837, m_dOptions{}
7838, m_eMaxFeatureLevel{}
7839, m_dGPUVASupport{}
7840, m_dShaderModel{}
7841, m_dOptions1{}
7842, m_dRootSignature{}
7843, m_dOptions2{}
7844, m_dShaderCache{}
7845, m_dCommandQueuePriority{}
7846, m_dOptions3{}
7847, m_dExistingHeaps{}
7848, m_dOptions4{}
7849, m_dCrossNode{}
7850, m_dOptions5{}
7851#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 4)
7852, m_dDisplayable{}
7853#endif
7854, m_dOptions6{}
7855, m_dOptions7{}
7856#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 3)
7857, m_dOptions8{}
7858, m_dOptions9{}
7859#endif
7860#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 4)
7861, m_dOptions10{}
7862, m_dOptions11{}
7863#endif
7864#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 600)
7865, m_dOptions12{}
7866#endif
7867#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 602)
7868, m_dOptions13{}
7869#endif
7870#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
7871, m_dOptions14{}
7872, m_dOptions15{}
7873#endif
7874#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
7875, m_dOptions16{}
7876#endif
7877#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)
7878, m_dOptions17{}
7879#endif
7880#if defined (D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)
7881, m_dOptions18{}
7882#endif
7883#if defined (D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
7884, m_dOptions19{}
7885#endif
7886#if defined (D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 611)
7887, m_dOptions20{}
7888#endif
7889#if defined (D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 612)
7890, m_dOptions21{}
7891#endif
7892#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 617)
7893, m_dTightAlignment{}
7894#endif
7895{}
7896
7897inline HRESULT CD3DX12FeatureSupport::Init(ID3D12Device* pDevice)
7898{
7899 if (!pDevice)
7900 {
7901 m_hStatus = E_INVALIDARG;
7902 return m_hStatus;
7903 }
7904
7905 m_pDevice = pDevice;
7906
7907 // Initialize static feature support data structures
7908 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS, &m_dOptions, sizeof(m_dOptions))))
7909 {
7910 m_dOptions = {};
7911 }
7912
7913 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_GPU_VIRTUAL_ADDRESS_SUPPORT, &m_dGPUVASupport, sizeof(m_dGPUVASupport))))
7914 {
7915 m_dGPUVASupport = {};
7916 }
7917
7918 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS1, &m_dOptions1, sizeof(m_dOptions1))))
7919 {
7920 m_dOptions1 = {};
7921 }
7922
7923 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS2, &m_dOptions2, sizeof(m_dOptions2))))
7924 {
7925 m_dOptions2 = {};
7926 }
7927
7928 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_SHADER_CACHE, &m_dShaderCache, sizeof(m_dShaderCache))))
7929 {
7930 m_dShaderCache = {};
7931 }
7932
7933 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS3, &m_dOptions3, sizeof(m_dOptions3))))
7934 {
7935 m_dOptions3 = {};
7936 }
7937
7938 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_EXISTING_HEAPS, &m_dExistingHeaps, sizeof(m_dExistingHeaps))))
7939 {
7940 m_dExistingHeaps = {};
7941 }
7942
7943 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS4, &m_dOptions4, sizeof(m_dOptions4))))
7944 {
7945 m_dOptions4 = {};
7946 }
7947
7948 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_CROSS_NODE, &m_dCrossNode, sizeof(m_dCrossNode))))
7949 {
7950 m_dCrossNode = {};
7951 }
7952
7953 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS5, &m_dOptions5, sizeof(m_dOptions5))))
7954 {
7955 m_dOptions5 = {};
7956 }
7957
7958#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 4)
7959 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_DISPLAYABLE, &m_dDisplayable, sizeof(m_dDisplayable))))
7960 {
7961 m_dDisplayable = {};
7962 }
7963#endif
7964
7965 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS6, &m_dOptions6, sizeof(m_dOptions6))))
7966 {
7967 m_dOptions6 = {};
7968 }
7969
7970 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS7, &m_dOptions7, sizeof(m_dOptions7))))
7971 {
7972 m_dOptions7 = {};
7973 }
7974
7975#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 3)
7976 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS8, &m_dOptions8, sizeof(m_dOptions8))))
7977 {
7978 m_dOptions8 = {};
7979 }
7980
7981 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS9, &m_dOptions9, sizeof(m_dOptions9))))
7982 {
7983 m_dOptions9 = {};
7984 }
7985#endif
7986
7987#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 4)
7988 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS10, &m_dOptions10, sizeof(m_dOptions10))))
7989 {
7990 m_dOptions10 = {};
7991 }
7992
7993 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS11, &m_dOptions11, sizeof(m_dOptions11))))
7994 {
7995 m_dOptions11 = {};
7996 }
7997#endif
7998
7999#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 600)
8000 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS12, &m_dOptions12, sizeof(m_dOptions12))))
8001 {
8002 m_dOptions12 = {};
8003 m_dOptions12.MSPrimitivesPipelineStatisticIncludesCulledPrimitives = D3D12_TRI_STATE::D3D12_TRI_STATE_UNKNOWN;
8004 }
8005#endif
8006
8007#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 602)
8008 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS13, &m_dOptions13, sizeof(m_dOptions13))))
8009 {
8010 m_dOptions13 = {};
8011 }
8012#endif
8013
8014#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
8015 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS14, &m_dOptions14, sizeof(m_dOptions14))))
8016 {
8017 m_dOptions14 = {};
8018 }
8019
8020 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS15, &m_dOptions15, sizeof(m_dOptions15))))
8021 {
8022 m_dOptions15 = {};
8023 }
8024#endif
8025
8026#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
8027 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS16, &m_dOptions16, sizeof(m_dOptions16))))
8028 {
8029 m_dOptions16 = {};
8030 }
8031#endif
8032
8033#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)
8034 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS17, &m_dOptions17, sizeof(m_dOptions17))))
8035 {
8036 m_dOptions17 = {};
8037 }
8038
8039 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS18, &m_dOptions18, sizeof(m_dOptions18))))
8040 {
8041 m_dOptions18.RenderPassesValid = false;
8042 }
8043#endif
8044
8045#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
8046 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS19, &m_dOptions19, sizeof(m_dOptions19))))
8047 {
8048 m_dOptions19 = {};
8049 m_dOptions19.SupportedSampleCountsWithNoOutputs = 1;
8050 m_dOptions19.MaxSamplerDescriptorHeapSize = D3D12_MAX_SHADER_VISIBLE_SAMPLER_HEAP_SIZE;
8051 m_dOptions19.MaxSamplerDescriptorHeapSizeWithStaticSamplers = D3D12_MAX_SHADER_VISIBLE_SAMPLER_HEAP_SIZE;
8052 m_dOptions19.MaxViewDescriptorHeapSize = D3D12_MAX_SHADER_VISIBLE_DESCRIPTOR_HEAP_SIZE_TIER_1;
8053 }
8054#endif
8055
8056#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 611)
8057 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS20, &m_dOptions20, sizeof(m_dOptions20))))
8058 {
8059 m_dOptions20 = {};
8060 }
8061#endif
8062
8063#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 612)
8064 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS21, &m_dOptions21, sizeof(m_dOptions21))))
8065 {
8066 m_dOptions21 = {};
8067 }
8068#endif
8069
8070#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 617)
8071 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_TIGHT_ALIGNMENT, &m_dTightAlignment, sizeof(m_dTightAlignment))))
8072 {
8073 m_dTightAlignment = {};
8074 }
8075#endif
8076
8077 // Initialize per-node feature support data structures
8078 const UINT uNodeCount = m_pDevice->GetNodeCount();
8079 m_dProtectedResourceSessionSupport.resize(uNodeCount);
8080 m_dArchitecture1.resize(uNodeCount);
8081 m_dSerialization.resize(uNodeCount);
8082 m_dProtectedResourceSessionTypeCount.resize(uNodeCount);
8083 m_dProtectedResourceSessionTypes.resize(uNodeCount);
8084 for (UINT NodeIndex = 0; NodeIndex < uNodeCount; NodeIndex++)
8085 {
8086 m_dProtectedResourceSessionSupport[NodeIndex].NodeIndex = NodeIndex;
8087 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_PROTECTED_RESOURCE_SESSION_SUPPORT, &m_dProtectedResourceSessionSupport[NodeIndex], sizeof(m_dProtectedResourceSessionSupport[NodeIndex]))))
8088 {
8089 m_dProtectedResourceSessionSupport[NodeIndex].Support = D3D12_PROTECTED_RESOURCE_SESSION_SUPPORT_FLAG_NONE;
8090 }
8091
8092 m_dArchitecture1[NodeIndex].NodeIndex = NodeIndex;
8093 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_ARCHITECTURE1, &m_dArchitecture1[NodeIndex], sizeof(m_dArchitecture1[NodeIndex]))))
8094 {
8095 D3D12_FEATURE_DATA_ARCHITECTURE dArchLocal = {};
8096 dArchLocal.NodeIndex = NodeIndex;
8097 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_ARCHITECTURE, &dArchLocal, sizeof(dArchLocal))))
8098 {
8099 dArchLocal.TileBasedRenderer = false;
8100 dArchLocal.UMA = false;
8101 dArchLocal.CacheCoherentUMA = false;
8102 }
8103
8104 m_dArchitecture1[NodeIndex].TileBasedRenderer = dArchLocal.TileBasedRenderer;
8105 m_dArchitecture1[NodeIndex].UMA = dArchLocal.UMA;
8106 m_dArchitecture1[NodeIndex].CacheCoherentUMA = dArchLocal.CacheCoherentUMA;
8107 m_dArchitecture1[NodeIndex].IsolatedMMU = false;
8108 }
8109
8110 m_dSerialization[NodeIndex].NodeIndex = NodeIndex;
8111 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_SERIALIZATION, &m_dSerialization[NodeIndex], sizeof(m_dSerialization[NodeIndex]))))
8112 {
8113 m_dSerialization[NodeIndex].HeapSerializationTier = D3D12_HEAP_SERIALIZATION_TIER_0;
8114 }
8115
8116 m_dProtectedResourceSessionTypeCount[NodeIndex].NodeIndex = NodeIndex;
8117 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_PROTECTED_RESOURCE_SESSION_TYPE_COUNT, &m_dProtectedResourceSessionTypeCount[NodeIndex], sizeof(m_dProtectedResourceSessionTypeCount[NodeIndex]))))
8118 {
8119 m_dProtectedResourceSessionTypeCount[NodeIndex].Count = 0;
8120 }
8121
8122 // Special procedure to initialize local protected resource session types structs
8123 // Must wait until session type count initialized
8124 QueryProtectedResourceSessionTypes(NodeIndex, m_dProtectedResourceSessionTypeCount[NodeIndex].Count);
8125 }
8126
8127 // Initialize features that requires highest version check
8128 if (FAILED(m_hStatus = QueryHighestShaderModel()))
8129 {
8130 return m_hStatus;
8131 }
8132
8133 if (FAILED(m_hStatus = QueryHighestRootSignatureVersion()))
8134 {
8135 return m_hStatus;
8136 }
8137
8138 // Initialize Feature Levels data
8139 if (FAILED(m_hStatus = QueryHighestFeatureLevel()))
8140 {
8141 return m_hStatus;
8142 }
8143
8144 return m_hStatus;
8145}
8146
8147// 0: D3D12_OPTIONS
8148FEATURE_SUPPORT_GET(BOOL, m_dOptions, DoublePrecisionFloatShaderOps);
8149FEATURE_SUPPORT_GET(BOOL, m_dOptions, OutputMergerLogicOp);
8150FEATURE_SUPPORT_GET(D3D12_SHADER_MIN_PRECISION_SUPPORT, m_dOptions, MinPrecisionSupport);
8151FEATURE_SUPPORT_GET(D3D12_TILED_RESOURCES_TIER, m_dOptions, TiledResourcesTier);
8152FEATURE_SUPPORT_GET(D3D12_RESOURCE_BINDING_TIER, m_dOptions, ResourceBindingTier);
8153FEATURE_SUPPORT_GET(BOOL, m_dOptions, PSSpecifiedStencilRefSupported);
8154FEATURE_SUPPORT_GET(BOOL, m_dOptions, TypedUAVLoadAdditionalFormats);
8155FEATURE_SUPPORT_GET(BOOL, m_dOptions, ROVsSupported);
8156FEATURE_SUPPORT_GET(D3D12_CONSERVATIVE_RASTERIZATION_TIER, m_dOptions, ConservativeRasterizationTier);
8157FEATURE_SUPPORT_GET(BOOL, m_dOptions, StandardSwizzle64KBSupported);
8158FEATURE_SUPPORT_GET(BOOL, m_dOptions, CrossAdapterRowMajorTextureSupported);
8159FEATURE_SUPPORT_GET(BOOL, m_dOptions, VPAndRTArrayIndexFromAnyShaderFeedingRasterizerSupportedWithoutGSEmulation);
8160FEATURE_SUPPORT_GET(D3D12_RESOURCE_HEAP_TIER, m_dOptions, ResourceHeapTier);
8161
8162// Special procedure for handling caps that is also part of other features
8163inline D3D12_CROSS_NODE_SHARING_TIER CD3DX12FeatureSupport::CrossNodeSharingTier() const noexcept
8164{
8165 if (m_dCrossNode.SharingTier > D3D12_CROSS_NODE_SHARING_TIER_NOT_SUPPORTED)
8166 {
8167 return m_dCrossNode.SharingTier;
8168 }
8169 else
8170 {
8171 return m_dOptions.CrossNodeSharingTier;
8172 }
8173}
8174
8175inline UINT CD3DX12FeatureSupport::MaxGPUVirtualAddressBitsPerResource() const noexcept
8176{
8177 if (m_dOptions.MaxGPUVirtualAddressBitsPerResource > 0)
8178 {
8179 return m_dOptions.MaxGPUVirtualAddressBitsPerResource;
8180 }
8181 else
8182 {
8183 return m_dGPUVASupport.MaxGPUVirtualAddressBitsPerResource;
8184 }
8185}
8186
8187// 1: Architecture
8188// Combined with Architecture1
8189
8190// 2: Feature Levels
8191// Simply returns the highest supported feature level
8192inline D3D_FEATURE_LEVEL CD3DX12FeatureSupport::MaxSupportedFeatureLevel() const noexcept
8193{
8194 return m_eMaxFeatureLevel;
8195}
8196
8197// 3: Feature Format Support
8198inline HRESULT CD3DX12FeatureSupport::FormatSupport(DXGI_FORMAT Format, D3D12_FORMAT_SUPPORT1& Support1, D3D12_FORMAT_SUPPORT2& Support2) const
8199{
8200 D3D12_FEATURE_DATA_FORMAT_SUPPORT dFormatSupport;
8201 dFormatSupport.Format = Format;
8202
8203 // It is possible that the function call returns an error
8204 HRESULT result = m_pDevice->CheckFeatureSupport(D3D12_FEATURE_FORMAT_SUPPORT, &dFormatSupport, sizeof(D3D12_FEATURE_DATA_FORMAT_SUPPORT));
8205
8206 Support1 = dFormatSupport.Support1;
8207 Support2 = dFormatSupport.Support2; // Two outputs. Probably better just to take in the struct as an argument?
8208
8209 return result;
8210}
8211
8212// 4: Multisample Quality Levels
8213inline HRESULT CD3DX12FeatureSupport::MultisampleQualityLevels(DXGI_FORMAT Format, UINT SampleCount, D3D12_MULTISAMPLE_QUALITY_LEVEL_FLAGS Flags, UINT& NumQualityLevels) const
8214{
8215 D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS dMultisampleQualityLevels;
8216 dMultisampleQualityLevels.Format = Format;
8217 dMultisampleQualityLevels.SampleCount = SampleCount;
8218 dMultisampleQualityLevels.Flags = Flags;
8219
8220 HRESULT result = m_pDevice->CheckFeatureSupport(D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS, &dMultisampleQualityLevels, sizeof(D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS));
8221
8222 if (SUCCEEDED(result))
8223 {
8224 NumQualityLevels = dMultisampleQualityLevels.NumQualityLevels;
8225 }
8226 else
8227 {
8228 NumQualityLevels = 0;
8229 }
8230
8231 return result;
8232}
8233
8234// 5: Format Info
8235inline HRESULT CD3DX12FeatureSupport::FormatInfo(DXGI_FORMAT Format, UINT8& PlaneCount) const
8236{
8237 D3D12_FEATURE_DATA_FORMAT_INFO dFormatInfo;
8238 dFormatInfo.Format = Format;
8239
8240 HRESULT result = m_pDevice->CheckFeatureSupport(D3D12_FEATURE_FORMAT_INFO, &dFormatInfo, sizeof(D3D12_FEATURE_DATA_FORMAT_INFO));
8241 if (FAILED(result))
8242 {
8243 PlaneCount = 0;
8244 }
8245 else
8246 {
8247 PlaneCount = dFormatInfo.PlaneCount;
8248 }
8249 return result;
8250}
8251
8252// 6: GPU Virtual Address Support
8253// MaxGPUVirtualAddressBitsPerResource handled in D3D12Options
8254FEATURE_SUPPORT_GET(UINT, m_dGPUVASupport, MaxGPUVirtualAddressBitsPerProcess);
8255
8256// 7: Shader Model
8257inline D3D_SHADER_MODEL CD3DX12FeatureSupport::HighestShaderModel() const noexcept
8258{
8259 return m_dShaderModel.HighestShaderModel;
8260}
8261
8262// 8: D3D12 Options1
8263FEATURE_SUPPORT_GET(BOOL, m_dOptions1, WaveOps);
8264FEATURE_SUPPORT_GET(UINT, m_dOptions1, WaveLaneCountMin);
8265FEATURE_SUPPORT_GET(UINT, m_dOptions1, WaveLaneCountMax);
8266FEATURE_SUPPORT_GET(UINT, m_dOptions1, TotalLaneCount);
8267FEATURE_SUPPORT_GET(BOOL, m_dOptions1, ExpandedComputeResourceStates);
8268FEATURE_SUPPORT_GET(BOOL, m_dOptions1, Int64ShaderOps);
8269
8270// 10: Protected Resource Session Support
8271inline D3D12_PROTECTED_RESOURCE_SESSION_SUPPORT_FLAGS CD3DX12FeatureSupport::ProtectedResourceSessionSupport(UINT NodeIndex) const
8272{
8273 return m_dProtectedResourceSessionSupport[NodeIndex].Support;
8274}
8275
8276// 12: Root Signature
8277inline D3D_ROOT_SIGNATURE_VERSION CD3DX12FeatureSupport::HighestRootSignatureVersion() const noexcept
8278{
8279 return m_dRootSignature.HighestVersion;
8280}
8281
8282// 16: Architecture1
8283// Same data fields can be queried from m_dArchitecture
8284FEATURE_SUPPORT_GET_NODE_INDEXED(BOOL, m_dArchitecture1, TileBasedRenderer);
8285FEATURE_SUPPORT_GET_NODE_INDEXED(BOOL, m_dArchitecture1, UMA);
8286FEATURE_SUPPORT_GET_NODE_INDEXED(BOOL, m_dArchitecture1, CacheCoherentUMA);
8287FEATURE_SUPPORT_GET_NODE_INDEXED(BOOL, m_dArchitecture1, IsolatedMMU);
8288
8289// 18: D3D12 Options2
8290FEATURE_SUPPORT_GET(BOOL, m_dOptions2, DepthBoundsTestSupported);
8291FEATURE_SUPPORT_GET(D3D12_PROGRAMMABLE_SAMPLE_POSITIONS_TIER, m_dOptions2, ProgrammableSamplePositionsTier);
8292
8293// 19: Shader Cache
8294FEATURE_SUPPORT_GET_NAME(D3D12_SHADER_CACHE_SUPPORT_FLAGS, m_dShaderCache, SupportFlags, ShaderCacheSupportFlags);
8295
8296// 20: Command Queue Priority
8297inline BOOL CD3DX12FeatureSupport::CommandQueuePrioritySupported(D3D12_COMMAND_LIST_TYPE CommandListType, UINT Priority)
8298{
8299 m_dCommandQueuePriority.CommandListType = CommandListType;
8300 m_dCommandQueuePriority.Priority = Priority;
8301
8302 if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_COMMAND_QUEUE_PRIORITY, &m_dCommandQueuePriority, sizeof(D3D12_FEATURE_DATA_COMMAND_QUEUE_PRIORITY))))
8303 {
8304 return false;
8305 }
8306
8307 return m_dCommandQueuePriority.PriorityForTypeIsSupported;
8308}
8309
8310// 21: D3D12 Options3
8311FEATURE_SUPPORT_GET(BOOL, m_dOptions3, CopyQueueTimestampQueriesSupported);
8312FEATURE_SUPPORT_GET(BOOL, m_dOptions3, CastingFullyTypedFormatSupported);
8313FEATURE_SUPPORT_GET(D3D12_COMMAND_LIST_SUPPORT_FLAGS, m_dOptions3, WriteBufferImmediateSupportFlags);
8314FEATURE_SUPPORT_GET(D3D12_VIEW_INSTANCING_TIER, m_dOptions3, ViewInstancingTier);
8315FEATURE_SUPPORT_GET(BOOL, m_dOptions3, BarycentricsSupported);
8316
8317// 22: Existing Heaps
8318FEATURE_SUPPORT_GET_NAME(BOOL, m_dExistingHeaps, Supported, ExistingHeapsSupported);
8319
8320// 23: D3D12 Options4
8321FEATURE_SUPPORT_GET(BOOL, m_dOptions4, MSAA64KBAlignedTextureSupported);
8322FEATURE_SUPPORT_GET(D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER, m_dOptions4, SharedResourceCompatibilityTier);
8323FEATURE_SUPPORT_GET(BOOL, m_dOptions4, Native16BitShaderOpsSupported);
8324
8325// 24: Serialization
8326FEATURE_SUPPORT_GET_NODE_INDEXED(D3D12_HEAP_SERIALIZATION_TIER, m_dSerialization, HeapSerializationTier);
8327
8328// 25: Cross Node
8329// CrossNodeSharingTier handled in D3D12Options
8330FEATURE_SUPPORT_GET_NAME(BOOL, m_dCrossNode, AtomicShaderInstructions, CrossNodeAtomicShaderInstructions);
8331
8332// 27: D3D12 Options5
8333FEATURE_SUPPORT_GET(BOOL, m_dOptions5, SRVOnlyTiledResourceTier3);
8334FEATURE_SUPPORT_GET(D3D12_RENDER_PASS_TIER, m_dOptions5, RenderPassesTier);
8335FEATURE_SUPPORT_GET(D3D12_RAYTRACING_TIER, m_dOptions5, RaytracingTier);
8336
8337#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 4)
8338// 28: Displayable
8339FEATURE_SUPPORT_GET(BOOL, m_dDisplayable, DisplayableTexture);
8340// SharedResourceCompatibilityTier handled in D3D12Options4
8341#endif
8342
8343// 30: D3D12 Options6
8344FEATURE_SUPPORT_GET(BOOL, m_dOptions6, AdditionalShadingRatesSupported);
8345FEATURE_SUPPORT_GET(BOOL, m_dOptions6, PerPrimitiveShadingRateSupportedWithViewportIndexing);
8346FEATURE_SUPPORT_GET(D3D12_VARIABLE_SHADING_RATE_TIER, m_dOptions6, VariableShadingRateTier);
8347FEATURE_SUPPORT_GET(UINT, m_dOptions6, ShadingRateImageTileSize);
8348FEATURE_SUPPORT_GET(BOOL, m_dOptions6, BackgroundProcessingSupported);
8349
8350// 31: Query Meta Command
8351// Keep the original call routine
8352inline HRESULT CD3DX12FeatureSupport::QueryMetaCommand(D3D12_FEATURE_DATA_QUERY_META_COMMAND& dQueryMetaCommand) const
8353{
8354 return m_pDevice->CheckFeatureSupport(D3D12_FEATURE_QUERY_META_COMMAND, &dQueryMetaCommand, sizeof(D3D12_FEATURE_DATA_QUERY_META_COMMAND));
8355}
8356
8357// 32: D3D12 Options7
8358FEATURE_SUPPORT_GET(D3D12_MESH_SHADER_TIER, m_dOptions7, MeshShaderTier);
8359FEATURE_SUPPORT_GET(D3D12_SAMPLER_FEEDBACK_TIER, m_dOptions7, SamplerFeedbackTier);
8360
8361// 33: Protected Resource Session Type Count
8362FEATURE_SUPPORT_GET_NODE_INDEXED_NAME(UINT, m_dProtectedResourceSessionTypeCount, Count, ProtectedResourceSessionTypeCount);
8363
8364// 34: Protected Resource Session Types
8365FEATURE_SUPPORT_GET_NODE_INDEXED_NAME(std::vector<GUID>, m_dProtectedResourceSessionTypes, TypeVec, ProtectedResourceSessionTypes);
8366
8367#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 3)
8368// 36: Options8
8369FEATURE_SUPPORT_GET(BOOL, m_dOptions8, UnalignedBlockTexturesSupported);
8370
8371// 37: Options9
8372FEATURE_SUPPORT_GET(BOOL, m_dOptions9, MeshShaderPipelineStatsSupported);
8373FEATURE_SUPPORT_GET(BOOL, m_dOptions9, MeshShaderSupportsFullRangeRenderTargetArrayIndex);
8374FEATURE_SUPPORT_GET(BOOL, m_dOptions9, AtomicInt64OnTypedResourceSupported);
8375FEATURE_SUPPORT_GET(BOOL, m_dOptions9, AtomicInt64OnGroupSharedSupported);
8376FEATURE_SUPPORT_GET(BOOL, m_dOptions9, DerivativesInMeshAndAmplificationShadersSupported);
8377FEATURE_SUPPORT_GET(D3D12_WAVE_MMA_TIER, m_dOptions9, WaveMMATier);
8378#endif
8379
8380#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 4)
8381// 39: Options10
8382FEATURE_SUPPORT_GET(BOOL, m_dOptions10, VariableRateShadingSumCombinerSupported);
8383FEATURE_SUPPORT_GET(BOOL, m_dOptions10, MeshShaderPerPrimitiveShadingRateSupported);
8384
8385// 40: Options11
8386FEATURE_SUPPORT_GET(BOOL, m_dOptions11, AtomicInt64OnDescriptorHeapResourceSupported);
8387#endif
8388
8389#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 600)
8390// 41: Options12
8391FEATURE_SUPPORT_GET(D3D12_TRI_STATE, m_dOptions12, MSPrimitivesPipelineStatisticIncludesCulledPrimitives);
8392FEATURE_SUPPORT_GET(BOOL, m_dOptions12, EnhancedBarriersSupported);
8393FEATURE_SUPPORT_GET(BOOL, m_dOptions12, RelaxedFormatCastingSupported);
8394#endif
8395
8396#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 602)
8397// 42: Options13
8398FEATURE_SUPPORT_GET(BOOL, m_dOptions13, UnrestrictedBufferTextureCopyPitchSupported);
8399FEATURE_SUPPORT_GET(BOOL, m_dOptions13, UnrestrictedVertexElementAlignmentSupported);
8400FEATURE_SUPPORT_GET(BOOL, m_dOptions13, InvertedViewportHeightFlipsYSupported);
8401FEATURE_SUPPORT_GET(BOOL, m_dOptions13, InvertedViewportDepthFlipsZSupported);
8402FEATURE_SUPPORT_GET(BOOL, m_dOptions13, TextureCopyBetweenDimensionsSupported);
8403FEATURE_SUPPORT_GET(BOOL, m_dOptions13, AlphaBlendFactorSupported);
8404#endif
8405
8406#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
8407// 43: Options14
8408FEATURE_SUPPORT_GET(BOOL, m_dOptions14, AdvancedTextureOpsSupported);
8409FEATURE_SUPPORT_GET(BOOL, m_dOptions14, WriteableMSAATexturesSupported);
8410FEATURE_SUPPORT_GET(BOOL, m_dOptions14, IndependentFrontAndBackStencilRefMaskSupported);
8411
8412// 44: Options15
8413FEATURE_SUPPORT_GET(BOOL, m_dOptions15, TriangleFanSupported);
8414FEATURE_SUPPORT_GET(BOOL, m_dOptions15, DynamicIndexBufferStripCutSupported);
8415#endif
8416
8417#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 608)
8418// 45: Options16
8419FEATURE_SUPPORT_GET(BOOL, m_dOptions16, DynamicDepthBiasSupported);
8420#endif
8421#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)
8422FEATURE_SUPPORT_GET(BOOL, m_dOptions16, GPUUploadHeapSupported);
8423
8424// 46: Options17
8425FEATURE_SUPPORT_GET(BOOL, m_dOptions17, NonNormalizedCoordinateSamplersSupported);
8426FEATURE_SUPPORT_GET(BOOL, m_dOptions17, ManualWriteTrackingResourceSupported);
8427
8428// 47: Option18
8429FEATURE_SUPPORT_GET(BOOL, m_dOptions18, RenderPassesValid);
8430#endif
8431
8432#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 610)
8433FEATURE_SUPPORT_GET(BOOL, m_dOptions19, MismatchingOutputDimensionsSupported);
8434FEATURE_SUPPORT_GET(UINT, m_dOptions19, SupportedSampleCountsWithNoOutputs);
8435FEATURE_SUPPORT_GET(BOOL, m_dOptions19, PointSamplingAddressesNeverRoundUp);
8436FEATURE_SUPPORT_GET(BOOL, m_dOptions19, RasterizerDesc2Supported);
8437FEATURE_SUPPORT_GET(BOOL, m_dOptions19, NarrowQuadrilateralLinesSupported);
8438FEATURE_SUPPORT_GET(BOOL, m_dOptions19, AnisoFilterWithPointMipSupported);
8439FEATURE_SUPPORT_GET(UINT, m_dOptions19, MaxSamplerDescriptorHeapSize);
8440FEATURE_SUPPORT_GET(UINT, m_dOptions19, MaxSamplerDescriptorHeapSizeWithStaticSamplers);
8441FEATURE_SUPPORT_GET(UINT, m_dOptions19, MaxViewDescriptorHeapSize);
8442#endif
8443
8444#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 611)
8445// 49: Options20
8446FEATURE_SUPPORT_GET(BOOL, m_dOptions20, ComputeOnlyWriteWatchSupported);
8447#endif
8448
8449#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 612)
8450// 50: Options21
8451FEATURE_SUPPORT_GET(D3D12_EXECUTE_INDIRECT_TIER, m_dOptions21, ExecuteIndirectTier);
8452FEATURE_SUPPORT_GET(D3D12_WORK_GRAPHS_TIER, m_dOptions21, WorkGraphsTier);
8453#endif
8454
8455#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 617)
8456// 51: TightAlignment
8457FEATURE_SUPPORT_GET_NAME(D3D12_TIGHT_ALIGNMENT_TIER, m_dTightAlignment, SupportTier, TightAlignmentSupportTier);
8458#endif
8459
8460// Helper function to decide the highest shader model supported by the system
8461// Stores the result in m_dShaderModel
8462// Must be updated whenever a new shader model is added to the d3d12.h header
8463inline HRESULT CD3DX12FeatureSupport::QueryHighestShaderModel()
8464{
8465 // Check support in descending order
8466 HRESULT result;
8467
8468 const D3D_SHADER_MODEL allModelVersions[] =
8469 {
8470#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 612)
8471 D3D_SHADER_MODEL_6_9,
8472#endif
8473#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 606)
8474 D3D_SHADER_MODEL_6_8,
8475#endif
8476#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 3)
8477 D3D_SHADER_MODEL_6_7,
8478#endif
8479 D3D_SHADER_MODEL_6_6,
8480 D3D_SHADER_MODEL_6_5,
8481 D3D_SHADER_MODEL_6_4,
8482 D3D_SHADER_MODEL_6_3,
8483 D3D_SHADER_MODEL_6_2,
8484 D3D_SHADER_MODEL_6_1,
8485 D3D_SHADER_MODEL_6_0,
8486 D3D_SHADER_MODEL_5_1
8487 };
8488 constexpr size_t numModelVersions = sizeof(allModelVersions) / sizeof(D3D_SHADER_MODEL);
8489
8490 for (size_t i = 0; i < numModelVersions; i++)
8491 {
8492 m_dShaderModel.HighestShaderModel = allModelVersions[i];
8493 result = m_pDevice->CheckFeatureSupport(D3D12_FEATURE_SHADER_MODEL, &m_dShaderModel, sizeof(D3D12_FEATURE_DATA_SHADER_MODEL));
8494 if (result != E_INVALIDARG)
8495 {
8496 // Indicates that the version is recognizable by the runtime and stored in the struct
8497 // Also terminate on unexpected error code
8498 if (FAILED(result))
8499 {
8500 m_dShaderModel.HighestShaderModel = static_cast<D3D_SHADER_MODEL>(0);
8501 }
8502 return result;
8503 }
8504 }
8505
8506 // Shader model may not be supported. Continue the rest initializations
8507 m_dShaderModel.HighestShaderModel = static_cast<D3D_SHADER_MODEL>(0);
8508 return S_OK;
8509}
8510
8511// Helper function to decide the highest root signature supported
8512// Must be updated whenever a new root signature version is added to the d3d12.h header
8513inline HRESULT CD3DX12FeatureSupport::QueryHighestRootSignatureVersion()
8514{
8515 HRESULT result;
8516
8517 const D3D_ROOT_SIGNATURE_VERSION allRootSignatureVersions[] =
8518 {
8519#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)
8520 D3D_ROOT_SIGNATURE_VERSION_1_2,
8521#endif
8522 D3D_ROOT_SIGNATURE_VERSION_1_1,
8523 D3D_ROOT_SIGNATURE_VERSION_1_0,
8524 D3D_ROOT_SIGNATURE_VERSION_1,
8525 };
8526 constexpr size_t numRootSignatureVersions = sizeof(allRootSignatureVersions) / sizeof(D3D_ROOT_SIGNATURE_VERSION);
8527
8528 for (size_t i = 0; i < numRootSignatureVersions; i++)
8529 {
8530 m_dRootSignature.HighestVersion = allRootSignatureVersions[i];
8531 result = m_pDevice->CheckFeatureSupport(D3D12_FEATURE_ROOT_SIGNATURE, &m_dRootSignature, sizeof(D3D12_FEATURE_DATA_ROOT_SIGNATURE));
8532 if (result != E_INVALIDARG)
8533 {
8534 if (FAILED(result))
8535 {
8536 m_dRootSignature.HighestVersion = static_cast<D3D_ROOT_SIGNATURE_VERSION>(0);
8537 }
8538 // If succeeded, the highest version is already written into the member struct
8539 return result;
8540 }
8541 }
8542
8543 // No version left. Set to invalid value and continue.
8544 m_dRootSignature.HighestVersion = static_cast<D3D_ROOT_SIGNATURE_VERSION>(0);
8545 return S_OK;
8546}
8547
8548// Helper funcion to decide the highest feature level
8549inline HRESULT CD3DX12FeatureSupport::QueryHighestFeatureLevel()
8550{
8551 HRESULT result;
8552
8553 // Check against a list of all feature levels present in d3dcommon.h
8554 // Needs to be updated for future feature levels
8555 const D3D_FEATURE_LEVEL allLevels[] =
8556 {
8557#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 3)
8558 D3D_FEATURE_LEVEL_12_2,
8559#endif
8560 D3D_FEATURE_LEVEL_12_1,
8561 D3D_FEATURE_LEVEL_12_0,
8562 D3D_FEATURE_LEVEL_11_1,
8563 D3D_FEATURE_LEVEL_11_0,
8564 D3D_FEATURE_LEVEL_10_1,
8565 D3D_FEATURE_LEVEL_10_0,
8566 D3D_FEATURE_LEVEL_9_3,
8567 D3D_FEATURE_LEVEL_9_2,
8568 D3D_FEATURE_LEVEL_9_1,
8569#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 5)
8570 D3D_FEATURE_LEVEL_1_0_CORE,
8571#endif
8572#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 611)
8573 D3D_FEATURE_LEVEL_1_0_GENERIC
8574#endif
8575 };
8576
8577 D3D12_FEATURE_DATA_FEATURE_LEVELS dFeatureLevel;
8578 dFeatureLevel.NumFeatureLevels = static_cast<UINT>(sizeof(allLevels) / sizeof(D3D_FEATURE_LEVEL));
8579 dFeatureLevel.pFeatureLevelsRequested = allLevels;
8580
8581 result = m_pDevice->CheckFeatureSupport(D3D12_FEATURE_FEATURE_LEVELS, &dFeatureLevel, sizeof(D3D12_FEATURE_DATA_FEATURE_LEVELS));
8582 if (SUCCEEDED(result))
8583 {
8584 m_eMaxFeatureLevel = dFeatureLevel.MaxSupportedFeatureLevel;
8585 }
8586 else
8587 {
8588 m_eMaxFeatureLevel = static_cast<D3D_FEATURE_LEVEL>(0);
8589
8590 if (result == DXGI_ERROR_UNSUPPORTED)
8591 {
8592 // Indicates that none supported. Continue initialization
8593 result = S_OK;
8594 }
8595 }
8596 return result;
8597}
8598
8599// Helper function to initialize local protected resource session types structs
8600inline HRESULT CD3DX12FeatureSupport::QueryProtectedResourceSessionTypes(UINT NodeIndex, UINT Count)
8601{
8602 auto& CurrentPRSTypes = m_dProtectedResourceSessionTypes[NodeIndex];
8603 CurrentPRSTypes.NodeIndex = NodeIndex;
8604 CurrentPRSTypes.Count = Count;
8605 CurrentPRSTypes.TypeVec.resize(CurrentPRSTypes.Count);
8606 CurrentPRSTypes.pTypes = CurrentPRSTypes.TypeVec.data();
8607
8608 HRESULT result = m_pDevice->CheckFeatureSupport(D3D12_FEATURE_PROTECTED_RESOURCE_SESSION_TYPES, &m_dProtectedResourceSessionTypes[NodeIndex], sizeof(D3D12_FEATURE_DATA_PROTECTED_RESOURCE_SESSION_TYPES));
8609 if (FAILED(result))
8610 {
8611 // Resize TypeVec to empty
8612 CurrentPRSTypes.TypeVec.clear();
8613 }
8614
8615 return result;
8616}
8617
8618#undef FEATURE_SUPPORT_GET
8619#undef FEATURE_SUPPORT_GET_NAME
8620#undef FEATURE_SUPPORT_GET_NODE_INDEXED
8621#undef FEATURE_SUPPORT_GET_NODE_INDEXED_NAME
8622
8623// end CD3DX12FeatureSupport
8624
8625#endif // !D3DX12_NO_CHECK_FEATURE_SUPPORT_CLASS
8626
8627#undef D3DX12_COM_PTR
8628#undef D3DX12_COM_PTR_GET
8629#undef D3DX12_COM_PTR_ADDRESSOF
8630
8631#ifdef __clang__
8632#pragma clang diagnostic pop
8633#endif
8634
8635#endif // defined( __cplusplus )
8636
8637#endif //__D3DX12_H__
8638
static DX12ShaderRegister< DefaultVertexShader > V
Definition DefaultShader.cpp:10
bool operator==(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
Definition json.hpp:14737
bool operator!=(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
Definition json.hpp:14762
str width
Definition enums.py:209
Dimension dimension(FlexDirection flexDirection)
Definition FlexDirection.h:105
Dimension
Definition Dimension.h:18
uint8_t Type
Definition slang-gfx.h:1359
FillMode
Definition slang-gfx.h:1265
size_t Offset
Definition slang-gfx.h:56
CullMode
Definition slang-gfx.h:1271
SlangResult Result
Definition slang-gfx.h:47
Format
Definition slang-gfx.h:336
Definition json.hpp:5363
UINT32
Definition slang-image-format-defs.h:36
INT64
Definition slang-image-format-defs.h:47
UINT64
Definition slang-image-format-defs.h:46
UINT16
Definition slang-image-format-defs.h:14
UINT8
Definition slang-image-format-defs.h:16
#define SIZE_MAX
Definition slang-llvm.h:364
Definition slang-cpp-types.h:104