15#if defined( __cplusplus )
17struct CD3DX12_DEFAULT {};
18extern const DECLSPEC_SELECTANY CD3DX12_DEFAULT D3D12_DEFAULT;
21inline bool operator==(
const D3D12_VIEWPORT& l,
const D3D12_VIEWPORT& r )
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;
28inline bool operator!=(
const D3D12_VIEWPORT& l,
const D3D12_VIEWPORT& r )
29{
return !( l == r ); }
32struct CD3DX12_RECT :
public D3D12_RECT
36 explicit CD3DX12_RECT(
const D3D12_RECT& o ) :
39 explicit CD3DX12_RECT(
51 operator const D3D12_RECT&()
const {
return *
this; }
55struct CD3DX12_BOX :
public D3D12_BOX
59 explicit CD3DX12_BOX(
const D3D12_BOX& o ) :
102 operator const D3D12_BOX&()
const {
return *
this; }
104inline bool operator==(
const D3D12_BOX& l,
const D3D12_BOX& r )
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;
109inline bool operator!=(
const D3D12_BOX& l,
const D3D12_BOX& r )
110{
return !( l == r ); }
113struct CD3DX12_DEPTH_STENCIL_DESC :
public D3D12_DEPTH_STENCIL_DESC
115 CD3DX12_DEPTH_STENCIL_DESC()
117 explicit CD3DX12_DEPTH_STENCIL_DESC(
const D3D12_DEPTH_STENCIL_DESC& o ) :
118 D3D12_DEPTH_STENCIL_DESC( o )
120 explicit CD3DX12_DEPTH_STENCIL_DESC( CD3DX12_DEFAULT )
123 DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL;
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;
133 explicit CD3DX12_DEPTH_STENCIL_DESC(
135 D3D12_DEPTH_WRITE_MASK depthWriteMask,
136 D3D12_COMPARISON_FUNC depthFunc,
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 )
149 DepthEnable = depthEnable;
150 DepthWriteMask = depthWriteMask;
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;
164 ~CD3DX12_DEPTH_STENCIL_DESC() {}
165 operator const D3D12_DEPTH_STENCIL_DESC&()
const {
return *
this; }
169struct CD3DX12_BLEND_DESC :
public D3D12_BLEND_DESC
173 explicit CD3DX12_BLEND_DESC(
const D3D12_BLEND_DESC& o ) :
174 D3D12_BLEND_DESC( o )
176 explicit CD3DX12_BLEND_DESC( CD3DX12_DEFAULT )
178 AlphaToCoverageEnable = FALSE;
179 IndependentBlendEnable = FALSE;
180 const D3D12_RENDER_TARGET_BLEND_DESC defaultRenderTargetBlendDesc =
183 D3D12_BLEND_ONE, D3D12_BLEND_ZERO, D3D12_BLEND_OP_ADD,
184 D3D12_BLEND_ONE, D3D12_BLEND_ZERO, D3D12_BLEND_OP_ADD,
186 D3D12_COLOR_WRITE_ENABLE_ALL,
188 for (UINT i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i)
189 RenderTarget[ i ] = defaultRenderTargetBlendDesc;
191 ~CD3DX12_BLEND_DESC() {}
192 operator const D3D12_BLEND_DESC&()
const {
return *
this; }
196struct CD3DX12_RASTERIZER_DESC :
public D3D12_RASTERIZER_DESC
198 CD3DX12_RASTERIZER_DESC()
200 explicit CD3DX12_RASTERIZER_DESC(
const D3D12_RASTERIZER_DESC& o ) :
201 D3D12_RASTERIZER_DESC( o )
203 explicit CD3DX12_RASTERIZER_DESC( CD3DX12_DEFAULT )
205 FillMode = D3D12_FILL_MODE_SOLID;
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;
217 explicit CD3DX12_RASTERIZER_DESC(
218 D3D12_FILL_MODE fillMode,
219 D3D12_CULL_MODE cullMode,
220 BOOL frontCounterClockwise,
222 FLOAT depthBiasClamp,
223 FLOAT slopeScaledDepthBias,
224 BOOL depthClipEnable,
225 BOOL multisampleEnable,
226 BOOL antialiasedLineEnable,
227 UINT forcedSampleCount,
228 D3D12_CONSERVATIVE_RASTERIZATION_MODE conservativeRaster)
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;
242 ~CD3DX12_RASTERIZER_DESC() {}
243 operator const D3D12_RASTERIZER_DESC&()
const {
return *
this; }
247struct CD3DX12_RESOURCE_ALLOCATION_INFO :
public D3D12_RESOURCE_ALLOCATION_INFO
249 CD3DX12_RESOURCE_ALLOCATION_INFO()
251 explicit CD3DX12_RESOURCE_ALLOCATION_INFO(
const D3D12_RESOURCE_ALLOCATION_INFO& o ) :
252 D3D12_RESOURCE_ALLOCATION_INFO( o )
254 CD3DX12_RESOURCE_ALLOCATION_INFO(
259 Alignment = alignment;
261 operator const D3D12_RESOURCE_ALLOCATION_INFO&()
const {
return *
this; }
265struct CD3DX12_HEAP_PROPERTIES :
public D3D12_HEAP_PROPERTIES
267 CD3DX12_HEAP_PROPERTIES()
269 explicit CD3DX12_HEAP_PROPERTIES(
const D3D12_HEAP_PROPERTIES &o) :
270 D3D12_HEAP_PROPERTIES(o)
272 CD3DX12_HEAP_PROPERTIES(
273 D3D12_CPU_PAGE_PROPERTY cpuPageProperty,
274 D3D12_MEMORY_POOL memoryPoolPreference,
275 UINT creationNodeMask = 1,
278 Type = D3D12_HEAP_TYPE_CUSTOM;
279 CPUPageProperty = cpuPageProperty;
280 MemoryPoolPreference = memoryPoolPreference;
281 CreationNodeMask = creationNodeMask;
282 VisibleNodeMask = nodeMask;
284 explicit CD3DX12_HEAP_PROPERTIES(
285 D3D12_HEAP_TYPE type,
286 UINT creationNodeMask = 1,
290 CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
291 MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
292 CreationNodeMask = creationNodeMask;
293 VisibleNodeMask = nodeMask;
295 operator const D3D12_HEAP_PROPERTIES&()
const {
return *
this; }
296 bool IsCPUAccessible()
const
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));
302inline bool operator==(
const D3D12_HEAP_PROPERTIES& l,
const D3D12_HEAP_PROPERTIES& r )
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;
309inline bool operator!=(
const D3D12_HEAP_PROPERTIES& l,
const D3D12_HEAP_PROPERTIES& r )
310{
return !( l == r ); }
313struct CD3DX12_HEAP_DESC :
public D3D12_HEAP_DESC
317 explicit CD3DX12_HEAP_DESC(
const D3D12_HEAP_DESC &o) :
322 D3D12_HEAP_PROPERTIES properties,
323 UINT64 alignment = 0,
324 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE )
327 Properties = properties;
328 Alignment = alignment;
333 D3D12_HEAP_TYPE type,
334 UINT64 alignment = 0,
335 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE )
338 Properties = CD3DX12_HEAP_PROPERTIES( type );
339 Alignment = alignment;
344 D3D12_CPU_PAGE_PROPERTY cpuPageProperty,
345 D3D12_MEMORY_POOL memoryPoolPreference,
346 UINT64 alignment = 0,
347 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE )
350 Properties = CD3DX12_HEAP_PROPERTIES( cpuPageProperty, memoryPoolPreference );
351 Alignment = alignment;
355 const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
356 D3D12_HEAP_PROPERTIES properties,
357 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE )
359 SizeInBytes = resAllocInfo.SizeInBytes;
360 Properties = properties;
361 Alignment = resAllocInfo.Alignment;
365 const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
366 D3D12_HEAP_TYPE type,
367 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE )
369 SizeInBytes = resAllocInfo.SizeInBytes;
370 Properties = CD3DX12_HEAP_PROPERTIES( type );
371 Alignment = resAllocInfo.Alignment;
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 )
380 SizeInBytes = resAllocInfo.SizeInBytes;
381 Properties = CD3DX12_HEAP_PROPERTIES( cpuPageProperty, memoryPoolPreference );
382 Alignment = resAllocInfo.Alignment;
385 operator const D3D12_HEAP_DESC&()
const {
return *
this; }
386 bool IsCPUAccessible()
const
387 {
return static_cast< const CD3DX12_HEAP_PROPERTIES*
>( &Properties )->IsCPUAccessible(); }
389inline bool operator==(
const D3D12_HEAP_DESC& l,
const D3D12_HEAP_DESC& r )
391 return l.SizeInBytes == r.SizeInBytes &&
392 l.Properties == r.Properties &&
393 l.Alignment == r.Alignment &&
396inline bool operator!=(
const D3D12_HEAP_DESC& l,
const D3D12_HEAP_DESC& r )
397{
return !( l == r ); }
400struct CD3DX12_CLEAR_VALUE :
public D3D12_CLEAR_VALUE
402 CD3DX12_CLEAR_VALUE()
404 explicit CD3DX12_CLEAR_VALUE(
const D3D12_CLEAR_VALUE &o) :
409 const FLOAT color[4] )
412 memcpy( Color, color,
sizeof( Color ) );
421 memcpy( &DepthStencil.Depth, &depth,
sizeof( depth ) );
422 DepthStencil.Stencil = stencil;
424 operator const D3D12_CLEAR_VALUE&()
const {
return *
this; }
428struct CD3DX12_RANGE :
public D3D12_RANGE
432 explicit CD3DX12_RANGE(
const D3D12_RANGE &o) :
442 operator const D3D12_RANGE&()
const {
return *
this; }
446struct CD3DX12_TILED_RESOURCE_COORDINATE :
public D3D12_TILED_RESOURCE_COORDINATE
448 CD3DX12_TILED_RESOURCE_COORDINATE()
450 explicit CD3DX12_TILED_RESOURCE_COORDINATE(
const D3D12_TILED_RESOURCE_COORDINATE &o) :
451 D3D12_TILED_RESOURCE_COORDINATE(o)
453 CD3DX12_TILED_RESOURCE_COORDINATE(
462 Subresource = subresource;
464 operator const D3D12_TILED_RESOURCE_COORDINATE&()
const {
return *
this; }
468struct CD3DX12_TILE_REGION_SIZE :
public D3D12_TILE_REGION_SIZE
470 CD3DX12_TILE_REGION_SIZE()
472 explicit CD3DX12_TILE_REGION_SIZE(
const D3D12_TILE_REGION_SIZE &o) :
473 D3D12_TILE_REGION_SIZE(o)
475 CD3DX12_TILE_REGION_SIZE(
488 operator const D3D12_TILE_REGION_SIZE&()
const {
return *
this; }
492struct CD3DX12_SUBRESOURCE_TILING :
public D3D12_SUBRESOURCE_TILING
494 CD3DX12_SUBRESOURCE_TILING()
496 explicit CD3DX12_SUBRESOURCE_TILING(
const D3D12_SUBRESOURCE_TILING &o) :
497 D3D12_SUBRESOURCE_TILING(o)
499 CD3DX12_SUBRESOURCE_TILING(
501 UINT16 heightInTiles,
503 UINT startTileIndexInOverallResource )
505 WidthInTiles = widthInTiles;
506 HeightInTiles = heightInTiles;
507 DepthInTiles = depthInTiles;
508 StartTileIndexInOverallResource = startTileIndexInOverallResource;
510 operator const D3D12_SUBRESOURCE_TILING&()
const {
return *
this; }
514struct CD3DX12_TILE_SHAPE :
public D3D12_TILE_SHAPE
518 explicit CD3DX12_TILE_SHAPE(
const D3D12_TILE_SHAPE &o) :
526 WidthInTexels = widthInTexels;
527 HeightInTexels = heightInTexels;
528 DepthInTexels = depthInTexels;
530 operator const D3D12_TILE_SHAPE&()
const {
return *
this; }
534struct CD3DX12_RESOURCE_BARRIER :
public D3D12_RESOURCE_BARRIER
536 CD3DX12_RESOURCE_BARRIER()
538 explicit CD3DX12_RESOURCE_BARRIER(
const D3D12_RESOURCE_BARRIER &o) :
539 D3D12_RESOURCE_BARRIER(o)
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)
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;
559 static inline CD3DX12_RESOURCE_BARRIER Aliasing(
560 _In_ ID3D12Resource* pResourceBefore,
561 _In_ ID3D12Resource* pResourceAfter)
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;
571 static inline CD3DX12_RESOURCE_BARRIER UAV(
572 _In_ ID3D12Resource* pResource)
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;
581 operator const D3D12_RESOURCE_BARRIER&()
const {
return *
this; }
585struct CD3DX12_PACKED_MIP_INFO :
public D3D12_PACKED_MIP_INFO
587 CD3DX12_PACKED_MIP_INFO()
589 explicit CD3DX12_PACKED_MIP_INFO(
const D3D12_PACKED_MIP_INFO &o) :
590 D3D12_PACKED_MIP_INFO(o)
592 CD3DX12_PACKED_MIP_INFO(
593 UINT8 numStandardMips,
595 UINT numTilesForPackedMips,
596 UINT startTileIndexInOverallResource )
598 NumStandardMips = numStandardMips;
599 NumPackedMips = numPackedMips;
600 NumTilesForPackedMips = numTilesForPackedMips;
601 StartTileIndexInOverallResource = startTileIndexInOverallResource;
603 operator const D3D12_PACKED_MIP_INFO&()
const {
return *
this; }
607struct CD3DX12_SUBRESOURCE_FOOTPRINT :
public D3D12_SUBRESOURCE_FOOTPRINT
609 CD3DX12_SUBRESOURCE_FOOTPRINT()
611 explicit CD3DX12_SUBRESOURCE_FOOTPRINT(
const D3D12_SUBRESOURCE_FOOTPRINT &o) :
612 D3D12_SUBRESOURCE_FOOTPRINT(o)
614 CD3DX12_SUBRESOURCE_FOOTPRINT(
627 explicit CD3DX12_SUBRESOURCE_FOOTPRINT(
628 const D3D12_RESOURCE_DESC& resDesc,
631 Format = resDesc.Format;
632 Width = UINT( resDesc.Width );
633 Height = resDesc.Height;
634 Depth = (resDesc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? resDesc.DepthOrArraySize : 1);
637 operator const D3D12_SUBRESOURCE_FOOTPRINT&()
const {
return *
this; }
641struct CD3DX12_TEXTURE_COPY_LOCATION :
public D3D12_TEXTURE_COPY_LOCATION
643 CD3DX12_TEXTURE_COPY_LOCATION()
645 explicit CD3DX12_TEXTURE_COPY_LOCATION(
const D3D12_TEXTURE_COPY_LOCATION &o) :
646 D3D12_TEXTURE_COPY_LOCATION(o)
648 CD3DX12_TEXTURE_COPY_LOCATION(ID3D12Resource* pRes) { pResource = pRes; }
649 CD3DX12_TEXTURE_COPY_LOCATION(ID3D12Resource* pRes, D3D12_PLACED_SUBRESOURCE_FOOTPRINT
const& Footprint)
652 Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
653 PlacedFootprint = Footprint;
655 CD3DX12_TEXTURE_COPY_LOCATION(ID3D12Resource* pRes, UINT Sub)
658 Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
659 SubresourceIndex = Sub;
664struct CD3DX12_DESCRIPTOR_RANGE :
public D3D12_DESCRIPTOR_RANGE
666 CD3DX12_DESCRIPTOR_RANGE() { }
667 explicit CD3DX12_DESCRIPTOR_RANGE(
const D3D12_DESCRIPTOR_RANGE &o) :
668 D3D12_DESCRIPTOR_RANGE(o)
670 CD3DX12_DESCRIPTOR_RANGE(
671 D3D12_DESCRIPTOR_RANGE_TYPE rangeType,
673 UINT baseShaderRegister,
674 UINT registerSpace = 0,
675 UINT offsetInDescriptorsFromTableStart =
676 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND)
678 Init(rangeType, numDescriptors, baseShaderRegister, registerSpace, offsetInDescriptorsFromTableStart);
682 D3D12_DESCRIPTOR_RANGE_TYPE rangeType,
684 UINT baseShaderRegister,
685 UINT registerSpace = 0,
686 UINT offsetInDescriptorsFromTableStart =
687 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND)
689 Init(*
this, rangeType, numDescriptors, baseShaderRegister, registerSpace, offsetInDescriptorsFromTableStart);
692 static inline void Init(
693 _Out_ D3D12_DESCRIPTOR_RANGE &range,
694 D3D12_DESCRIPTOR_RANGE_TYPE rangeType,
696 UINT baseShaderRegister,
697 UINT registerSpace = 0,
698 UINT offsetInDescriptorsFromTableStart =
699 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND)
701 range.RangeType = rangeType;
702 range.NumDescriptors = numDescriptors;
703 range.BaseShaderRegister = baseShaderRegister;
704 range.RegisterSpace = registerSpace;
705 range.OffsetInDescriptorsFromTableStart = offsetInDescriptorsFromTableStart;
710struct CD3DX12_ROOT_DESCRIPTOR_TABLE :
public D3D12_ROOT_DESCRIPTOR_TABLE
712 CD3DX12_ROOT_DESCRIPTOR_TABLE() {}
713 explicit CD3DX12_ROOT_DESCRIPTOR_TABLE(
const D3D12_ROOT_DESCRIPTOR_TABLE &o) :
714 D3D12_ROOT_DESCRIPTOR_TABLE(o)
716 CD3DX12_ROOT_DESCRIPTOR_TABLE(
717 UINT numDescriptorRanges,
718 _In_reads_opt_(numDescriptorRanges)
const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges)
720 Init(numDescriptorRanges, _pDescriptorRanges);
724 UINT numDescriptorRanges,
725 _In_reads_opt_(numDescriptorRanges)
const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges)
727 Init(*
this, numDescriptorRanges, _pDescriptorRanges);
730 static inline void Init(
731 _Out_ D3D12_ROOT_DESCRIPTOR_TABLE &rootDescriptorTable,
732 UINT numDescriptorRanges,
733 _In_reads_opt_(numDescriptorRanges)
const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges)
735 rootDescriptorTable.NumDescriptorRanges = numDescriptorRanges;
736 rootDescriptorTable.pDescriptorRanges = _pDescriptorRanges;
741struct CD3DX12_ROOT_CONSTANTS :
public D3D12_ROOT_CONSTANTS
743 CD3DX12_ROOT_CONSTANTS() {}
744 explicit CD3DX12_ROOT_CONSTANTS(
const D3D12_ROOT_CONSTANTS &o) :
745 D3D12_ROOT_CONSTANTS(o)
747 CD3DX12_ROOT_CONSTANTS(
750 UINT registerSpace = 0)
752 Init(num32BitValues, shaderRegister, registerSpace);
758 UINT registerSpace = 0)
760 Init(*
this, num32BitValues, shaderRegister, registerSpace);
763 static inline void Init(
764 _Out_ D3D12_ROOT_CONSTANTS &rootConstants,
767 UINT registerSpace = 0)
769 rootConstants.Num32BitValues = num32BitValues;
770 rootConstants.ShaderRegister = shaderRegister;
771 rootConstants.RegisterSpace = registerSpace;
776struct CD3DX12_ROOT_DESCRIPTOR :
public D3D12_ROOT_DESCRIPTOR
778 CD3DX12_ROOT_DESCRIPTOR() {}
779 explicit CD3DX12_ROOT_DESCRIPTOR(
const D3D12_ROOT_DESCRIPTOR &o) :
780 D3D12_ROOT_DESCRIPTOR(o)
782 CD3DX12_ROOT_DESCRIPTOR(
784 UINT registerSpace = 0)
786 Init(shaderRegister, registerSpace);
791 UINT registerSpace = 0)
793 Init(*
this, shaderRegister, registerSpace);
796 static inline void Init(_Out_ D3D12_ROOT_DESCRIPTOR &table, UINT shaderRegister, UINT registerSpace = 0)
798 table.ShaderRegister = shaderRegister;
799 table.RegisterSpace = registerSpace;
804struct CD3DX12_ROOT_PARAMETER :
public D3D12_ROOT_PARAMETER
806 CD3DX12_ROOT_PARAMETER() {}
807 explicit CD3DX12_ROOT_PARAMETER(
const D3D12_ROOT_PARAMETER &o) :
808 D3D12_ROOT_PARAMETER(o)
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)
817 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
818 rootParam.ShaderVisibility = visibility;
819 CD3DX12_ROOT_DESCRIPTOR_TABLE::Init(rootParam.DescriptorTable, numDescriptorRanges, pDescriptorRanges);
822 static inline void InitAsConstants(
823 _Out_ D3D12_ROOT_PARAMETER &rootParam,
826 UINT registerSpace = 0,
827 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
829 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;
830 rootParam.ShaderVisibility = visibility;
831 CD3DX12_ROOT_CONSTANTS::Init(rootParam.Constants, num32BitValues, shaderRegister, registerSpace);
834 static inline void InitAsConstantBufferView(
835 _Out_ D3D12_ROOT_PARAMETER &rootParam,
837 UINT registerSpace = 0,
838 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
840 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;
841 rootParam.ShaderVisibility = visibility;
842 CD3DX12_ROOT_DESCRIPTOR::Init(rootParam.Descriptor, shaderRegister, registerSpace);
845 static inline void InitAsShaderResourceView(
846 _Out_ D3D12_ROOT_PARAMETER &rootParam,
848 UINT registerSpace = 0,
849 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
851 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_SRV;
852 rootParam.ShaderVisibility = visibility;
853 CD3DX12_ROOT_DESCRIPTOR::Init(rootParam.Descriptor, shaderRegister, registerSpace);
856 static inline void InitAsUnorderedAccessView(
857 _Out_ D3D12_ROOT_PARAMETER &rootParam,
859 UINT registerSpace = 0,
860 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
862 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV;
863 rootParam.ShaderVisibility = visibility;
864 CD3DX12_ROOT_DESCRIPTOR::Init(rootParam.Descriptor, shaderRegister, registerSpace);
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)
872 InitAsDescriptorTable(*
this, numDescriptorRanges, pDescriptorRanges, visibility);
875 inline void InitAsConstants(
878 UINT registerSpace = 0,
879 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
881 InitAsConstants(*
this, num32BitValues, shaderRegister, registerSpace, visibility);
884 inline void InitAsConstantBufferView(
886 UINT registerSpace = 0,
887 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
889 InitAsConstantBufferView(*
this, shaderRegister, registerSpace, visibility);
892 inline void InitAsShaderResourceView(
894 UINT registerSpace = 0,
895 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
897 InitAsShaderResourceView(*
this, shaderRegister, registerSpace, visibility);
900 inline void InitAsUnorderedAccessView(
902 UINT registerSpace = 0,
903 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
905 InitAsUnorderedAccessView(*
this, shaderRegister, registerSpace, visibility);
910struct CD3DX12_STATIC_SAMPLER_DESC :
public D3D12_STATIC_SAMPLER_DESC
912 CD3DX12_STATIC_SAMPLER_DESC() {}
913 explicit CD3DX12_STATIC_SAMPLER_DESC(
const D3D12_STATIC_SAMPLER_DESC &o) :
914 D3D12_STATIC_SAMPLER_DESC(o)
916 CD3DX12_STATIC_SAMPLER_DESC(
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,
927 FLOAT maxLOD = D3D12_FLOAT32_MAX,
928 D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
929 UINT registerSpace = 0)
947 static inline void Init(
948 _Out_ D3D12_STATIC_SAMPLER_DESC &samplerDesc,
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,
959 FLOAT maxLOD = D3D12_FLOAT32_MAX,
960 D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
961 UINT registerSpace = 0)
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;
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,
988 FLOAT maxLOD = D3D12_FLOAT32_MAX,
989 D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
990 UINT registerSpace = 0)
1012struct CD3DX12_ROOT_SIGNATURE_DESC :
public D3D12_ROOT_SIGNATURE_DESC
1014 CD3DX12_ROOT_SIGNATURE_DESC() {}
1015 explicit CD3DX12_ROOT_SIGNATURE_DESC(
const D3D12_ROOT_SIGNATURE_DESC &o) :
1016 D3D12_ROOT_SIGNATURE_DESC(o)
1018 CD3DX12_ROOT_SIGNATURE_DESC(
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)
1025 Init(numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags);
1027 CD3DX12_ROOT_SIGNATURE_DESC(CD3DX12_DEFAULT)
1029 Init(0, NULL, 0, NULL, D3D12_ROOT_SIGNATURE_FLAG_NONE);
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)
1039 Init(*
this, numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags);
1042 static inline void Init(
1043 _Out_ D3D12_ROOT_SIGNATURE_DESC &desc,
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)
1050 desc.NumParameters = numParameters;
1051 desc.pParameters = _pParameters;
1052 desc.NumStaticSamplers = numStaticSamplers;
1053 desc.pStaticSamplers = _pStaticSamplers;
1059struct CD3DX12_CPU_DESCRIPTOR_HANDLE :
public D3D12_CPU_DESCRIPTOR_HANDLE
1061 CD3DX12_CPU_DESCRIPTOR_HANDLE() {}
1062 explicit CD3DX12_CPU_DESCRIPTOR_HANDLE(
const D3D12_CPU_DESCRIPTOR_HANDLE &o) :
1063 D3D12_CPU_DESCRIPTOR_HANDLE(o)
1065 CD3DX12_CPU_DESCRIPTOR_HANDLE(CD3DX12_DEFAULT) { ptr = 0; }
1066 CD3DX12_CPU_DESCRIPTOR_HANDLE(_In_
const D3D12_CPU_DESCRIPTOR_HANDLE &other, INT offsetScaledByIncrementSize)
1068 InitOffsetted(other, offsetScaledByIncrementSize);
1070 CD3DX12_CPU_DESCRIPTOR_HANDLE(_In_
const D3D12_CPU_DESCRIPTOR_HANDLE &other, INT offsetInDescriptors, UINT descriptorIncrementSize)
1072 InitOffsetted(other, offsetInDescriptors, descriptorIncrementSize);
1074 CD3DX12_CPU_DESCRIPTOR_HANDLE& Offset(INT offsetInDescriptors, UINT descriptorIncrementSize)
1076 ptr += offsetInDescriptors * descriptorIncrementSize;
1079 CD3DX12_CPU_DESCRIPTOR_HANDLE& Offset(INT offsetScaledByIncrementSize)
1081 ptr += offsetScaledByIncrementSize;
1084 bool operator==(_In_
const D3D12_CPU_DESCRIPTOR_HANDLE& other)
1086 return (ptr == other.ptr);
1088 bool operator!=(_In_
const D3D12_CPU_DESCRIPTOR_HANDLE& other)
1090 return (ptr != other.ptr);
1092 CD3DX12_CPU_DESCRIPTOR_HANDLE &operator=(
const D3D12_CPU_DESCRIPTOR_HANDLE &other)
1098 inline void InitOffsetted(_In_
const D3D12_CPU_DESCRIPTOR_HANDLE &base, INT offsetScaledByIncrementSize)
1100 InitOffsetted(*
this, base, offsetScaledByIncrementSize);
1103 inline void InitOffsetted(_In_
const D3D12_CPU_DESCRIPTOR_HANDLE &base, INT offsetInDescriptors, UINT descriptorIncrementSize)
1105 InitOffsetted(*
this, base, offsetInDescriptors, descriptorIncrementSize);
1108 static inline void InitOffsetted(_Out_ D3D12_CPU_DESCRIPTOR_HANDLE &handle, _In_
const D3D12_CPU_DESCRIPTOR_HANDLE &base, INT offsetScaledByIncrementSize)
1110 handle.ptr = base.ptr + offsetScaledByIncrementSize;
1113 static inline void InitOffsetted(_Out_ D3D12_CPU_DESCRIPTOR_HANDLE &handle, _In_
const D3D12_CPU_DESCRIPTOR_HANDLE &base, INT offsetInDescriptors, UINT descriptorIncrementSize)
1115 handle.ptr = base.ptr + offsetInDescriptors * descriptorIncrementSize;
1120struct CD3DX12_GPU_DESCRIPTOR_HANDLE :
public D3D12_GPU_DESCRIPTOR_HANDLE
1122 CD3DX12_GPU_DESCRIPTOR_HANDLE() {}
1123 explicit CD3DX12_GPU_DESCRIPTOR_HANDLE(
const D3D12_GPU_DESCRIPTOR_HANDLE &o) :
1124 D3D12_GPU_DESCRIPTOR_HANDLE(o)
1126 CD3DX12_GPU_DESCRIPTOR_HANDLE(CD3DX12_DEFAULT) { ptr = 0; }
1127 CD3DX12_GPU_DESCRIPTOR_HANDLE(_In_
const D3D12_GPU_DESCRIPTOR_HANDLE &other, INT offsetScaledByIncrementSize)
1129 InitOffsetted(other, offsetScaledByIncrementSize);
1131 CD3DX12_GPU_DESCRIPTOR_HANDLE(_In_
const D3D12_GPU_DESCRIPTOR_HANDLE &other, INT offsetInDescriptors, UINT descriptorIncrementSize)
1133 InitOffsetted(other, offsetInDescriptors, descriptorIncrementSize);
1135 CD3DX12_GPU_DESCRIPTOR_HANDLE& Offset(INT offsetInDescriptors, UINT descriptorIncrementSize)
1137 ptr += offsetInDescriptors * descriptorIncrementSize;
1140 CD3DX12_GPU_DESCRIPTOR_HANDLE& Offset(INT offsetScaledByIncrementSize)
1142 ptr += offsetScaledByIncrementSize;
1145 inline bool operator==(_In_
const D3D12_GPU_DESCRIPTOR_HANDLE& other)
1147 return (ptr == other.ptr);
1149 inline bool operator!=(_In_
const D3D12_GPU_DESCRIPTOR_HANDLE& other)
1151 return (ptr != other.ptr);
1153 CD3DX12_GPU_DESCRIPTOR_HANDLE &operator=(
const D3D12_GPU_DESCRIPTOR_HANDLE &other)
1159 inline void InitOffsetted(_In_
const D3D12_GPU_DESCRIPTOR_HANDLE &base, INT offsetScaledByIncrementSize)
1161 InitOffsetted(*
this, base, offsetScaledByIncrementSize);
1164 inline void InitOffsetted(_In_
const D3D12_GPU_DESCRIPTOR_HANDLE &base, INT offsetInDescriptors, UINT descriptorIncrementSize)
1166 InitOffsetted(*
this, base, offsetInDescriptors, descriptorIncrementSize);
1169 static inline void InitOffsetted(_Out_ D3D12_GPU_DESCRIPTOR_HANDLE &handle, _In_
const D3D12_GPU_DESCRIPTOR_HANDLE &base, INT offsetScaledByIncrementSize)
1171 handle.ptr = base.ptr + offsetScaledByIncrementSize;
1174 static inline void InitOffsetted(_Out_ D3D12_GPU_DESCRIPTOR_HANDLE &handle, _In_
const D3D12_GPU_DESCRIPTOR_HANDLE &base, INT offsetInDescriptors, UINT descriptorIncrementSize)
1176 handle.ptr = base.ptr + offsetInDescriptors * descriptorIncrementSize;
1181inline UINT D3D12CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT PlaneSlice, UINT MipLevels, UINT ArraySize )
1183 return MipSlice + ArraySlice * MipLevels + PlaneSlice * MipLevels * ArraySize;
1187template <
typename T,
typename U,
typename V>
1188inline void D3D12DecomposeSubresource( UINT Subresource, UINT MipLevels, UINT ArraySize, _Out_ T& MipSlice, _Out_ U& ArraySlice, _Out_ V& PlaneSlice )
1190 MipSlice =
static_cast<T
>(Subresource % MipLevels);
1191 ArraySlice =
static_cast<U
>((Subresource / MipLevels) % ArraySize);
1192 PlaneSlice =
static_cast<V
>(Subresource / (MipLevels * ArraySize));
1196inline UINT8 D3D12GetFormatPlaneCount(
1197 _In_ ID3D12Device* pDevice,
1201 D3D12_FEATURE_DATA_FORMAT_INFO formatInfo = {Format};
1202 if (FAILED(pDevice->CheckFeatureSupport(D3D12_FEATURE_FORMAT_INFO, &formatInfo,
sizeof(formatInfo))))
1206 return formatInfo.PlaneCount;
1210struct CD3DX12_RESOURCE_DESC :
public D3D12_RESOURCE_DESC
1212 CD3DX12_RESOURCE_DESC()
1214 explicit CD3DX12_RESOURCE_DESC(
const D3D12_RESOURCE_DESC& o ) :
1215 D3D12_RESOURCE_DESC( o )
1217 CD3DX12_RESOURCE_DESC(
1218 D3D12_RESOURCE_DIMENSION dimension,
1222 UINT16 depthOrArraySize,
1227 D3D12_TEXTURE_LAYOUT layout,
1228 D3D12_RESOURCE_FLAGS flags )
1230 Dimension = dimension;
1231 Alignment = alignment;
1234 DepthOrArraySize = depthOrArraySize;
1235 MipLevels = mipLevels;
1237 SampleDesc.Count = sampleCount;
1238 SampleDesc.Quality = sampleQuality;
1242 static inline CD3DX12_RESOURCE_DESC Buffer(
1243 const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
1244 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE )
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 );
1249 static inline CD3DX12_RESOURCE_DESC Buffer(
1251 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
1252 UINT64 alignment = 0 )
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 );
1257 static inline CD3DX12_RESOURCE_DESC Tex1D(
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 )
1266 return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_TEXTURE1D, alignment, width, 1, arraySize,
1267 mipLevels, format, 1, 0, layout, flags );
1269 static inline CD3DX12_RESOURCE_DESC Tex2D(
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 )
1281 return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_TEXTURE2D, alignment, width, height, arraySize,
1282 mipLevels, format, sampleCount, sampleQuality, layout, flags );
1284 static inline CD3DX12_RESOURCE_DESC Tex3D(
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 )
1294 return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_TEXTURE3D, alignment, width, height, depth,
1295 mipLevels, format, 1, 0, layout, flags );
1297 inline UINT16
Depth()
const
1298 {
return (Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1); }
1299 inline UINT16 ArraySize()
const
1300 {
return (Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1); }
1301 inline UINT8 PlaneCount(_In_ ID3D12Device* pDevice)
const
1302 {
return D3D12GetFormatPlaneCount(pDevice, Format); }
1303 inline UINT Subresources(_In_ ID3D12Device* pDevice)
const
1304 {
return MipLevels * ArraySize() * PlaneCount(pDevice); }
1305 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; }
1309inline bool operator==(
const D3D12_RESOURCE_DESC& l,
const D3D12_RESOURCE_DESC& r )
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 &&
1323inline bool operator!=(
const D3D12_RESOURCE_DESC& l,
const D3D12_RESOURCE_DESC& r )
1324{
return !( l == r ); }
1328inline void MemcpySubresource(
1329 _In_
const D3D12_MEMCPY_DEST* pDest,
1330 _In_
const D3D12_SUBRESOURCE_DATA* pSrc,
1331 SIZE_T RowSizeInBytes,
1335 for (UINT z = 0; z < NumSlices; ++z)
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)
1341 memcpy(pDestSlice + pDest->RowPitch * y,
1342 pSrcSlice + pSrc->RowPitch * y,
1350inline UINT64 GetRequiredIntermediateSize(
1351 _In_ ID3D12Resource* pDestinationResource,
1352 _In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource,
1353 _In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources)
1355 D3D12_RESOURCE_DESC Desc = pDestinationResource->GetDesc();
1356 UINT64 RequiredSize = 0;
1358 ID3D12Device* pDevice;
1359 pDestinationResource->GetDevice(__uuidof(*pDevice),
reinterpret_cast<void**
>(&pDevice));
1360 pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, 0,
nullptr,
nullptr,
nullptr, &RequiredSize);
1363 return RequiredSize;
1368inline UINT64 UpdateSubresources(
1369 _In_ ID3D12GraphicsCommandList* pCmdList,
1370 _In_ ID3D12Resource* pDestinationResource,
1371 _In_ ID3D12Resource* pIntermediate,
1372 _In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource,
1373 _In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources,
1374 UINT64 RequiredSize,
1375 _In_reads_(NumSubresources)
const D3D12_PLACED_SUBRESOURCE_FOOTPRINT* pLayouts,
1376 _In_reads_(NumSubresources)
const UINT* pNumRows,
1377 _In_reads_(NumSubresources)
const UINT64* pRowSizesInBytes,
1378 _In_reads_(NumSubresources)
const D3D12_SUBRESOURCE_DATA* pSrcData)
1381 D3D12_RESOURCE_DESC IntermediateDesc = pIntermediate->GetDesc();
1382 D3D12_RESOURCE_DESC DestinationDesc = pDestinationResource->GetDesc();
1383 if (IntermediateDesc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER ||
1384 IntermediateDesc.Width < RequiredSize + pLayouts[0].Offset ||
1385 RequiredSize > (SIZE_T)-1 ||
1386 (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER &&
1387 (FirstSubresource != 0 || NumSubresources != 1)))
1393 HRESULT hr = pIntermediate->Map(0, NULL,
reinterpret_cast<void**
>(&pData));
1399 for (UINT i = 0; i < NumSubresources; ++i)
1401 if (pRowSizesInBytes[i] > (SIZE_T)-1)
return 0;
1402 D3D12_MEMCPY_DEST DestData = { pData + pLayouts[i].Offset, pLayouts[i].Footprint.RowPitch, pLayouts[i].Footprint.RowPitch * pNumRows[i] };
1403 MemcpySubresource(&DestData, &pSrcData[i], (SIZE_T)pRowSizesInBytes[i], pNumRows[i], pLayouts[i].Footprint.Depth);
1405 pIntermediate->Unmap(0, NULL);
1407 if (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER)
1409 CD3DX12_BOX SrcBox( UINT( pLayouts[0].Offset ), UINT( pLayouts[0].Offset + pLayouts[0].Footprint.Width ) );
1410 pCmdList->CopyBufferRegion(
1411 pDestinationResource, 0, pIntermediate, pLayouts[0].Offset, pLayouts[0].Footprint.Width);
1415 for (UINT i = 0; i < NumSubresources; ++i)
1417 CD3DX12_TEXTURE_COPY_LOCATION Dst(pDestinationResource, i + FirstSubresource);
1418 CD3DX12_TEXTURE_COPY_LOCATION Src(pIntermediate, pLayouts[i]);
1419 pCmdList->CopyTextureRegion(&Dst, 0, 0, 0, &Src,
nullptr);
1422 return RequiredSize;
1427inline UINT64 UpdateSubresources(
1428 _In_ ID3D12GraphicsCommandList* pCmdList,
1429 _In_ ID3D12Resource* pDestinationResource,
1430 _In_ ID3D12Resource* pIntermediate,
1431 UINT64 IntermediateOffset,
1432 _In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource,
1433 _In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources,
1434 _In_reads_(NumSubresources) D3D12_SUBRESOURCE_DATA* pSrcData)
1436 UINT64 RequiredSize = 0;
1437 UINT64 MemToAlloc =
static_cast<UINT64
>(
sizeof(D3D12_PLACED_SUBRESOURCE_FOOTPRINT) +
sizeof(UINT) +
sizeof(UINT64)) * NumSubresources;
1438 if (MemToAlloc > SIZE_MAX)
1442 void* pMem = HeapAlloc(GetProcessHeap(), 0,
static_cast<SIZE_T
>(MemToAlloc));
1447 D3D12_PLACED_SUBRESOURCE_FOOTPRINT* pLayouts =
reinterpret_cast<D3D12_PLACED_SUBRESOURCE_FOOTPRINT*
>(pMem);
1448 UINT64* pRowSizesInBytes =
reinterpret_cast<UINT64*
>(pLayouts + NumSubresources);
1449 UINT* pNumRows =
reinterpret_cast<UINT*
>(pRowSizesInBytes + NumSubresources);
1451 D3D12_RESOURCE_DESC Desc = pDestinationResource->GetDesc();
1452 ID3D12Device* pDevice;
1453 pDestinationResource->GetDevice(__uuidof(*pDevice),
reinterpret_cast<void**
>(&pDevice));
1454 pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, IntermediateOffset, pLayouts, pNumRows, pRowSizesInBytes, &RequiredSize);
1457 UINT64 Result = UpdateSubresources(pCmdList, pDestinationResource, pIntermediate, FirstSubresource, NumSubresources, RequiredSize, pLayouts, pNumRows, pRowSizesInBytes, pSrcData);
1458 HeapFree(GetProcessHeap(), 0, pMem);
1464template <UINT MaxSubresources>
1465inline UINT64 UpdateSubresources(
1466 _In_ ID3D12GraphicsCommandList* pCmdList,
1467 _In_ ID3D12Resource* pDestinationResource,
1468 _In_ ID3D12Resource* pIntermediate,
1469 UINT64 IntermediateOffset,
1470 _In_range_(0, MaxSubresources) UINT FirstSubresource,
1471 _In_range_(1, MaxSubresources - FirstSubresource) UINT NumSubresources,
1472 _In_reads_(NumSubresources) D3D12_SUBRESOURCE_DATA* pSrcData)
1474 UINT64 RequiredSize = 0;
1475 D3D12_PLACED_SUBRESOURCE_FOOTPRINT Layouts[MaxSubresources];
1476 UINT NumRows[MaxSubresources];
1477 UINT64 RowSizesInBytes[MaxSubresources];
1479 D3D12_RESOURCE_DESC Desc = pDestinationResource->GetDesc();
1480 ID3D12Device* pDevice;
1481 pDestinationResource->GetDevice(__uuidof(*pDevice),
reinterpret_cast<void**
>(&pDevice));
1482 pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, IntermediateOffset, Layouts, NumRows, RowSizesInBytes, &RequiredSize);
1485 return UpdateSubresources(pCmdList, pDestinationResource, pIntermediate, FirstSubresource, NumSubresources, RequiredSize, Layouts, NumRows, RowSizesInBytes, pSrcData);
1489inline bool D3D12IsLayoutOpaque( D3D12_TEXTURE_LAYOUT Layout )
1490{
return Layout == D3D12_TEXTURE_LAYOUT_UNKNOWN || Layout == D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE; }
1493inline ID3D12CommandList *
const * CommandListCast(ID3D12GraphicsCommandList *
const * pp)
1499 return reinterpret_cast<ID3D12CommandList *
const *
>(pp);
@ Depth
Render world-space distance from eye, scaled by 1/100 (so a value of 1 equals a distance of 100 units...
DepthFunc
Defines common depth functions.
CullMode
Defines primitive culling modes.
@ Back
Back face of primitives discarded before rasterization.
@ Front
Front face of primitives discarded before rasterization.