1 //////////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (C) Microsoft Corporation. All Rights Reserved.
4 //
5 // File: d3dx12.h
6 // Content: D3DX12 utility library
7 //
8 //////////////////////////////////////////////////////////////////////////////
9
10 #ifndef __D3DX12_H__
11 #define __D3DX12_H__
12
13 #include "d3d12.h"
14
15 #if defined( __cplusplus )
16
17 struct CD3DX12_DEFAULT {};
18 extern const DECLSPEC_SELECTANY CD3DX12_DEFAULT D3D12_DEFAULT;
19
20 //------------------------------------------------------------------------------------------------
21 inline bool operator==( const D3D12_VIEWPORT& l, const D3D12_VIEWPORT& r )
22 {
23 return l.TopLeftX == r.TopLeftX && l.TopLeftY == r.TopLeftY && l.Width == r.Width &&
24 l.Height == r.Height && l.MinDepth == r.MinDepth && l.MaxDepth == r.MaxDepth;
25 }
26
27 //------------------------------------------------------------------------------------------------
28 inline bool operator!=( const D3D12_VIEWPORT& l, const D3D12_VIEWPORT& r )
29 { return !( l == r ); }
30
31 //------------------------------------------------------------------------------------------------
32 struct CD3DX12_RECT : public D3D12_RECT
33 {
CD3DX12_RECTCD3DX12_RECT34 CD3DX12_RECT()
35 {}
CD3DX12_RECTCD3DX12_RECT36 explicit CD3DX12_RECT( const D3D12_RECT& o ) :
37 D3D12_RECT( o )
38 {}
CD3DX12_RECTCD3DX12_RECT39 explicit CD3DX12_RECT(
40 LONG Left,
41 LONG Top,
42 LONG Right,
43 LONG Bottom )
44 {
45 left = Left;
46 top = Top;
47 right = Right;
48 bottom = Bottom;
49 }
~CD3DX12_RECTCD3DX12_RECT50 ~CD3DX12_RECT() {}
51 // operator const D3D12_RECT&() const { return *this; }
52 };
53
54 //------------------------------------------------------------------------------------------------
55 struct CD3DX12_BOX : public D3D12_BOX
56 {
CD3DX12_BOXCD3DX12_BOX57 CD3DX12_BOX()
58 {}
CD3DX12_BOXCD3DX12_BOX59 explicit CD3DX12_BOX( const D3D12_BOX& o ) :
60 D3D12_BOX( o )
61 {}
CD3DX12_BOXCD3DX12_BOX62 explicit CD3DX12_BOX(
63 LONG Left,
64 LONG Right )
65 {
66 left = Left;
67 top = 0;
68 front = 0;
69 right = Right;
70 bottom = 1;
71 back = 1;
72 }
CD3DX12_BOXCD3DX12_BOX73 explicit CD3DX12_BOX(
74 LONG Left,
75 LONG Top,
76 LONG Right,
77 LONG Bottom )
78 {
79 left = Left;
80 top = Top;
81 front = 0;
82 right = Right;
83 bottom = Bottom;
84 back = 1;
85 }
CD3DX12_BOXCD3DX12_BOX86 explicit CD3DX12_BOX(
87 LONG Left,
88 LONG Top,
89 LONG Front,
90 LONG Right,
91 LONG Bottom,
92 LONG Back )
93 {
94 left = Left;
95 top = Top;
96 front = Front;
97 right = Right;
98 bottom = Bottom;
99 back = Back;
100 }
~CD3DX12_BOXCD3DX12_BOX101 ~CD3DX12_BOX() {}
102 // operator const D3D12_BOX&() const { return *this; }
103 };
104 inline bool operator==( const D3D12_BOX& l, const D3D12_BOX& r )
105 {
106 return l.left == r.left && l.top == r.top && l.front == r.front &&
107 l.right == r.right && l.bottom == r.bottom && l.back == r.back;
108 }
109 inline bool operator!=( const D3D12_BOX& l, const D3D12_BOX& r )
110 { return !( l == r ); }
111
112 //------------------------------------------------------------------------------------------------
113 struct CD3DX12_DEPTH_STENCIL_DESC : public D3D12_DEPTH_STENCIL_DESC
114 {
CD3DX12_DEPTH_STENCIL_DESCCD3DX12_DEPTH_STENCIL_DESC115 CD3DX12_DEPTH_STENCIL_DESC()
116 {}
CD3DX12_DEPTH_STENCIL_DESCCD3DX12_DEPTH_STENCIL_DESC117 explicit CD3DX12_DEPTH_STENCIL_DESC( const D3D12_DEPTH_STENCIL_DESC& o ) :
118 D3D12_DEPTH_STENCIL_DESC( o )
119 {}
CD3DX12_DEPTH_STENCIL_DESCCD3DX12_DEPTH_STENCIL_DESC120 explicit CD3DX12_DEPTH_STENCIL_DESC( CD3DX12_DEFAULT )
121 {
122 DepthEnable = TRUE;
123 DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL;
124 DepthFunc = D3D12_COMPARISON_FUNC_LESS;
125 StencilEnable = FALSE;
126 StencilReadMask = D3D12_DEFAULT_STENCIL_READ_MASK;
127 StencilWriteMask = D3D12_DEFAULT_STENCIL_WRITE_MASK;
128 const D3D12_DEPTH_STENCILOP_DESC defaultStencilOp =
129 { D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, D3D12_COMPARISON_FUNC_ALWAYS };
130 FrontFace = defaultStencilOp;
131 BackFace = defaultStencilOp;
132 }
CD3DX12_DEPTH_STENCIL_DESCCD3DX12_DEPTH_STENCIL_DESC133 explicit CD3DX12_DEPTH_STENCIL_DESC(
134 BOOL depthEnable,
135 D3D12_DEPTH_WRITE_MASK depthWriteMask,
136 D3D12_COMPARISON_FUNC depthFunc,
137 BOOL stencilEnable,
138 UINT8 stencilReadMask,
139 UINT8 stencilWriteMask,
140 D3D12_STENCIL_OP frontStencilFailOp,
141 D3D12_STENCIL_OP frontStencilDepthFailOp,
142 D3D12_STENCIL_OP frontStencilPassOp,
143 D3D12_COMPARISON_FUNC frontStencilFunc,
144 D3D12_STENCIL_OP backStencilFailOp,
145 D3D12_STENCIL_OP backStencilDepthFailOp,
146 D3D12_STENCIL_OP backStencilPassOp,
147 D3D12_COMPARISON_FUNC backStencilFunc )
148 {
149 DepthEnable = depthEnable;
150 DepthWriteMask = depthWriteMask;
151 DepthFunc = depthFunc;
152 StencilEnable = stencilEnable;
153 StencilReadMask = stencilReadMask;
154 StencilWriteMask = stencilWriteMask;
155 FrontFace.StencilFailOp = frontStencilFailOp;
156 FrontFace.StencilDepthFailOp = frontStencilDepthFailOp;
157 FrontFace.StencilPassOp = frontStencilPassOp;
158 FrontFace.StencilFunc = frontStencilFunc;
159 BackFace.StencilFailOp = backStencilFailOp;
160 BackFace.StencilDepthFailOp = backStencilDepthFailOp;
161 BackFace.StencilPassOp = backStencilPassOp;
162 BackFace.StencilFunc = backStencilFunc;
163 }
~CD3DX12_DEPTH_STENCIL_DESCCD3DX12_DEPTH_STENCIL_DESC164 ~CD3DX12_DEPTH_STENCIL_DESC() {}
165 // operator const D3D12_DEPTH_STENCIL_DESC&() const { return *this; }
166 };
167
168 //------------------------------------------------------------------------------------------------
169 struct CD3DX12_BLEND_DESC : public D3D12_BLEND_DESC
170 {
CD3DX12_BLEND_DESCCD3DX12_BLEND_DESC171 CD3DX12_BLEND_DESC()
172 {}
CD3DX12_BLEND_DESCCD3DX12_BLEND_DESC173 explicit CD3DX12_BLEND_DESC( const D3D12_BLEND_DESC& o ) :
174 D3D12_BLEND_DESC( o )
175 {}
CD3DX12_BLEND_DESCCD3DX12_BLEND_DESC176 explicit CD3DX12_BLEND_DESC( CD3DX12_DEFAULT )
177 {
178 AlphaToCoverageEnable = FALSE;
179 IndependentBlendEnable = FALSE;
180 const D3D12_RENDER_TARGET_BLEND_DESC defaultRenderTargetBlendDesc =
181 {
182 FALSE,FALSE,
183 D3D12_BLEND_ONE, D3D12_BLEND_ZERO, D3D12_BLEND_OP_ADD,
184 D3D12_BLEND_ONE, D3D12_BLEND_ZERO, D3D12_BLEND_OP_ADD,
185 D3D12_LOGIC_OP_NOOP,
186 D3D12_COLOR_WRITE_ENABLE_ALL,
187 };
188 for (UINT i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i)
189 RenderTarget[ i ] = defaultRenderTargetBlendDesc;
190 }
~CD3DX12_BLEND_DESCCD3DX12_BLEND_DESC191 ~CD3DX12_BLEND_DESC() {}
192 // operator const D3D12_BLEND_DESC&() const { return *this; }
193 };
194
195 //------------------------------------------------------------------------------------------------
196 struct CD3DX12_RASTERIZER_DESC : public D3D12_RASTERIZER_DESC
197 {
CD3DX12_RASTERIZER_DESCCD3DX12_RASTERIZER_DESC198 CD3DX12_RASTERIZER_DESC()
199 {}
CD3DX12_RASTERIZER_DESCCD3DX12_RASTERIZER_DESC200 explicit CD3DX12_RASTERIZER_DESC( const D3D12_RASTERIZER_DESC& o ) :
201 D3D12_RASTERIZER_DESC( o )
202 {}
CD3DX12_RASTERIZER_DESCCD3DX12_RASTERIZER_DESC203 explicit CD3DX12_RASTERIZER_DESC( CD3DX12_DEFAULT )
204 {
205 FillMode = D3D12_FILL_MODE_SOLID;
206 CullMode = D3D12_CULL_MODE_BACK;
207 FrontCounterClockwise = FALSE;
208 DepthBias = D3D12_DEFAULT_DEPTH_BIAS;
209 DepthBiasClamp = D3D12_DEFAULT_DEPTH_BIAS_CLAMP;
210 SlopeScaledDepthBias = D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS;
211 DepthClipEnable = TRUE;
212 MultisampleEnable = FALSE;
213 AntialiasedLineEnable = FALSE;
214 ForcedSampleCount = 0;
215 ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
216 }
CD3DX12_RASTERIZER_DESCCD3DX12_RASTERIZER_DESC217 explicit CD3DX12_RASTERIZER_DESC(
218 D3D12_FILL_MODE fillMode,
219 D3D12_CULL_MODE cullMode,
220 BOOL frontCounterClockwise,
221 INT depthBias,
222 FLOAT depthBiasClamp,
223 FLOAT slopeScaledDepthBias,
224 BOOL depthClipEnable,
225 BOOL multisampleEnable,
226 BOOL antialiasedLineEnable,
227 UINT forcedSampleCount,
228 D3D12_CONSERVATIVE_RASTERIZATION_MODE conservativeRaster)
229 {
230 FillMode = fillMode;
231 CullMode = cullMode;
232 FrontCounterClockwise = frontCounterClockwise;
233 DepthBias = depthBias;
234 DepthBiasClamp = depthBiasClamp;
235 SlopeScaledDepthBias = slopeScaledDepthBias;
236 DepthClipEnable = depthClipEnable;
237 MultisampleEnable = multisampleEnable;
238 AntialiasedLineEnable = antialiasedLineEnable;
239 ForcedSampleCount = forcedSampleCount;
240 ConservativeRaster = conservativeRaster;
241 }
~CD3DX12_RASTERIZER_DESCCD3DX12_RASTERIZER_DESC242 ~CD3DX12_RASTERIZER_DESC() {}
243 // operator const D3D12_RASTERIZER_DESC&() const { return *this; }
244 };
245
246 //------------------------------------------------------------------------------------------------
247 struct CD3DX12_RESOURCE_ALLOCATION_INFO : public D3D12_RESOURCE_ALLOCATION_INFO
248 {
CD3DX12_RESOURCE_ALLOCATION_INFOCD3DX12_RESOURCE_ALLOCATION_INFO249 CD3DX12_RESOURCE_ALLOCATION_INFO()
250 {}
CD3DX12_RESOURCE_ALLOCATION_INFOCD3DX12_RESOURCE_ALLOCATION_INFO251 explicit CD3DX12_RESOURCE_ALLOCATION_INFO( const D3D12_RESOURCE_ALLOCATION_INFO& o ) :
252 D3D12_RESOURCE_ALLOCATION_INFO( o )
253 {}
CD3DX12_RESOURCE_ALLOCATION_INFOCD3DX12_RESOURCE_ALLOCATION_INFO254 CD3DX12_RESOURCE_ALLOCATION_INFO(
255 UINT64 size,
256 UINT64 alignment )
257 {
258 SizeInBytes = size;
259 Alignment = alignment;
260 }
261 // operator const D3D12_RESOURCE_ALLOCATION_INFO&() const { return *this; }
262 };
263
264 //------------------------------------------------------------------------------------------------
265 struct CD3DX12_HEAP_PROPERTIES : public D3D12_HEAP_PROPERTIES
266 {
CD3DX12_HEAP_PROPERTIESCD3DX12_HEAP_PROPERTIES267 CD3DX12_HEAP_PROPERTIES()
268 {}
CD3DX12_HEAP_PROPERTIESCD3DX12_HEAP_PROPERTIES269 explicit CD3DX12_HEAP_PROPERTIES(const D3D12_HEAP_PROPERTIES &o) :
270 D3D12_HEAP_PROPERTIES(o)
271 {}
272 CD3DX12_HEAP_PROPERTIES(
273 D3D12_CPU_PAGE_PROPERTY cpuPageProperty,
274 D3D12_MEMORY_POOL memoryPoolPreference,
275 UINT creationNodeMask = 1,
276 UINT nodeMask = 1 )
277 {
278 Type = D3D12_HEAP_TYPE_CUSTOM;
279 CPUPageProperty = cpuPageProperty;
280 MemoryPoolPreference = memoryPoolPreference;
281 CreationNodeMask = creationNodeMask;
282 VisibleNodeMask = nodeMask;
283 }
284 explicit CD3DX12_HEAP_PROPERTIES(
285 D3D12_HEAP_TYPE type,
286 UINT creationNodeMask = 1,
287 UINT nodeMask = 1 )
288 {
289 Type = type;
290 CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
291 MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
292 CreationNodeMask = creationNodeMask;
293 VisibleNodeMask = nodeMask;
294 }
295 // operator const D3D12_HEAP_PROPERTIES&() const { return *this; }
IsCPUAccessibleCD3DX12_HEAP_PROPERTIES296 bool IsCPUAccessible() const
297 {
298 return Type == D3D12_HEAP_TYPE_UPLOAD || Type == D3D12_HEAP_TYPE_READBACK || (Type == D3D12_HEAP_TYPE_CUSTOM &&
299 (CPUPageProperty == D3D12_CPU_PAGE_PROPERTY_WRITE_COMBINE || CPUPageProperty == D3D12_CPU_PAGE_PROPERTY_WRITE_BACK));
300 }
301 };
302 inline bool operator==( const D3D12_HEAP_PROPERTIES& l, const D3D12_HEAP_PROPERTIES& r )
303 {
304 return l.Type == r.Type && l.CPUPageProperty == r.CPUPageProperty &&
305 l.MemoryPoolPreference == r.MemoryPoolPreference &&
306 l.CreationNodeMask == r.CreationNodeMask &&
307 l.VisibleNodeMask == r.VisibleNodeMask;
308 }
309 inline bool operator!=( const D3D12_HEAP_PROPERTIES& l, const D3D12_HEAP_PROPERTIES& r )
310 { return !( l == r ); }
311
312 //------------------------------------------------------------------------------------------------
313 struct CD3DX12_HEAP_DESC : public D3D12_HEAP_DESC
314 {
CD3DX12_HEAP_DESCCD3DX12_HEAP_DESC315 CD3DX12_HEAP_DESC()
316 {}
CD3DX12_HEAP_DESCCD3DX12_HEAP_DESC317 explicit CD3DX12_HEAP_DESC(const D3D12_HEAP_DESC &o) :
318 D3D12_HEAP_DESC(o)
319 {}
320 CD3DX12_HEAP_DESC(
321 UINT64 size,
322 D3D12_HEAP_PROPERTIES properties,
323 UINT64 alignment = 0,
324 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE )
325 {
326 SizeInBytes = size;
327 Properties = properties;
328 Alignment = alignment;
329 Flags = flags;
330 }
331 CD3DX12_HEAP_DESC(
332 UINT64 size,
333 D3D12_HEAP_TYPE type,
334 UINT64 alignment = 0,
335 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE )
336 {
337 SizeInBytes = size;
338 Properties = CD3DX12_HEAP_PROPERTIES( type );
339 Alignment = alignment;
340 Flags = flags;
341 }
342 CD3DX12_HEAP_DESC(
343 UINT64 size,
344 D3D12_CPU_PAGE_PROPERTY cpuPageProperty,
345 D3D12_MEMORY_POOL memoryPoolPreference,
346 UINT64 alignment = 0,
347 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE )
348 {
349 SizeInBytes = size;
350 Properties = CD3DX12_HEAP_PROPERTIES( cpuPageProperty, memoryPoolPreference );
351 Alignment = alignment;
352 Flags = flags;
353 }
354 CD3DX12_HEAP_DESC(
355 const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
356 D3D12_HEAP_PROPERTIES properties,
357 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE )
358 {
359 SizeInBytes = resAllocInfo.SizeInBytes;
360 Properties = properties;
361 Alignment = resAllocInfo.Alignment;
362 Flags = flags;
363 }
364 CD3DX12_HEAP_DESC(
365 const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
366 D3D12_HEAP_TYPE type,
367 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE )
368 {
369 SizeInBytes = resAllocInfo.SizeInBytes;
370 Properties = CD3DX12_HEAP_PROPERTIES( type );
371 Alignment = resAllocInfo.Alignment;
372 Flags = flags;
373 }
374 CD3DX12_HEAP_DESC(
375 const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
376 D3D12_CPU_PAGE_PROPERTY cpuPageProperty,
377 D3D12_MEMORY_POOL memoryPoolPreference,
378 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE )
379 {
380 SizeInBytes = resAllocInfo.SizeInBytes;
381 Properties = CD3DX12_HEAP_PROPERTIES( cpuPageProperty, memoryPoolPreference );
382 Alignment = resAllocInfo.Alignment;
383 Flags = flags;
384 }
385 // operator const D3D12_HEAP_DESC&() const { return *this; }
IsCPUAccessibleCD3DX12_HEAP_DESC386 bool IsCPUAccessible() const
387 { return static_cast< const CD3DX12_HEAP_PROPERTIES* >( &Properties )->IsCPUAccessible(); }
388 };
389 inline bool operator==( const D3D12_HEAP_DESC& l, const D3D12_HEAP_DESC& r )
390 {
391 return l.SizeInBytes == r.SizeInBytes &&
392 l.Properties == r.Properties &&
393 l.Alignment == r.Alignment &&
394 l.Flags == r.Flags;
395 }
396 inline bool operator!=( const D3D12_HEAP_DESC& l, const D3D12_HEAP_DESC& r )
397 { return !( l == r ); }
398
399 //------------------------------------------------------------------------------------------------
400 struct CD3DX12_CLEAR_VALUE : public D3D12_CLEAR_VALUE
401 {
CD3DX12_CLEAR_VALUECD3DX12_CLEAR_VALUE402 CD3DX12_CLEAR_VALUE()
403 {}
CD3DX12_CLEAR_VALUECD3DX12_CLEAR_VALUE404 explicit CD3DX12_CLEAR_VALUE(const D3D12_CLEAR_VALUE &o) :
405 D3D12_CLEAR_VALUE(o)
406 {}
CD3DX12_CLEAR_VALUECD3DX12_CLEAR_VALUE407 CD3DX12_CLEAR_VALUE(
408 DXGI_FORMAT format,
409 const FLOAT color[4] )
410 {
411 Format = format;
412 memcpy( Color, color, sizeof( Color ) );
413 }
CD3DX12_CLEAR_VALUECD3DX12_CLEAR_VALUE414 CD3DX12_CLEAR_VALUE(
415 DXGI_FORMAT format,
416 FLOAT depth,
417 UINT8 stencil )
418 {
419 Format = format;
420 /* Use memcpy to preserve NAN values */
421 memcpy( &DepthStencil.Depth, &depth, sizeof( depth ) );
422 DepthStencil.Stencil = stencil;
423 }
424 // operator const D3D12_CLEAR_VALUE&() const { return *this; }
425 };
426
427 //------------------------------------------------------------------------------------------------
428 struct CD3DX12_RANGE : public D3D12_RANGE
429 {
CD3DX12_RANGECD3DX12_RANGE430 CD3DX12_RANGE()
431 {}
CD3DX12_RANGECD3DX12_RANGE432 explicit CD3DX12_RANGE(const D3D12_RANGE &o) :
433 D3D12_RANGE(o)
434 {}
CD3DX12_RANGECD3DX12_RANGE435 CD3DX12_RANGE(
436 SIZE_T begin,
437 SIZE_T end )
438 {
439 Begin = begin;
440 End = end;
441 }
442 // operator const D3D12_RANGE&() const { return *this; }
443 };
444
445 //------------------------------------------------------------------------------------------------
446 struct CD3DX12_TILED_RESOURCE_COORDINATE : public D3D12_TILED_RESOURCE_COORDINATE
447 {
CD3DX12_TILED_RESOURCE_COORDINATECD3DX12_TILED_RESOURCE_COORDINATE448 CD3DX12_TILED_RESOURCE_COORDINATE()
449 {}
CD3DX12_TILED_RESOURCE_COORDINATECD3DX12_TILED_RESOURCE_COORDINATE450 explicit CD3DX12_TILED_RESOURCE_COORDINATE(const D3D12_TILED_RESOURCE_COORDINATE &o) :
451 D3D12_TILED_RESOURCE_COORDINATE(o)
452 {}
CD3DX12_TILED_RESOURCE_COORDINATECD3DX12_TILED_RESOURCE_COORDINATE453 CD3DX12_TILED_RESOURCE_COORDINATE(
454 UINT x,
455 UINT y,
456 UINT z,
457 UINT subresource )
458 {
459 X = x;
460 Y = y;
461 Z = z;
462 Subresource = subresource;
463 }
464 // operator const D3D12_TILED_RESOURCE_COORDINATE&() const { return *this; }
465 };
466
467 //------------------------------------------------------------------------------------------------
468 struct CD3DX12_TILE_REGION_SIZE : public D3D12_TILE_REGION_SIZE
469 {
CD3DX12_TILE_REGION_SIZECD3DX12_TILE_REGION_SIZE470 CD3DX12_TILE_REGION_SIZE()
471 {}
CD3DX12_TILE_REGION_SIZECD3DX12_TILE_REGION_SIZE472 explicit CD3DX12_TILE_REGION_SIZE(const D3D12_TILE_REGION_SIZE &o) :
473 D3D12_TILE_REGION_SIZE(o)
474 {}
CD3DX12_TILE_REGION_SIZECD3DX12_TILE_REGION_SIZE475 CD3DX12_TILE_REGION_SIZE(
476 UINT numTiles,
477 BOOL useBox,
478 UINT width,
479 UINT16 height,
480 UINT16 depth )
481 {
482 NumTiles = numTiles;
483 UseBox = useBox;
484 Width = width;
485 Height = height;
486 Depth = depth;
487 }
488 // operator const D3D12_TILE_REGION_SIZE&() const { return *this; }
489 };
490
491 //------------------------------------------------------------------------------------------------
492 struct CD3DX12_SUBRESOURCE_TILING : public D3D12_SUBRESOURCE_TILING
493 {
CD3DX12_SUBRESOURCE_TILINGCD3DX12_SUBRESOURCE_TILING494 CD3DX12_SUBRESOURCE_TILING()
495 {}
CD3DX12_SUBRESOURCE_TILINGCD3DX12_SUBRESOURCE_TILING496 explicit CD3DX12_SUBRESOURCE_TILING(const D3D12_SUBRESOURCE_TILING &o) :
497 D3D12_SUBRESOURCE_TILING(o)
498 {}
CD3DX12_SUBRESOURCE_TILINGCD3DX12_SUBRESOURCE_TILING499 CD3DX12_SUBRESOURCE_TILING(
500 UINT widthInTiles,
501 UINT16 heightInTiles,
502 UINT16 depthInTiles,
503 UINT startTileIndexInOverallResource )
504 {
505 WidthInTiles = widthInTiles;
506 HeightInTiles = heightInTiles;
507 DepthInTiles = depthInTiles;
508 StartTileIndexInOverallResource = startTileIndexInOverallResource;
509 }
510 // operator const D3D12_SUBRESOURCE_TILING&() const { return *this; }
511 };
512
513 //------------------------------------------------------------------------------------------------
514 struct CD3DX12_TILE_SHAPE : public D3D12_TILE_SHAPE
515 {
CD3DX12_TILE_SHAPECD3DX12_TILE_SHAPE516 CD3DX12_TILE_SHAPE()
517 {}
CD3DX12_TILE_SHAPECD3DX12_TILE_SHAPE518 explicit CD3DX12_TILE_SHAPE(const D3D12_TILE_SHAPE &o) :
519 D3D12_TILE_SHAPE(o)
520 {}
CD3DX12_TILE_SHAPECD3DX12_TILE_SHAPE521 CD3DX12_TILE_SHAPE(
522 UINT widthInTexels,
523 UINT heightInTexels,
524 UINT depthInTexels )
525 {
526 WidthInTexels = widthInTexels;
527 HeightInTexels = heightInTexels;
528 DepthInTexels = depthInTexels;
529 }
530 // operator const D3D12_TILE_SHAPE&() const { return *this; }
531 };
532
533 //------------------------------------------------------------------------------------------------
534 struct CD3DX12_RESOURCE_BARRIER : public D3D12_RESOURCE_BARRIER
535 {
CD3DX12_RESOURCE_BARRIERCD3DX12_RESOURCE_BARRIER536 CD3DX12_RESOURCE_BARRIER()
537 {}
CD3DX12_RESOURCE_BARRIERCD3DX12_RESOURCE_BARRIER538 explicit CD3DX12_RESOURCE_BARRIER(const D3D12_RESOURCE_BARRIER &o) :
539 D3D12_RESOURCE_BARRIER(o)
540 {}
541 static inline CD3DX12_RESOURCE_BARRIER Transition(
542 _In_ ID3D12Resource* pResource,
543 D3D12_RESOURCE_STATES stateBefore,
544 D3D12_RESOURCE_STATES stateAfter,
545 UINT subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES,
546 D3D12_RESOURCE_BARRIER_FLAGS flags = D3D12_RESOURCE_BARRIER_FLAG_NONE)
547 {
548 CD3DX12_RESOURCE_BARRIER result;
549 ZeroMemory(&result, sizeof(result));
550 D3D12_RESOURCE_BARRIER &barrier = result;
551 result.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
552 result.Flags = flags;
553 barrier.Transition.pResource = pResource;
554 barrier.Transition.StateBefore = stateBefore;
555 barrier.Transition.StateAfter = stateAfter;
556 barrier.Transition.Subresource = subresource;
557 return result;
558 }
AliasingCD3DX12_RESOURCE_BARRIER559 static inline CD3DX12_RESOURCE_BARRIER Aliasing(
560 _In_ ID3D12Resource* pResourceBefore,
561 _In_ ID3D12Resource* pResourceAfter)
562 {
563 CD3DX12_RESOURCE_BARRIER result;
564 ZeroMemory(&result, sizeof(result));
565 D3D12_RESOURCE_BARRIER &barrier = result;
566 result.Type = D3D12_RESOURCE_BARRIER_TYPE_ALIASING;
567 barrier.Aliasing.pResourceBefore = pResourceBefore;
568 barrier.Aliasing.pResourceAfter = pResourceAfter;
569 return result;
570 }
UAVCD3DX12_RESOURCE_BARRIER571 static inline CD3DX12_RESOURCE_BARRIER UAV(
572 _In_ ID3D12Resource* pResource)
573 {
574 CD3DX12_RESOURCE_BARRIER result;
575 ZeroMemory(&result, sizeof(result));
576 D3D12_RESOURCE_BARRIER &barrier = result;
577 result.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV;
578 barrier.UAV.pResource = pResource;
579 return result;
580 }
581 // operator const D3D12_RESOURCE_BARRIER&() const { return *this; }
582 };
583
584 //------------------------------------------------------------------------------------------------
585 struct CD3DX12_PACKED_MIP_INFO : public D3D12_PACKED_MIP_INFO
586 {
CD3DX12_PACKED_MIP_INFOCD3DX12_PACKED_MIP_INFO587 CD3DX12_PACKED_MIP_INFO()
588 {}
CD3DX12_PACKED_MIP_INFOCD3DX12_PACKED_MIP_INFO589 explicit CD3DX12_PACKED_MIP_INFO(const D3D12_PACKED_MIP_INFO &o) :
590 D3D12_PACKED_MIP_INFO(o)
591 {}
CD3DX12_PACKED_MIP_INFOCD3DX12_PACKED_MIP_INFO592 CD3DX12_PACKED_MIP_INFO(
593 UINT8 numStandardMips,
594 UINT8 numPackedMips,
595 UINT numTilesForPackedMips,
596 UINT startTileIndexInOverallResource )
597 {
598 NumStandardMips = numStandardMips;
599 NumPackedMips = numPackedMips;
600 NumTilesForPackedMips = numTilesForPackedMips;
601 StartTileIndexInOverallResource = startTileIndexInOverallResource;
602 }
603 // operator const D3D12_PACKED_MIP_INFO&() const { return *this; }
604 };
605
606 //------------------------------------------------------------------------------------------------
607 struct CD3DX12_SUBRESOURCE_FOOTPRINT : public D3D12_SUBRESOURCE_FOOTPRINT
608 {
CD3DX12_SUBRESOURCE_FOOTPRINTCD3DX12_SUBRESOURCE_FOOTPRINT609 CD3DX12_SUBRESOURCE_FOOTPRINT()
610 {}
CD3DX12_SUBRESOURCE_FOOTPRINTCD3DX12_SUBRESOURCE_FOOTPRINT611 explicit CD3DX12_SUBRESOURCE_FOOTPRINT(const D3D12_SUBRESOURCE_FOOTPRINT &o) :
612 D3D12_SUBRESOURCE_FOOTPRINT(o)
613 {}
CD3DX12_SUBRESOURCE_FOOTPRINTCD3DX12_SUBRESOURCE_FOOTPRINT614 CD3DX12_SUBRESOURCE_FOOTPRINT(
615 DXGI_FORMAT format,
616 UINT width,
617 UINT height,
618 UINT depth,
619 UINT rowPitch )
620 {
621 Format = format;
622 Width = width;
623 Height = height;
624 Depth = depth;
625 RowPitch = rowPitch;
626 }
CD3DX12_SUBRESOURCE_FOOTPRINTCD3DX12_SUBRESOURCE_FOOTPRINT627 explicit CD3DX12_SUBRESOURCE_FOOTPRINT(
628 const D3D12_RESOURCE_DESC& resDesc,
629 UINT rowPitch )
630 {
631 Format = resDesc.Format;
632 Width = UINT( resDesc.Width );
633 Height = resDesc.Height;
634 Depth = (resDesc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? resDesc.DepthOrArraySize : 1);
635 RowPitch = rowPitch;
636 }
637 // operator const D3D12_SUBRESOURCE_FOOTPRINT&() const { return *this; }
638 };
639
640 //------------------------------------------------------------------------------------------------
641 struct CD3DX12_TEXTURE_COPY_LOCATION : public D3D12_TEXTURE_COPY_LOCATION
642 {
CD3DX12_TEXTURE_COPY_LOCATIONCD3DX12_TEXTURE_COPY_LOCATION643 CD3DX12_TEXTURE_COPY_LOCATION()
644 {}
CD3DX12_TEXTURE_COPY_LOCATIONCD3DX12_TEXTURE_COPY_LOCATION645 explicit CD3DX12_TEXTURE_COPY_LOCATION(const D3D12_TEXTURE_COPY_LOCATION &o) :
646 D3D12_TEXTURE_COPY_LOCATION(o)
647 {}
CD3DX12_TEXTURE_COPY_LOCATIONCD3DX12_TEXTURE_COPY_LOCATION648 CD3DX12_TEXTURE_COPY_LOCATION(ID3D12Resource* pRes) { pResource = pRes; }
CD3DX12_TEXTURE_COPY_LOCATIONCD3DX12_TEXTURE_COPY_LOCATION649 CD3DX12_TEXTURE_COPY_LOCATION(ID3D12Resource* pRes, D3D12_PLACED_SUBRESOURCE_FOOTPRINT const& Footprint)
650 {
651 pResource = pRes;
652 Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
653 PlacedFootprint = Footprint;
654 }
CD3DX12_TEXTURE_COPY_LOCATIONCD3DX12_TEXTURE_COPY_LOCATION655 CD3DX12_TEXTURE_COPY_LOCATION(ID3D12Resource* pRes, UINT Sub)
656 {
657 pResource = pRes;
658 Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
659 SubresourceIndex = Sub;
660 }
661 };
662
663 //------------------------------------------------------------------------------------------------
664 struct CD3DX12_DESCRIPTOR_RANGE : public D3D12_DESCRIPTOR_RANGE
665 {
CD3DX12_DESCRIPTOR_RANGECD3DX12_DESCRIPTOR_RANGE666 CD3DX12_DESCRIPTOR_RANGE() { }
CD3DX12_DESCRIPTOR_RANGECD3DX12_DESCRIPTOR_RANGE667 explicit CD3DX12_DESCRIPTOR_RANGE(const D3D12_DESCRIPTOR_RANGE &o) :
668 D3D12_DESCRIPTOR_RANGE(o)
669 {}
670 CD3DX12_DESCRIPTOR_RANGE(
671 D3D12_DESCRIPTOR_RANGE_TYPE rangeType,
672 UINT numDescriptors,
673 UINT baseShaderRegister,
674 UINT registerSpace = 0,
675 UINT offsetInDescriptorsFromTableStart =
676 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND)
677 {
678 Init(rangeType, numDescriptors, baseShaderRegister, registerSpace, offsetInDescriptorsFromTableStart);
679 }
680
681 inline void Init(
682 D3D12_DESCRIPTOR_RANGE_TYPE rangeType,
683 UINT numDescriptors,
684 UINT baseShaderRegister,
685 UINT registerSpace = 0,
686 UINT offsetInDescriptorsFromTableStart =
687 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND)
688 {
689 Init(*this, rangeType, numDescriptors, baseShaderRegister, registerSpace, offsetInDescriptorsFromTableStart);
690 }
691
692 static inline void Init(
693 _Out_ D3D12_DESCRIPTOR_RANGE &range,
694 D3D12_DESCRIPTOR_RANGE_TYPE rangeType,
695 UINT numDescriptors,
696 UINT baseShaderRegister,
697 UINT registerSpace = 0,
698 UINT offsetInDescriptorsFromTableStart =
699 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND)
700 {
701 range.RangeType = rangeType;
702 range.NumDescriptors = numDescriptors;
703 range.BaseShaderRegister = baseShaderRegister;
704 range.RegisterSpace = registerSpace;
705 range.OffsetInDescriptorsFromTableStart = offsetInDescriptorsFromTableStart;
706 }
707 };
708
709 //------------------------------------------------------------------------------------------------
710 struct CD3DX12_ROOT_DESCRIPTOR_TABLE : public D3D12_ROOT_DESCRIPTOR_TABLE
711 {
CD3DX12_ROOT_DESCRIPTOR_TABLECD3DX12_ROOT_DESCRIPTOR_TABLE712 CD3DX12_ROOT_DESCRIPTOR_TABLE() {}
CD3DX12_ROOT_DESCRIPTOR_TABLECD3DX12_ROOT_DESCRIPTOR_TABLE713 explicit CD3DX12_ROOT_DESCRIPTOR_TABLE(const D3D12_ROOT_DESCRIPTOR_TABLE &o) :
714 D3D12_ROOT_DESCRIPTOR_TABLE(o)
715 {}
CD3DX12_ROOT_DESCRIPTOR_TABLECD3DX12_ROOT_DESCRIPTOR_TABLE716 CD3DX12_ROOT_DESCRIPTOR_TABLE(
717 UINT numDescriptorRanges,
718 _In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges)
719 {
720 Init(numDescriptorRanges, _pDescriptorRanges);
721 }
722
InitCD3DX12_ROOT_DESCRIPTOR_TABLE723 inline void Init(
724 UINT numDescriptorRanges,
725 _In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges)
726 {
727 Init(*this, numDescriptorRanges, _pDescriptorRanges);
728 }
729
InitCD3DX12_ROOT_DESCRIPTOR_TABLE730 static inline void Init(
731 _Out_ D3D12_ROOT_DESCRIPTOR_TABLE &rootDescriptorTable,
732 UINT numDescriptorRanges,
733 _In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges)
734 {
735 rootDescriptorTable.NumDescriptorRanges = numDescriptorRanges;
736 rootDescriptorTable.pDescriptorRanges = _pDescriptorRanges;
737 }
738 };
739
740 //------------------------------------------------------------------------------------------------
741 struct CD3DX12_ROOT_CONSTANTS : public D3D12_ROOT_CONSTANTS
742 {
CD3DX12_ROOT_CONSTANTSCD3DX12_ROOT_CONSTANTS743 CD3DX12_ROOT_CONSTANTS() {}
CD3DX12_ROOT_CONSTANTSCD3DX12_ROOT_CONSTANTS744 explicit CD3DX12_ROOT_CONSTANTS(const D3D12_ROOT_CONSTANTS &o) :
745 D3D12_ROOT_CONSTANTS(o)
746 {}
747 CD3DX12_ROOT_CONSTANTS(
748 UINT num32BitValues,
749 UINT shaderRegister,
750 UINT registerSpace = 0)
751 {
752 Init(num32BitValues, shaderRegister, registerSpace);
753 }
754
755 inline void Init(
756 UINT num32BitValues,
757 UINT shaderRegister,
758 UINT registerSpace = 0)
759 {
760 Init(*this, num32BitValues, shaderRegister, registerSpace);
761 }
762
763 static inline void Init(
764 _Out_ D3D12_ROOT_CONSTANTS &rootConstants,
765 UINT num32BitValues,
766 UINT shaderRegister,
767 UINT registerSpace = 0)
768 {
769 rootConstants.Num32BitValues = num32BitValues;
770 rootConstants.ShaderRegister = shaderRegister;
771 rootConstants.RegisterSpace = registerSpace;
772 }
773 };
774
775 //------------------------------------------------------------------------------------------------
776 struct CD3DX12_ROOT_DESCRIPTOR : public D3D12_ROOT_DESCRIPTOR
777 {
CD3DX12_ROOT_DESCRIPTORCD3DX12_ROOT_DESCRIPTOR778 CD3DX12_ROOT_DESCRIPTOR() {}
CD3DX12_ROOT_DESCRIPTORCD3DX12_ROOT_DESCRIPTOR779 explicit CD3DX12_ROOT_DESCRIPTOR(const D3D12_ROOT_DESCRIPTOR &o) :
780 D3D12_ROOT_DESCRIPTOR(o)
781 {}
782 CD3DX12_ROOT_DESCRIPTOR(
783 UINT shaderRegister,
784 UINT registerSpace = 0)
785 {
786 Init(shaderRegister, registerSpace);
787 }
788
789 inline void Init(
790 UINT shaderRegister,
791 UINT registerSpace = 0)
792 {
793 Init(*this, shaderRegister, registerSpace);
794 }
795
796 static inline void Init(_Out_ D3D12_ROOT_DESCRIPTOR &table, UINT shaderRegister, UINT registerSpace = 0)
797 {
798 table.ShaderRegister = shaderRegister;
799 table.RegisterSpace = registerSpace;
800 }
801 };
802
803 //------------------------------------------------------------------------------------------------
804 struct CD3DX12_ROOT_PARAMETER : public D3D12_ROOT_PARAMETER
805 {
CD3DX12_ROOT_PARAMETERCD3DX12_ROOT_PARAMETER806 CD3DX12_ROOT_PARAMETER() {}
CD3DX12_ROOT_PARAMETERCD3DX12_ROOT_PARAMETER807 explicit CD3DX12_ROOT_PARAMETER(const D3D12_ROOT_PARAMETER &o) :
808 D3D12_ROOT_PARAMETER(o)
809 {}
810
811 static inline void InitAsDescriptorTable(
812 _Out_ D3D12_ROOT_PARAMETER &rootParam,
813 UINT numDescriptorRanges,
814 _In_reads_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* pDescriptorRanges,
815 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
816 {
817 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
818 rootParam.ShaderVisibility = visibility;
819 CD3DX12_ROOT_DESCRIPTOR_TABLE::Init(rootParam.DescriptorTable, numDescriptorRanges, pDescriptorRanges);
820 }
821
822 static inline void InitAsConstants(
823 _Out_ D3D12_ROOT_PARAMETER &rootParam,
824 UINT num32BitValues,
825 UINT shaderRegister,
826 UINT registerSpace = 0,
827 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
828 {
829 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;
830 rootParam.ShaderVisibility = visibility;
831 CD3DX12_ROOT_CONSTANTS::Init(rootParam.Constants, num32BitValues, shaderRegister, registerSpace);
832 }
833
834 static inline void InitAsConstantBufferView(
835 _Out_ D3D12_ROOT_PARAMETER &rootParam,
836 UINT shaderRegister,
837 UINT registerSpace = 0,
838 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
839 {
840 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;
841 rootParam.ShaderVisibility = visibility;
842 CD3DX12_ROOT_DESCRIPTOR::Init(rootParam.Descriptor, shaderRegister, registerSpace);
843 }
844
845 static inline void InitAsShaderResourceView(
846 _Out_ D3D12_ROOT_PARAMETER &rootParam,
847 UINT shaderRegister,
848 UINT registerSpace = 0,
849 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
850 {
851 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_SRV;
852 rootParam.ShaderVisibility = visibility;
853 CD3DX12_ROOT_DESCRIPTOR::Init(rootParam.Descriptor, shaderRegister, registerSpace);
854 }
855
856 static inline void InitAsUnorderedAccessView(
857 _Out_ D3D12_ROOT_PARAMETER &rootParam,
858 UINT shaderRegister,
859 UINT registerSpace = 0,
860 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
861 {
862 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV;
863 rootParam.ShaderVisibility = visibility;
864 CD3DX12_ROOT_DESCRIPTOR::Init(rootParam.Descriptor, shaderRegister, registerSpace);
865 }
866
867 inline void InitAsDescriptorTable(
868 UINT numDescriptorRanges,
869 _In_reads_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* pDescriptorRanges,
870 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
871 {
872 InitAsDescriptorTable(*this, numDescriptorRanges, pDescriptorRanges, visibility);
873 }
874
875 inline void InitAsConstants(
876 UINT num32BitValues,
877 UINT shaderRegister,
878 UINT registerSpace = 0,
879 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
880 {
881 InitAsConstants(*this, num32BitValues, shaderRegister, registerSpace, visibility);
882 }
883
884 inline void InitAsConstantBufferView(
885 UINT shaderRegister,
886 UINT registerSpace = 0,
887 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
888 {
889 InitAsConstantBufferView(*this, shaderRegister, registerSpace, visibility);
890 }
891
892 inline void InitAsShaderResourceView(
893 UINT shaderRegister,
894 UINT registerSpace = 0,
895 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
896 {
897 InitAsShaderResourceView(*this, shaderRegister, registerSpace, visibility);
898 }
899
900 inline void InitAsUnorderedAccessView(
901 UINT shaderRegister,
902 UINT registerSpace = 0,
903 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
904 {
905 InitAsUnorderedAccessView(*this, shaderRegister, registerSpace, visibility);
906 }
907 };
908
909 //------------------------------------------------------------------------------------------------
910 struct CD3DX12_STATIC_SAMPLER_DESC : public D3D12_STATIC_SAMPLER_DESC
911 {
CD3DX12_STATIC_SAMPLER_DESCCD3DX12_STATIC_SAMPLER_DESC912 CD3DX12_STATIC_SAMPLER_DESC() {}
CD3DX12_STATIC_SAMPLER_DESCCD3DX12_STATIC_SAMPLER_DESC913 explicit CD3DX12_STATIC_SAMPLER_DESC(const D3D12_STATIC_SAMPLER_DESC &o) :
914 D3D12_STATIC_SAMPLER_DESC(o)
915 {}
916 CD3DX12_STATIC_SAMPLER_DESC(
917 UINT shaderRegister,
918 D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC,
919 D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
920 D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
921 D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
922 FLOAT mipLODBias = 0,
923 UINT maxAnisotropy = 16,
924 D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL,
925 D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE,
926 FLOAT minLOD = 0.f,
927 FLOAT maxLOD = D3D12_FLOAT32_MAX,
928 D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
929 UINT registerSpace = 0)
930 {
931 Init(
932 shaderRegister,
933 filter,
934 addressU,
935 addressV,
936 addressW,
937 mipLODBias,
938 maxAnisotropy,
939 comparisonFunc,
940 borderColor,
941 minLOD,
942 maxLOD,
943 shaderVisibility,
944 registerSpace);
945 }
946
947 static inline void Init(
948 _Out_ D3D12_STATIC_SAMPLER_DESC &samplerDesc,
949 UINT shaderRegister,
950 D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC,
951 D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
952 D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
953 D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
954 FLOAT mipLODBias = 0,
955 UINT maxAnisotropy = 16,
956 D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL,
957 D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE,
958 FLOAT minLOD = 0.f,
959 FLOAT maxLOD = D3D12_FLOAT32_MAX,
960 D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
961 UINT registerSpace = 0)
962 {
963 samplerDesc.ShaderRegister = shaderRegister;
964 samplerDesc.Filter = filter;
965 samplerDesc.AddressU = addressU;
966 samplerDesc.AddressV = addressV;
967 samplerDesc.AddressW = addressW;
968 samplerDesc.MipLODBias = mipLODBias;
969 samplerDesc.MaxAnisotropy = maxAnisotropy;
970 samplerDesc.ComparisonFunc = comparisonFunc;
971 samplerDesc.BorderColor = borderColor;
972 samplerDesc.MinLOD = minLOD;
973 samplerDesc.MaxLOD = maxLOD;
974 samplerDesc.ShaderVisibility = shaderVisibility;
975 samplerDesc.RegisterSpace = registerSpace;
976 }
977 inline void Init(
978 UINT shaderRegister,
979 D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC,
980 D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
981 D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
982 D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
983 FLOAT mipLODBias = 0,
984 UINT maxAnisotropy = 16,
985 D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL,
986 D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE,
987 FLOAT minLOD = 0.f,
988 FLOAT maxLOD = D3D12_FLOAT32_MAX,
989 D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
990 UINT registerSpace = 0)
991 {
992 Init(
993 *this,
994 shaderRegister,
995 filter,
996 addressU,
997 addressV,
998 addressW,
999 mipLODBias,
1000 maxAnisotropy,
1001 comparisonFunc,
1002 borderColor,
1003 minLOD,
1004 maxLOD,
1005 shaderVisibility,
1006 registerSpace);
1007 }
1008
1009 };
1010
1011 //------------------------------------------------------------------------------------------------
1012 struct CD3DX12_ROOT_SIGNATURE_DESC : public D3D12_ROOT_SIGNATURE_DESC
1013 {
CD3DX12_ROOT_SIGNATURE_DESCCD3DX12_ROOT_SIGNATURE_DESC1014 CD3DX12_ROOT_SIGNATURE_DESC() {}
CD3DX12_ROOT_SIGNATURE_DESCCD3DX12_ROOT_SIGNATURE_DESC1015 explicit CD3DX12_ROOT_SIGNATURE_DESC(const D3D12_ROOT_SIGNATURE_DESC &o) :
1016 D3D12_ROOT_SIGNATURE_DESC(o)
1017 {}
1018 CD3DX12_ROOT_SIGNATURE_DESC(
1019 UINT numParameters,
1020 _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters,
1021 UINT numStaticSamplers = 0,
1022 _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = NULL,
1023 D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE)
1024 {
1025 Init(numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags);
1026 }
CD3DX12_ROOT_SIGNATURE_DESCCD3DX12_ROOT_SIGNATURE_DESC1027 CD3DX12_ROOT_SIGNATURE_DESC(CD3DX12_DEFAULT)
1028 {
1029 Init(0, NULL, 0, NULL, D3D12_ROOT_SIGNATURE_FLAG_NONE);
1030 }
1031
1032 inline void Init(
1033 UINT numParameters,
1034 _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters,
1035 UINT numStaticSamplers = 0,
1036 _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = NULL,
1037 D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE)
1038 {
1039 Init(*this, numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags);
1040 }
1041
1042 static inline void Init(
1043 _Out_ D3D12_ROOT_SIGNATURE_DESC &desc,
1044 UINT numParameters,
1045 _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters,
1046 UINT numStaticSamplers = 0,
1047 _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = NULL,
1048 D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE)
1049 {
1050 desc.NumParameters = numParameters;
1051 desc.pParameters = _pParameters;
1052 desc.NumStaticSamplers = numStaticSamplers;
1053 desc.pStaticSamplers = _pStaticSamplers;
1054 desc.Flags = flags;
1055 }
1056 };
1057
1058 //------------------------------------------------------------------------------------------------
1059 struct CD3DX12_CPU_DESCRIPTOR_HANDLE : public D3D12_CPU_DESCRIPTOR_HANDLE
1060 {
CD3DX12_CPU_DESCRIPTOR_HANDLECD3DX12_CPU_DESCRIPTOR_HANDLE1061 CD3DX12_CPU_DESCRIPTOR_HANDLE() {}
CD3DX12_CPU_DESCRIPTOR_HANDLECD3DX12_CPU_DESCRIPTOR_HANDLE1062 explicit CD3DX12_CPU_DESCRIPTOR_HANDLE(const D3D12_CPU_DESCRIPTOR_HANDLE &o) :
1063 D3D12_CPU_DESCRIPTOR_HANDLE(o)
1064 {}
CD3DX12_CPU_DESCRIPTOR_HANDLECD3DX12_CPU_DESCRIPTOR_HANDLE1065 CD3DX12_CPU_DESCRIPTOR_HANDLE(CD3DX12_DEFAULT) { ptr = 0; }
CD3DX12_CPU_DESCRIPTOR_HANDLECD3DX12_CPU_DESCRIPTOR_HANDLE1066 CD3DX12_CPU_DESCRIPTOR_HANDLE(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE &other, INT offsetScaledByIncrementSize)
1067 {
1068 InitOffsetted(other, offsetScaledByIncrementSize);
1069 }
CD3DX12_CPU_DESCRIPTOR_HANDLECD3DX12_CPU_DESCRIPTOR_HANDLE1070 CD3DX12_CPU_DESCRIPTOR_HANDLE(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE &other, INT offsetInDescriptors, UINT descriptorIncrementSize)
1071 {
1072 InitOffsetted(other, offsetInDescriptors, descriptorIncrementSize);
1073 }
OffsetCD3DX12_CPU_DESCRIPTOR_HANDLE1074 CD3DX12_CPU_DESCRIPTOR_HANDLE& Offset(INT offsetInDescriptors, UINT descriptorIncrementSize)
1075 {
1076 ptr += offsetInDescriptors * descriptorIncrementSize;
1077 return *this;
1078 }
OffsetCD3DX12_CPU_DESCRIPTOR_HANDLE1079 CD3DX12_CPU_DESCRIPTOR_HANDLE& Offset(INT offsetScaledByIncrementSize)
1080 {
1081 ptr += offsetScaledByIncrementSize;
1082 return *this;
1083 }
1084 bool operator==(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE& other)
1085 {
1086 return (ptr == other.ptr);
1087 }
1088 bool operator!=(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE& other)
1089 {
1090 return (ptr != other.ptr);
1091 }
1092 CD3DX12_CPU_DESCRIPTOR_HANDLE &operator=(const D3D12_CPU_DESCRIPTOR_HANDLE &other)
1093 {
1094 ptr = other.ptr;
1095 return *this;
1096 }
1097
InitOffsettedCD3DX12_CPU_DESCRIPTOR_HANDLE1098 inline void InitOffsetted(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE &base, INT offsetScaledByIncrementSize)
1099 {
1100 InitOffsetted(*this, base, offsetScaledByIncrementSize);
1101 }
1102
InitOffsettedCD3DX12_CPU_DESCRIPTOR_HANDLE1103 inline void InitOffsetted(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE &base, INT offsetInDescriptors, UINT descriptorIncrementSize)
1104 {
1105 InitOffsetted(*this, base, offsetInDescriptors, descriptorIncrementSize);
1106 }
1107
InitOffsettedCD3DX12_CPU_DESCRIPTOR_HANDLE1108 static inline void InitOffsetted(_Out_ D3D12_CPU_DESCRIPTOR_HANDLE &handle, _In_ const D3D12_CPU_DESCRIPTOR_HANDLE &base, INT offsetScaledByIncrementSize)
1109 {
1110 handle.ptr = base.ptr + offsetScaledByIncrementSize;
1111 }
1112
InitOffsettedCD3DX12_CPU_DESCRIPTOR_HANDLE1113 static inline void InitOffsetted(_Out_ D3D12_CPU_DESCRIPTOR_HANDLE &handle, _In_ const D3D12_CPU_DESCRIPTOR_HANDLE &base, INT offsetInDescriptors, UINT descriptorIncrementSize)
1114 {
1115 handle.ptr = base.ptr + offsetInDescriptors * descriptorIncrementSize;
1116 }
1117 };
1118
1119 //------------------------------------------------------------------------------------------------
1120 struct CD3DX12_GPU_DESCRIPTOR_HANDLE : public D3D12_GPU_DESCRIPTOR_HANDLE
1121 {
CD3DX12_GPU_DESCRIPTOR_HANDLECD3DX12_GPU_DESCRIPTOR_HANDLE1122 CD3DX12_GPU_DESCRIPTOR_HANDLE() {}
CD3DX12_GPU_DESCRIPTOR_HANDLECD3DX12_GPU_DESCRIPTOR_HANDLE1123 explicit CD3DX12_GPU_DESCRIPTOR_HANDLE(const D3D12_GPU_DESCRIPTOR_HANDLE &o) :
1124 D3D12_GPU_DESCRIPTOR_HANDLE(o)
1125 {}
CD3DX12_GPU_DESCRIPTOR_HANDLECD3DX12_GPU_DESCRIPTOR_HANDLE1126 CD3DX12_GPU_DESCRIPTOR_HANDLE(CD3DX12_DEFAULT) { ptr = 0; }
CD3DX12_GPU_DESCRIPTOR_HANDLECD3DX12_GPU_DESCRIPTOR_HANDLE1127 CD3DX12_GPU_DESCRIPTOR_HANDLE(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE &other, INT offsetScaledByIncrementSize)
1128 {
1129 InitOffsetted(other, offsetScaledByIncrementSize);
1130 }
CD3DX12_GPU_DESCRIPTOR_HANDLECD3DX12_GPU_DESCRIPTOR_HANDLE1131 CD3DX12_GPU_DESCRIPTOR_HANDLE(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE &other, INT offsetInDescriptors, UINT descriptorIncrementSize)
1132 {
1133 InitOffsetted(other, offsetInDescriptors, descriptorIncrementSize);
1134 }
OffsetCD3DX12_GPU_DESCRIPTOR_HANDLE1135 CD3DX12_GPU_DESCRIPTOR_HANDLE& Offset(INT offsetInDescriptors, UINT descriptorIncrementSize)
1136 {
1137 ptr += offsetInDescriptors * descriptorIncrementSize;
1138 return *this;
1139 }
OffsetCD3DX12_GPU_DESCRIPTOR_HANDLE1140 CD3DX12_GPU_DESCRIPTOR_HANDLE& Offset(INT offsetScaledByIncrementSize)
1141 {
1142 ptr += offsetScaledByIncrementSize;
1143 return *this;
1144 }
1145 inline bool operator==(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE& other)
1146 {
1147 return (ptr == other.ptr);
1148 }
1149 inline bool operator!=(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE& other)
1150 {
1151 return (ptr != other.ptr);
1152 }
1153 CD3DX12_GPU_DESCRIPTOR_HANDLE &operator=(const D3D12_GPU_DESCRIPTOR_HANDLE &other)
1154 {
1155 ptr = other.ptr;
1156 return *this;
1157 }
1158
InitOffsettedCD3DX12_GPU_DESCRIPTOR_HANDLE1159 inline void InitOffsetted(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE &base, INT offsetScaledByIncrementSize)
1160 {
1161 InitOffsetted(*this, base, offsetScaledByIncrementSize);
1162 }
1163
InitOffsettedCD3DX12_GPU_DESCRIPTOR_HANDLE1164 inline void InitOffsetted(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE &base, INT offsetInDescriptors, UINT descriptorIncrementSize)
1165 {
1166 InitOffsetted(*this, base, offsetInDescriptors, descriptorIncrementSize);
1167 }
1168
InitOffsettedCD3DX12_GPU_DESCRIPTOR_HANDLE1169 static inline void InitOffsetted(_Out_ D3D12_GPU_DESCRIPTOR_HANDLE &handle, _In_ const D3D12_GPU_DESCRIPTOR_HANDLE &base, INT offsetScaledByIncrementSize)
1170 {
1171 handle.ptr = base.ptr + offsetScaledByIncrementSize;
1172 }
1173
InitOffsettedCD3DX12_GPU_DESCRIPTOR_HANDLE1174 static inline void InitOffsetted(_Out_ D3D12_GPU_DESCRIPTOR_HANDLE &handle, _In_ const D3D12_GPU_DESCRIPTOR_HANDLE &base, INT offsetInDescriptors, UINT descriptorIncrementSize)
1175 {
1176 handle.ptr = base.ptr + offsetInDescriptors * descriptorIncrementSize;
1177 }
1178 };
1179
1180 //------------------------------------------------------------------------------------------------
D3D12CalcSubresource(UINT MipSlice,UINT ArraySlice,UINT PlaneSlice,UINT MipLevels,UINT ArraySize)1181 inline UINT D3D12CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT PlaneSlice, UINT MipLevels, UINT ArraySize )
1182 {
1183 return MipSlice + ArraySlice * MipLevels + PlaneSlice * MipLevels * ArraySize;
1184 }
1185
1186 //------------------------------------------------------------------------------------------------
1187 template <typename T, typename U, typename V>
D3D12DecomposeSubresource(UINT Subresource,UINT MipLevels,UINT ArraySize,_Out_ T & MipSlice,_Out_ U & ArraySlice,_Out_ V & PlaneSlice)1188 inline void D3D12DecomposeSubresource( UINT Subresource, UINT MipLevels, UINT ArraySize, _Out_ T& MipSlice, _Out_ U& ArraySlice, _Out_ V& PlaneSlice )
1189 {
1190 MipSlice = static_cast<T>(Subresource % MipLevels);
1191 ArraySlice = static_cast<U>((Subresource / MipLevels) % ArraySize);
1192 PlaneSlice = static_cast<V>(Subresource / (MipLevels * ArraySize));
1193 }
1194
1195 //------------------------------------------------------------------------------------------------
D3D12GetFormatPlaneCount(_In_ ID3D12Device * pDevice,DXGI_FORMAT Format)1196 inline UINT8 D3D12GetFormatPlaneCount(
1197 _In_ ID3D12Device* pDevice,
1198 DXGI_FORMAT Format
1199 )
1200 {
1201 D3D12_FEATURE_DATA_FORMAT_INFO formatInfo = {Format};
1202 if (FAILED(pDevice->CheckFeatureSupport(D3D12_FEATURE_FORMAT_INFO, &formatInfo, sizeof(formatInfo))))
1203 {
1204 return 0;
1205 }
1206 return formatInfo.PlaneCount;
1207 }
1208
1209 //------------------------------------------------------------------------------------------------
1210 struct CD3DX12_RESOURCE_DESC : public D3D12_RESOURCE_DESC
1211 {
CD3DX12_RESOURCE_DESCCD3DX12_RESOURCE_DESC1212 CD3DX12_RESOURCE_DESC()
1213 {}
CD3DX12_RESOURCE_DESCCD3DX12_RESOURCE_DESC1214 explicit CD3DX12_RESOURCE_DESC( const D3D12_RESOURCE_DESC& o ) :
1215 D3D12_RESOURCE_DESC( o )
1216 {}
CD3DX12_RESOURCE_DESCCD3DX12_RESOURCE_DESC1217 CD3DX12_RESOURCE_DESC(
1218 D3D12_RESOURCE_DIMENSION dimension,
1219 UINT64 alignment,
1220 UINT64 width,
1221 UINT height,
1222 UINT16 depthOrArraySize,
1223 UINT16 mipLevels,
1224 DXGI_FORMAT format,
1225 UINT sampleCount,
1226 UINT sampleQuality,
1227 D3D12_TEXTURE_LAYOUT layout,
1228 D3D12_RESOURCE_FLAGS flags )
1229 {
1230 Dimension = dimension;
1231 Alignment = alignment;
1232 Width = width;
1233 Height = height;
1234 DepthOrArraySize = depthOrArraySize;
1235 MipLevels = mipLevels;
1236 Format = format;
1237 SampleDesc.Count = sampleCount;
1238 SampleDesc.Quality = sampleQuality;
1239 Layout = layout;
1240 Flags = flags;
1241 }
1242 static inline CD3DX12_RESOURCE_DESC Buffer(
1243 const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
1244 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE )
1245 {
1246 return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_BUFFER, resAllocInfo.Alignment, resAllocInfo.SizeInBytes,
1247 1, 1, 1, DXGI_FORMAT_UNKNOWN, 1, 0, D3D12_TEXTURE_LAYOUT_ROW_MAJOR, flags );
1248 }
1249 static inline CD3DX12_RESOURCE_DESC Buffer(
1250 UINT64 width,
1251 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
1252 UINT64 alignment = 0 )
1253 {
1254 return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_BUFFER, alignment, width, 1, 1, 1,
1255 DXGI_FORMAT_UNKNOWN, 1, 0, D3D12_TEXTURE_LAYOUT_ROW_MAJOR, flags );
1256 }
1257 static inline CD3DX12_RESOURCE_DESC Tex1D(
1258 DXGI_FORMAT format,
1259 UINT64 width,
1260 UINT16 arraySize = 1,
1261 UINT16 mipLevels = 0,
1262 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
1263 D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN,
1264 UINT64 alignment = 0 )
1265 {
1266 return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_TEXTURE1D, alignment, width, 1, arraySize,
1267 mipLevels, format, 1, 0, layout, flags );
1268 }
1269 static inline CD3DX12_RESOURCE_DESC Tex2D(
1270 DXGI_FORMAT format,
1271 UINT64 width,
1272 UINT height,
1273 UINT16 arraySize = 1,
1274 UINT16 mipLevels = 0,
1275 UINT sampleCount = 1,
1276 UINT sampleQuality = 0,
1277 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
1278 D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN,
1279 UINT64 alignment = 0 )
1280 {
1281 return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_TEXTURE2D, alignment, width, height, arraySize,
1282 mipLevels, format, sampleCount, sampleQuality, layout, flags );
1283 }
1284 static inline CD3DX12_RESOURCE_DESC Tex3D(
1285 DXGI_FORMAT format,
1286 UINT64 width,
1287 UINT height,
1288 UINT16 depth,
1289 UINT16 mipLevels = 0,
1290 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
1291 D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN,
1292 UINT64 alignment = 0 )
1293 {
1294 return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_TEXTURE3D, alignment, width, height, depth,
1295 mipLevels, format, 1, 0, layout, flags );
1296 }
DepthCD3DX12_RESOURCE_DESC1297 inline UINT16 Depth() const
1298 { return (Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1); }
ArraySizeCD3DX12_RESOURCE_DESC1299 inline UINT16 ArraySize() const
1300 { return (Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1); }
PlaneCountCD3DX12_RESOURCE_DESC1301 inline UINT8 PlaneCount(_In_ ID3D12Device* pDevice) const
1302 { return D3D12GetFormatPlaneCount(pDevice, Format); }
SubresourcesCD3DX12_RESOURCE_DESC1303 inline UINT Subresources(_In_ ID3D12Device* pDevice) const
1304 { return MipLevels * ArraySize() * PlaneCount(pDevice); }
CalcSubresourceCD3DX12_RESOURCE_DESC1305 inline UINT CalcSubresource(UINT MipSlice, UINT ArraySlice, UINT PlaneSlice)
1306 { return D3D12CalcSubresource(MipSlice, ArraySlice, PlaneSlice, MipLevels, ArraySize()); }
1307 // operator const D3D12_RESOURCE_DESC&() const { return *this; }
1308 };
1309 inline bool operator==( const D3D12_RESOURCE_DESC& l, const D3D12_RESOURCE_DESC& r )
1310 {
1311 return l.Dimension == r.Dimension &&
1312 l.Alignment == r.Alignment &&
1313 l.Width == r.Width &&
1314 l.Height == r.Height &&
1315 l.DepthOrArraySize == r.DepthOrArraySize &&
1316 l.MipLevels == r.MipLevels &&
1317 l.Format == r.Format &&
1318 l.SampleDesc.Count == r.SampleDesc.Count &&
1319 l.SampleDesc.Quality == r.SampleDesc.Quality &&
1320 l.Layout == r.Layout &&
1321 l.Flags == r.Flags;
1322 }
1323 inline bool operator!=( const D3D12_RESOURCE_DESC& l, const D3D12_RESOURCE_DESC& r )
1324 { return !( l == r ); }
1325
1326 //------------------------------------------------------------------------------------------------
1327 // Row-by-row memcpy
MemcpySubresource(_In_ const D3D12_MEMCPY_DEST * pDest,_In_ const D3D12_SUBRESOURCE_DATA * pSrc,SIZE_T RowSizeInBytes,UINT NumRows,UINT NumSlices)1328 inline void MemcpySubresource(
1329 _In_ const D3D12_MEMCPY_DEST* pDest,
1330 _In_ const D3D12_SUBRESOURCE_DATA* pSrc,
1331 SIZE_T RowSizeInBytes,
1332 UINT NumRows,
1333 UINT NumSlices)
1334 {
1335 for (UINT z = 0; z < NumSlices; ++z)
1336 {
1337 BYTE* pDestSlice = reinterpret_cast<BYTE*>(pDest->pData) + pDest->SlicePitch * z;
1338 const BYTE* pSrcSlice = reinterpret_cast<const BYTE*>(pSrc->pData) + pSrc->SlicePitch * z;
1339 for (UINT y = 0; y < NumRows; ++y)
1340 {
1341 memcpy(pDestSlice + pDest->RowPitch * y,
1342 pSrcSlice + pSrc->RowPitch * y,
1343 RowSizeInBytes);
1344 }
1345 }
1346 }
1347
1348 namespace MinGW_Workaround
1349 {
ID3D12ResourceGetDesc(ID3D12Resource * _resource)1350 inline D3D12_RESOURCE_DESC ID3D12ResourceGetDesc(ID3D12Resource* _resource)
1351 {
1352 D3D12_RESOURCE_DESC desc;
1353 union {
1354 D3D12_RESOURCE_DESC (STDMETHODCALLTYPE ID3D12Resource::*w)();
1355 void (STDMETHODCALLTYPE ID3D12Resource::*f)(D3D12_RESOURCE_DESC *);
1356 } conversion = { &ID3D12Resource::GetDesc };
1357 (_resource->*conversion.f)(&desc);
1358 return desc;
1359 }
1360 }
1361
1362 //------------------------------------------------------------------------------------------------
1363 // Returns required size of a buffer to be used for data upload
1364 inline UINT64 GetRequiredIntermediateSize(
1365 _In_ ID3D12Resource* pDestinationResource,
1366 _In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource,
1367 _In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources)
1368 {
1369 D3D12_RESOURCE_DESC Desc = MinGW_Workaround::ID3D12ResourceGetDesc(pDestinationResource);
1370 UINT64 RequiredSize = 0;
1371
1372 ID3D12Device* pDevice;
1373 pDestinationResource->GetDevice(__uuidof(ID3D12Device), reinterpret_cast<void**>(&pDevice));
1374 pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, 0, nullptr, nullptr, nullptr, &RequiredSize);
1375 pDevice->Release();
1376
1377 return RequiredSize;
1378 }
1379
1380 //------------------------------------------------------------------------------------------------
1381 // All arrays must be populated (e.g. by calling GetCopyableFootprints)
1382 inline UINT64 UpdateSubresources(
1383 _In_ ID3D12GraphicsCommandList* pCmdList,
1384 _In_ ID3D12Resource* pDestinationResource,
1385 _In_ ID3D12Resource* pIntermediate,
1386 _In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource,
1387 _In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources,
1388 UINT64 RequiredSize,
1389 _In_reads_(NumSubresources) const D3D12_PLACED_SUBRESOURCE_FOOTPRINT* pLayouts,
1390 _In_reads_(NumSubresources) const UINT* pNumRows,
1391 _In_reads_(NumSubresources) const UINT64* pRowSizesInBytes,
1392 _In_reads_(NumSubresources) const D3D12_SUBRESOURCE_DATA* pSrcData)
1393 {
1394 // Minor validation
1395 D3D12_RESOURCE_DESC IntermediateDesc = MinGW_Workaround::ID3D12ResourceGetDesc(pIntermediate);
1396 D3D12_RESOURCE_DESC DestinationDesc = MinGW_Workaround::ID3D12ResourceGetDesc(pDestinationResource);
1397 if (IntermediateDesc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER ||
1398 IntermediateDesc.Width < RequiredSize + pLayouts[0].Offset ||
1399 RequiredSize > (SIZE_T)-1 ||
1400 (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER &&
1401 (FirstSubresource != 0 || NumSubresources != 1)))
1402 {
1403 return 0;
1404 }
1405
1406 BYTE* pData;
1407 HRESULT hr = pIntermediate->Map(0, NULL, reinterpret_cast<void**>(&pData));
1408 if (FAILED(hr))
1409 {
1410 return 0;
1411 }
1412
1413 for (UINT i = 0; i < NumSubresources; ++i)
1414 {
1415 if (pRowSizesInBytes[i] > (SIZE_T)-1) return 0;
1416 D3D12_MEMCPY_DEST DestData = { pData + pLayouts[i].Offset, pLayouts[i].Footprint.RowPitch, pLayouts[i].Footprint.RowPitch * pNumRows[i] };
1417 MemcpySubresource(&DestData, &pSrcData[i], (SIZE_T)pRowSizesInBytes[i], pNumRows[i], pLayouts[i].Footprint.Depth);
1418 }
1419 pIntermediate->Unmap(0, NULL);
1420
1421 if (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER)
1422 {
1423 CD3DX12_BOX SrcBox( UINT( pLayouts[0].Offset ), UINT( pLayouts[0].Offset + pLayouts[0].Footprint.Width ) );
1424 pCmdList->CopyBufferRegion(
1425 pDestinationResource, 0, pIntermediate, pLayouts[0].Offset, pLayouts[0].Footprint.Width);
1426 }
1427 else
1428 {
1429 for (UINT i = 0; i < NumSubresources; ++i)
1430 {
1431 CD3DX12_TEXTURE_COPY_LOCATION Dst(pDestinationResource, i + FirstSubresource);
1432 CD3DX12_TEXTURE_COPY_LOCATION Src(pIntermediate, pLayouts[i]);
1433 pCmdList->CopyTextureRegion(&Dst, 0, 0, 0, &Src, nullptr);
1434 }
1435 }
1436 return RequiredSize;
1437 }
1438
1439 //------------------------------------------------------------------------------------------------
1440 // Heap-allocating UpdateSubresources implementation
1441 inline UINT64 UpdateSubresources(
1442 _In_ ID3D12GraphicsCommandList* pCmdList,
1443 _In_ ID3D12Resource* pDestinationResource,
1444 _In_ ID3D12Resource* pIntermediate,
1445 UINT64 IntermediateOffset,
1446 _In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource,
1447 _In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources,
1448 _In_reads_(NumSubresources) D3D12_SUBRESOURCE_DATA* pSrcData)
1449 {
1450 UINT64 RequiredSize = 0;
1451 UINT64 MemToAlloc = static_cast<UINT64>(sizeof(D3D12_PLACED_SUBRESOURCE_FOOTPRINT) + sizeof(UINT) + sizeof(UINT64)) * NumSubresources;
1452 if (MemToAlloc > SIZE_MAX)
1453 {
1454 return 0;
1455 }
1456 void* pMem = HeapAlloc(GetProcessHeap(), 0, static_cast<SIZE_T>(MemToAlloc));
1457 if (pMem == NULL)
1458 {
1459 return 0;
1460 }
1461 D3D12_PLACED_SUBRESOURCE_FOOTPRINT* pLayouts = reinterpret_cast<D3D12_PLACED_SUBRESOURCE_FOOTPRINT*>(pMem);
1462 UINT64* pRowSizesInBytes = reinterpret_cast<UINT64*>(pLayouts + NumSubresources);
1463 UINT* pNumRows = reinterpret_cast<UINT*>(pRowSizesInBytes + NumSubresources);
1464
1465 D3D12_RESOURCE_DESC Desc = MinGW_Workaround::ID3D12ResourceGetDesc(pDestinationResource);
1466 ID3D12Device* pDevice;
1467 pDestinationResource->GetDevice(__uuidof(ID3D12Device), reinterpret_cast<void**>(&pDevice));
1468 pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, IntermediateOffset, pLayouts, pNumRows, pRowSizesInBytes, &RequiredSize);
1469 pDevice->Release();
1470
1471 UINT64 Result = UpdateSubresources(pCmdList, pDestinationResource, pIntermediate, FirstSubresource, NumSubresources, RequiredSize, pLayouts, pNumRows, pRowSizesInBytes, pSrcData);
1472 HeapFree(GetProcessHeap(), 0, pMem);
1473 return Result;
1474 }
1475
1476 //------------------------------------------------------------------------------------------------
1477 // Stack-allocating UpdateSubresources implementation
1478 template <UINT MaxSubresources>
1479 inline UINT64 UpdateSubresources(
1480 _In_ ID3D12GraphicsCommandList* pCmdList,
1481 _In_ ID3D12Resource* pDestinationResource,
1482 _In_ ID3D12Resource* pIntermediate,
1483 UINT64 IntermediateOffset,
1484 _In_range_(0, MaxSubresources) UINT FirstSubresource,
1485 _In_range_(1, MaxSubresources - FirstSubresource) UINT NumSubresources,
1486 _In_reads_(NumSubresources) D3D12_SUBRESOURCE_DATA* pSrcData)
1487 {
1488 UINT64 RequiredSize = 0;
1489 D3D12_PLACED_SUBRESOURCE_FOOTPRINT Layouts[MaxSubresources];
1490 UINT NumRows[MaxSubresources];
1491 UINT64 RowSizesInBytes[MaxSubresources];
1492
1493 D3D12_RESOURCE_DESC Desc = MinGW_Workaround::ID3D12ResourceGetDesc(pDestinationResource);
1494 ID3D12Device* pDevice;
1495 pDestinationResource->GetDevice(__uuidof(*pDevice), reinterpret_cast<void**>(&pDevice));
1496 pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, IntermediateOffset, Layouts, NumRows, RowSizesInBytes, &RequiredSize);
1497 pDevice->Release();
1498
1499 return UpdateSubresources(pCmdList, pDestinationResource, pIntermediate, FirstSubresource, NumSubresources, RequiredSize, Layouts, NumRows, RowSizesInBytes, pSrcData);
1500 }
1501
1502 //------------------------------------------------------------------------------------------------
D3D12IsLayoutOpaque(D3D12_TEXTURE_LAYOUT Layout)1503 inline bool D3D12IsLayoutOpaque( D3D12_TEXTURE_LAYOUT Layout )
1504 { return Layout == D3D12_TEXTURE_LAYOUT_UNKNOWN || Layout == D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE; }
1505
1506 //------------------------------------------------------------------------------------------------
CommandListCast(ID3D12GraphicsCommandList * const * pp)1507 inline ID3D12CommandList * const * CommandListCast(ID3D12GraphicsCommandList * const * pp)
1508 {
1509 // This cast is useful for passing strongly typed command list pointers into
1510 // ExecuteCommandLists.
1511 // This cast is valid as long as the const-ness is respected. D3D12 APIs do
1512 // respect the const-ness of their arguments.
1513 return reinterpret_cast<ID3D12CommandList * const *>(pp);
1514 }
1515
1516
1517 #endif // defined( __cplusplus )
1518
1519 #endif //__D3DX12_H__
1520
1521
1522
1523