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