1 //*********************************************************
3 // Copyright (c) Microsoft. All rights reserved.
4 // This code is licensed under the MIT License (MIT).
5 // THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
6 // ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
7 // IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
8 // PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
10 //*********************************************************
15 #include "vkd3d_d3d12.h"
17 #if defined( __cplusplus )
19 struct CD3DX12_DEFAULT
{};
20 extern const DECLSPEC_SELECTANY CD3DX12_DEFAULT D3D12_DEFAULT
;
22 //------------------------------------------------------------------------------------------------
23 inline bool operator==( const D3D12_VIEWPORT
& l
, const D3D12_VIEWPORT
& r
)
25 return l
.TopLeftX
== r
.TopLeftX
&& l
.TopLeftY
== r
.TopLeftY
&& l
.Width
== r
.Width
&&
26 l
.Height
== r
.Height
&& l
.MinDepth
== r
.MinDepth
&& l
.MaxDepth
== r
.MaxDepth
;
29 //------------------------------------------------------------------------------------------------
30 inline bool operator!=( const D3D12_VIEWPORT
& l
, const D3D12_VIEWPORT
& r
)
31 { return !( l
== r
); }
33 //------------------------------------------------------------------------------------------------
34 struct CD3DX12_RECT
: public D3D12_RECT
38 explicit CD3DX12_RECT( const D3D12_RECT
& o
) :
41 explicit CD3DX12_RECT(
53 operator const D3D12_RECT
&() const { return *this; }
56 //------------------------------------------------------------------------------------------------
57 struct CD3DX12_BOX
: public D3D12_BOX
61 explicit CD3DX12_BOX( const D3D12_BOX
& o
) :
104 operator const D3D12_BOX
&() const { return *this; }
106 inline bool operator==( const D3D12_BOX
& l
, const D3D12_BOX
& r
)
108 return l
.left
== r
.left
&& l
.top
== r
.top
&& l
.front
== r
.front
&&
109 l
.right
== r
.right
&& l
.bottom
== r
.bottom
&& l
.back
== r
.back
;
111 inline bool operator!=( const D3D12_BOX
& l
, const D3D12_BOX
& r
)
112 { return !( l
== r
); }
114 //------------------------------------------------------------------------------------------------
115 struct CD3DX12_DEPTH_STENCIL_DESC
: public D3D12_DEPTH_STENCIL_DESC
117 CD3DX12_DEPTH_STENCIL_DESC()
119 explicit CD3DX12_DEPTH_STENCIL_DESC( const D3D12_DEPTH_STENCIL_DESC
& o
) :
120 D3D12_DEPTH_STENCIL_DESC( o
)
122 explicit CD3DX12_DEPTH_STENCIL_DESC( CD3DX12_DEFAULT
)
125 DepthWriteMask
= D3D12_DEPTH_WRITE_MASK_ALL
;
126 DepthFunc
= D3D12_COMPARISON_FUNC_LESS
;
127 StencilEnable
= FALSE
;
128 StencilReadMask
= D3D12_DEFAULT_STENCIL_READ_MASK
;
129 StencilWriteMask
= D3D12_DEFAULT_STENCIL_WRITE_MASK
;
130 const D3D12_DEPTH_STENCILOP_DESC defaultStencilOp
=
131 { D3D12_STENCIL_OP_KEEP
, D3D12_STENCIL_OP_KEEP
, D3D12_STENCIL_OP_KEEP
, D3D12_COMPARISON_FUNC_ALWAYS
};
132 FrontFace
= defaultStencilOp
;
133 BackFace
= defaultStencilOp
;
135 explicit CD3DX12_DEPTH_STENCIL_DESC(
137 D3D12_DEPTH_WRITE_MASK depthWriteMask
,
138 D3D12_COMPARISON_FUNC depthFunc
,
140 UINT8 stencilReadMask
,
141 UINT8 stencilWriteMask
,
142 D3D12_STENCIL_OP frontStencilFailOp
,
143 D3D12_STENCIL_OP frontStencilDepthFailOp
,
144 D3D12_STENCIL_OP frontStencilPassOp
,
145 D3D12_COMPARISON_FUNC frontStencilFunc
,
146 D3D12_STENCIL_OP backStencilFailOp
,
147 D3D12_STENCIL_OP backStencilDepthFailOp
,
148 D3D12_STENCIL_OP backStencilPassOp
,
149 D3D12_COMPARISON_FUNC backStencilFunc
)
151 DepthEnable
= depthEnable
;
152 DepthWriteMask
= depthWriteMask
;
153 DepthFunc
= depthFunc
;
154 StencilEnable
= stencilEnable
;
155 StencilReadMask
= stencilReadMask
;
156 StencilWriteMask
= stencilWriteMask
;
157 FrontFace
.StencilFailOp
= frontStencilFailOp
;
158 FrontFace
.StencilDepthFailOp
= frontStencilDepthFailOp
;
159 FrontFace
.StencilPassOp
= frontStencilPassOp
;
160 FrontFace
.StencilFunc
= frontStencilFunc
;
161 BackFace
.StencilFailOp
= backStencilFailOp
;
162 BackFace
.StencilDepthFailOp
= backStencilDepthFailOp
;
163 BackFace
.StencilPassOp
= backStencilPassOp
;
164 BackFace
.StencilFunc
= backStencilFunc
;
166 ~CD3DX12_DEPTH_STENCIL_DESC() {}
167 operator const D3D12_DEPTH_STENCIL_DESC
&() const { return *this; }
170 //------------------------------------------------------------------------------------------------
171 struct CD3DX12_BLEND_DESC
: public D3D12_BLEND_DESC
175 explicit CD3DX12_BLEND_DESC( const D3D12_BLEND_DESC
& o
) :
176 D3D12_BLEND_DESC( o
)
178 explicit CD3DX12_BLEND_DESC( CD3DX12_DEFAULT
)
180 AlphaToCoverageEnable
= FALSE
;
181 IndependentBlendEnable
= FALSE
;
182 const D3D12_RENDER_TARGET_BLEND_DESC defaultRenderTargetBlendDesc
=
185 D3D12_BLEND_ONE
, D3D12_BLEND_ZERO
, D3D12_BLEND_OP_ADD
,
186 D3D12_BLEND_ONE
, D3D12_BLEND_ZERO
, D3D12_BLEND_OP_ADD
,
188 D3D12_COLOR_WRITE_ENABLE_ALL
,
190 for (UINT i
= 0; i
< D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT
; ++i
)
191 RenderTarget
[ i
] = defaultRenderTargetBlendDesc
;
193 ~CD3DX12_BLEND_DESC() {}
194 operator const D3D12_BLEND_DESC
&() const { return *this; }
197 //------------------------------------------------------------------------------------------------
198 struct CD3DX12_RASTERIZER_DESC
: public D3D12_RASTERIZER_DESC
200 CD3DX12_RASTERIZER_DESC()
202 explicit CD3DX12_RASTERIZER_DESC( const D3D12_RASTERIZER_DESC
& o
) :
203 D3D12_RASTERIZER_DESC( o
)
205 explicit CD3DX12_RASTERIZER_DESC( CD3DX12_DEFAULT
)
207 FillMode
= D3D12_FILL_MODE_SOLID
;
208 CullMode
= D3D12_CULL_MODE_BACK
;
209 FrontCounterClockwise
= FALSE
;
210 DepthBias
= D3D12_DEFAULT_DEPTH_BIAS
;
211 DepthBiasClamp
= D3D12_DEFAULT_DEPTH_BIAS_CLAMP
;
212 SlopeScaledDepthBias
= D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS
;
213 DepthClipEnable
= TRUE
;
214 MultisampleEnable
= FALSE
;
215 AntialiasedLineEnable
= FALSE
;
216 ForcedSampleCount
= 0;
217 ConservativeRaster
= D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF
;
219 explicit CD3DX12_RASTERIZER_DESC(
220 D3D12_FILL_MODE fillMode
,
221 D3D12_CULL_MODE cullMode
,
222 BOOL frontCounterClockwise
,
224 FLOAT depthBiasClamp
,
225 FLOAT slopeScaledDepthBias
,
226 BOOL depthClipEnable
,
227 BOOL multisampleEnable
,
228 BOOL antialiasedLineEnable
,
229 UINT forcedSampleCount
,
230 D3D12_CONSERVATIVE_RASTERIZATION_MODE conservativeRaster
)
234 FrontCounterClockwise
= frontCounterClockwise
;
235 DepthBias
= depthBias
;
236 DepthBiasClamp
= depthBiasClamp
;
237 SlopeScaledDepthBias
= slopeScaledDepthBias
;
238 DepthClipEnable
= depthClipEnable
;
239 MultisampleEnable
= multisampleEnable
;
240 AntialiasedLineEnable
= antialiasedLineEnable
;
241 ForcedSampleCount
= forcedSampleCount
;
242 ConservativeRaster
= conservativeRaster
;
244 ~CD3DX12_RASTERIZER_DESC() {}
245 operator const D3D12_RASTERIZER_DESC
&() const { return *this; }
248 //------------------------------------------------------------------------------------------------
249 struct CD3DX12_RESOURCE_ALLOCATION_INFO
: public D3D12_RESOURCE_ALLOCATION_INFO
251 CD3DX12_RESOURCE_ALLOCATION_INFO()
253 explicit CD3DX12_RESOURCE_ALLOCATION_INFO( const D3D12_RESOURCE_ALLOCATION_INFO
& o
) :
254 D3D12_RESOURCE_ALLOCATION_INFO( o
)
256 CD3DX12_RESOURCE_ALLOCATION_INFO(
261 Alignment
= alignment
;
263 operator const D3D12_RESOURCE_ALLOCATION_INFO
&() const { return *this; }
266 //------------------------------------------------------------------------------------------------
267 struct CD3DX12_HEAP_PROPERTIES
: public D3D12_HEAP_PROPERTIES
269 CD3DX12_HEAP_PROPERTIES()
271 explicit CD3DX12_HEAP_PROPERTIES(const D3D12_HEAP_PROPERTIES
&o
) :
272 D3D12_HEAP_PROPERTIES(o
)
274 CD3DX12_HEAP_PROPERTIES(
275 D3D12_CPU_PAGE_PROPERTY cpuPageProperty
,
276 D3D12_MEMORY_POOL memoryPoolPreference
,
277 UINT creationNodeMask
= 1,
280 Type
= D3D12_HEAP_TYPE_CUSTOM
;
281 CPUPageProperty
= cpuPageProperty
;
282 MemoryPoolPreference
= memoryPoolPreference
;
283 CreationNodeMask
= creationNodeMask
;
284 VisibleNodeMask
= nodeMask
;
286 explicit CD3DX12_HEAP_PROPERTIES(
287 D3D12_HEAP_TYPE type
,
288 UINT creationNodeMask
= 1,
292 CPUPageProperty
= D3D12_CPU_PAGE_PROPERTY_UNKNOWN
;
293 MemoryPoolPreference
= D3D12_MEMORY_POOL_UNKNOWN
;
294 CreationNodeMask
= creationNodeMask
;
295 VisibleNodeMask
= nodeMask
;
297 operator const D3D12_HEAP_PROPERTIES
&() const { return *this; }
298 bool IsCPUAccessible() const
300 return Type
== D3D12_HEAP_TYPE_UPLOAD
|| Type
== D3D12_HEAP_TYPE_READBACK
|| (Type
== D3D12_HEAP_TYPE_CUSTOM
&&
301 (CPUPageProperty
== D3D12_CPU_PAGE_PROPERTY_WRITE_COMBINE
|| CPUPageProperty
== D3D12_CPU_PAGE_PROPERTY_WRITE_BACK
));
304 inline bool operator==( const D3D12_HEAP_PROPERTIES
& l
, const D3D12_HEAP_PROPERTIES
& r
)
306 return l
.Type
== r
.Type
&& l
.CPUPageProperty
== r
.CPUPageProperty
&&
307 l
.MemoryPoolPreference
== r
.MemoryPoolPreference
&&
308 l
.CreationNodeMask
== r
.CreationNodeMask
&&
309 l
.VisibleNodeMask
== r
.VisibleNodeMask
;
311 inline bool operator!=( const D3D12_HEAP_PROPERTIES
& l
, const D3D12_HEAP_PROPERTIES
& r
)
312 { return !( l
== r
); }
314 //------------------------------------------------------------------------------------------------
315 struct CD3DX12_HEAP_DESC
: public D3D12_HEAP_DESC
319 explicit CD3DX12_HEAP_DESC(const D3D12_HEAP_DESC
&o
) :
324 D3D12_HEAP_PROPERTIES properties
,
325 UINT64 alignment
= 0,
326 D3D12_HEAP_FLAGS flags
= D3D12_HEAP_FLAG_NONE
)
329 Properties
= properties
;
330 Alignment
= alignment
;
335 D3D12_HEAP_TYPE type
,
336 UINT64 alignment
= 0,
337 D3D12_HEAP_FLAGS flags
= D3D12_HEAP_FLAG_NONE
)
340 Properties
= CD3DX12_HEAP_PROPERTIES( type
);
341 Alignment
= alignment
;
346 D3D12_CPU_PAGE_PROPERTY cpuPageProperty
,
347 D3D12_MEMORY_POOL memoryPoolPreference
,
348 UINT64 alignment
= 0,
349 D3D12_HEAP_FLAGS flags
= D3D12_HEAP_FLAG_NONE
)
352 Properties
= CD3DX12_HEAP_PROPERTIES( cpuPageProperty
, memoryPoolPreference
);
353 Alignment
= alignment
;
357 const D3D12_RESOURCE_ALLOCATION_INFO
& resAllocInfo
,
358 D3D12_HEAP_PROPERTIES properties
,
359 D3D12_HEAP_FLAGS flags
= D3D12_HEAP_FLAG_NONE
)
361 SizeInBytes
= resAllocInfo
.SizeInBytes
;
362 Properties
= properties
;
363 Alignment
= resAllocInfo
.Alignment
;
367 const D3D12_RESOURCE_ALLOCATION_INFO
& resAllocInfo
,
368 D3D12_HEAP_TYPE type
,
369 D3D12_HEAP_FLAGS flags
= D3D12_HEAP_FLAG_NONE
)
371 SizeInBytes
= resAllocInfo
.SizeInBytes
;
372 Properties
= CD3DX12_HEAP_PROPERTIES( type
);
373 Alignment
= resAllocInfo
.Alignment
;
377 const D3D12_RESOURCE_ALLOCATION_INFO
& resAllocInfo
,
378 D3D12_CPU_PAGE_PROPERTY cpuPageProperty
,
379 D3D12_MEMORY_POOL memoryPoolPreference
,
380 D3D12_HEAP_FLAGS flags
= D3D12_HEAP_FLAG_NONE
)
382 SizeInBytes
= resAllocInfo
.SizeInBytes
;
383 Properties
= CD3DX12_HEAP_PROPERTIES( cpuPageProperty
, memoryPoolPreference
);
384 Alignment
= resAllocInfo
.Alignment
;
387 operator const D3D12_HEAP_DESC
&() const { return *this; }
388 bool IsCPUAccessible() const
389 { return static_cast< const CD3DX12_HEAP_PROPERTIES
* >( &Properties
)->IsCPUAccessible(); }
391 inline bool operator==( const D3D12_HEAP_DESC
& l
, const D3D12_HEAP_DESC
& r
)
393 return l
.SizeInBytes
== r
.SizeInBytes
&&
394 l
.Properties
== r
.Properties
&&
395 l
.Alignment
== r
.Alignment
&&
398 inline bool operator!=( const D3D12_HEAP_DESC
& l
, const D3D12_HEAP_DESC
& r
)
399 { return !( l
== r
); }
401 //------------------------------------------------------------------------------------------------
402 struct CD3DX12_CLEAR_VALUE
: public D3D12_CLEAR_VALUE
404 CD3DX12_CLEAR_VALUE()
406 explicit CD3DX12_CLEAR_VALUE(const D3D12_CLEAR_VALUE
&o
) :
411 const FLOAT color
[4] )
414 memcpy( Color
, color
, sizeof( Color
) );
422 /* Use memcpy to preserve NAN values */
423 memcpy( &DepthStencil
.Depth
, &depth
, sizeof( depth
) );
424 DepthStencil
.Stencil
= stencil
;
426 operator const D3D12_CLEAR_VALUE
&() const { return *this; }
429 //------------------------------------------------------------------------------------------------
430 struct CD3DX12_RANGE
: public D3D12_RANGE
434 explicit CD3DX12_RANGE(const D3D12_RANGE
&o
) :
444 operator const D3D12_RANGE
&() const { return *this; }
447 //------------------------------------------------------------------------------------------------
448 struct CD3DX12_SHADER_BYTECODE
: public D3D12_SHADER_BYTECODE
450 CD3DX12_SHADER_BYTECODE()
452 explicit CD3DX12_SHADER_BYTECODE(const D3D12_SHADER_BYTECODE
&o
) :
453 D3D12_SHADER_BYTECODE(o
)
455 CD3DX12_SHADER_BYTECODE(
456 ID3DBlob
* pShaderBlob
)
458 pShaderBytecode
= pShaderBlob
->GetBufferPointer();
459 BytecodeLength
= pShaderBlob
->GetBufferSize();
461 CD3DX12_SHADER_BYTECODE(
462 void* _pShaderBytecode
,
463 SIZE_T bytecodeLength
)
465 pShaderBytecode
= _pShaderBytecode
;
466 BytecodeLength
= bytecodeLength
;
468 operator const D3D12_SHADER_BYTECODE
&() const { return *this; }
471 //------------------------------------------------------------------------------------------------
472 struct CD3DX12_TILED_RESOURCE_COORDINATE
: public D3D12_TILED_RESOURCE_COORDINATE
474 CD3DX12_TILED_RESOURCE_COORDINATE()
476 explicit CD3DX12_TILED_RESOURCE_COORDINATE(const D3D12_TILED_RESOURCE_COORDINATE
&o
) :
477 D3D12_TILED_RESOURCE_COORDINATE(o
)
479 CD3DX12_TILED_RESOURCE_COORDINATE(
488 Subresource
= subresource
;
490 operator const D3D12_TILED_RESOURCE_COORDINATE
&() const { return *this; }
493 //------------------------------------------------------------------------------------------------
494 struct CD3DX12_TILE_REGION_SIZE
: public D3D12_TILE_REGION_SIZE
496 CD3DX12_TILE_REGION_SIZE()
498 explicit CD3DX12_TILE_REGION_SIZE(const D3D12_TILE_REGION_SIZE
&o
) :
499 D3D12_TILE_REGION_SIZE(o
)
501 CD3DX12_TILE_REGION_SIZE(
514 operator const D3D12_TILE_REGION_SIZE
&() const { return *this; }
517 //------------------------------------------------------------------------------------------------
518 struct CD3DX12_SUBRESOURCE_TILING
: public D3D12_SUBRESOURCE_TILING
520 CD3DX12_SUBRESOURCE_TILING()
522 explicit CD3DX12_SUBRESOURCE_TILING(const D3D12_SUBRESOURCE_TILING
&o
) :
523 D3D12_SUBRESOURCE_TILING(o
)
525 CD3DX12_SUBRESOURCE_TILING(
527 UINT16 heightInTiles
,
529 UINT startTileIndexInOverallResource
)
531 WidthInTiles
= widthInTiles
;
532 HeightInTiles
= heightInTiles
;
533 DepthInTiles
= depthInTiles
;
534 StartTileIndexInOverallResource
= startTileIndexInOverallResource
;
536 operator const D3D12_SUBRESOURCE_TILING
&() const { return *this; }
539 //------------------------------------------------------------------------------------------------
540 struct CD3DX12_TILE_SHAPE
: public D3D12_TILE_SHAPE
544 explicit CD3DX12_TILE_SHAPE(const D3D12_TILE_SHAPE
&o
) :
552 WidthInTexels
= widthInTexels
;
553 HeightInTexels
= heightInTexels
;
554 DepthInTexels
= depthInTexels
;
556 operator const D3D12_TILE_SHAPE
&() const { return *this; }
559 //------------------------------------------------------------------------------------------------
560 struct CD3DX12_RESOURCE_BARRIER
: public D3D12_RESOURCE_BARRIER
562 CD3DX12_RESOURCE_BARRIER()
564 explicit CD3DX12_RESOURCE_BARRIER(const D3D12_RESOURCE_BARRIER
&o
) :
565 D3D12_RESOURCE_BARRIER(o
)
567 static inline CD3DX12_RESOURCE_BARRIER
Transition(
568 _In_ ID3D12Resource
* pResource
,
569 D3D12_RESOURCE_STATES stateBefore
,
570 D3D12_RESOURCE_STATES stateAfter
,
571 UINT subresource
= D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES
,
572 D3D12_RESOURCE_BARRIER_FLAGS flags
= D3D12_RESOURCE_BARRIER_FLAG_NONE
)
574 CD3DX12_RESOURCE_BARRIER result
;
575 ZeroMemory(&result
, sizeof(result
));
576 D3D12_RESOURCE_BARRIER
&barrier
= result
;
577 result
.Type
= D3D12_RESOURCE_BARRIER_TYPE_TRANSITION
;
578 result
.Flags
= flags
;
579 barrier
.Transition
.pResource
= pResource
;
580 barrier
.Transition
.StateBefore
= stateBefore
;
581 barrier
.Transition
.StateAfter
= stateAfter
;
582 barrier
.Transition
.Subresource
= subresource
;
585 static inline CD3DX12_RESOURCE_BARRIER
Aliasing(
586 _In_ ID3D12Resource
* pResourceBefore
,
587 _In_ ID3D12Resource
* pResourceAfter
)
589 CD3DX12_RESOURCE_BARRIER result
;
590 ZeroMemory(&result
, sizeof(result
));
591 D3D12_RESOURCE_BARRIER
&barrier
= result
;
592 result
.Type
= D3D12_RESOURCE_BARRIER_TYPE_ALIASING
;
593 barrier
.Aliasing
.pResourceBefore
= pResourceBefore
;
594 barrier
.Aliasing
.pResourceAfter
= pResourceAfter
;
597 static inline CD3DX12_RESOURCE_BARRIER
UAV(
598 _In_ ID3D12Resource
* pResource
)
600 CD3DX12_RESOURCE_BARRIER result
;
601 ZeroMemory(&result
, sizeof(result
));
602 D3D12_RESOURCE_BARRIER
&barrier
= result
;
603 result
.Type
= D3D12_RESOURCE_BARRIER_TYPE_UAV
;
604 barrier
.UAV
.pResource
= pResource
;
607 operator const D3D12_RESOURCE_BARRIER
&() const { return *this; }
610 //------------------------------------------------------------------------------------------------
611 struct CD3DX12_PACKED_MIP_INFO
: public D3D12_PACKED_MIP_INFO
613 CD3DX12_PACKED_MIP_INFO()
615 explicit CD3DX12_PACKED_MIP_INFO(const D3D12_PACKED_MIP_INFO
&o
) :
616 D3D12_PACKED_MIP_INFO(o
)
618 CD3DX12_PACKED_MIP_INFO(
619 UINT8 numStandardMips
,
621 UINT numTilesForPackedMips
,
622 UINT startTileIndexInOverallResource
)
624 NumStandardMips
= numStandardMips
;
625 NumPackedMips
= numPackedMips
;
626 NumTilesForPackedMips
= numTilesForPackedMips
;
627 StartTileIndexInOverallResource
= startTileIndexInOverallResource
;
629 operator const D3D12_PACKED_MIP_INFO
&() const { return *this; }
632 //------------------------------------------------------------------------------------------------
633 struct CD3DX12_SUBRESOURCE_FOOTPRINT
: public D3D12_SUBRESOURCE_FOOTPRINT
635 CD3DX12_SUBRESOURCE_FOOTPRINT()
637 explicit CD3DX12_SUBRESOURCE_FOOTPRINT(const D3D12_SUBRESOURCE_FOOTPRINT
&o
) :
638 D3D12_SUBRESOURCE_FOOTPRINT(o
)
640 CD3DX12_SUBRESOURCE_FOOTPRINT(
653 explicit CD3DX12_SUBRESOURCE_FOOTPRINT(
654 const D3D12_RESOURCE_DESC
& resDesc
,
657 Format
= resDesc
.Format
;
658 Width
= UINT( resDesc
.Width
);
659 Height
= resDesc
.Height
;
660 Depth
= (resDesc
.Dimension
== D3D12_RESOURCE_DIMENSION_TEXTURE3D
? resDesc
.DepthOrArraySize
: 1);
663 operator const D3D12_SUBRESOURCE_FOOTPRINT
&() const { return *this; }
666 //------------------------------------------------------------------------------------------------
667 struct CD3DX12_TEXTURE_COPY_LOCATION
: public D3D12_TEXTURE_COPY_LOCATION
669 CD3DX12_TEXTURE_COPY_LOCATION()
671 explicit CD3DX12_TEXTURE_COPY_LOCATION(const D3D12_TEXTURE_COPY_LOCATION
&o
) :
672 D3D12_TEXTURE_COPY_LOCATION(o
)
674 CD3DX12_TEXTURE_COPY_LOCATION(ID3D12Resource
* pRes
) { pResource
= pRes
; }
675 CD3DX12_TEXTURE_COPY_LOCATION(ID3D12Resource
* pRes
, D3D12_PLACED_SUBRESOURCE_FOOTPRINT
const& Footprint
)
678 Type
= D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT
;
679 PlacedFootprint
= Footprint
;
681 CD3DX12_TEXTURE_COPY_LOCATION(ID3D12Resource
* pRes
, UINT Sub
)
684 Type
= D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX
;
685 SubresourceIndex
= Sub
;
689 //------------------------------------------------------------------------------------------------
690 struct CD3DX12_DESCRIPTOR_RANGE
: public D3D12_DESCRIPTOR_RANGE
692 CD3DX12_DESCRIPTOR_RANGE() { }
693 explicit CD3DX12_DESCRIPTOR_RANGE(const D3D12_DESCRIPTOR_RANGE
&o
) :
694 D3D12_DESCRIPTOR_RANGE(o
)
696 CD3DX12_DESCRIPTOR_RANGE(
697 D3D12_DESCRIPTOR_RANGE_TYPE rangeType
,
699 UINT baseShaderRegister
,
700 UINT registerSpace
= 0,
701 UINT offsetInDescriptorsFromTableStart
=
702 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND
)
704 Init(rangeType
, numDescriptors
, baseShaderRegister
, registerSpace
, offsetInDescriptorsFromTableStart
);
708 D3D12_DESCRIPTOR_RANGE_TYPE rangeType
,
710 UINT baseShaderRegister
,
711 UINT registerSpace
= 0,
712 UINT offsetInDescriptorsFromTableStart
=
713 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND
)
715 Init(*this, rangeType
, numDescriptors
, baseShaderRegister
, registerSpace
, offsetInDescriptorsFromTableStart
);
718 static inline void Init(
719 _Out_ D3D12_DESCRIPTOR_RANGE
&range
,
720 D3D12_DESCRIPTOR_RANGE_TYPE rangeType
,
722 UINT baseShaderRegister
,
723 UINT registerSpace
= 0,
724 UINT offsetInDescriptorsFromTableStart
=
725 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND
)
727 range
.RangeType
= rangeType
;
728 range
.NumDescriptors
= numDescriptors
;
729 range
.BaseShaderRegister
= baseShaderRegister
;
730 range
.RegisterSpace
= registerSpace
;
731 range
.OffsetInDescriptorsFromTableStart
= offsetInDescriptorsFromTableStart
;
735 //------------------------------------------------------------------------------------------------
736 struct CD3DX12_ROOT_DESCRIPTOR_TABLE
: public D3D12_ROOT_DESCRIPTOR_TABLE
738 CD3DX12_ROOT_DESCRIPTOR_TABLE() {}
739 explicit CD3DX12_ROOT_DESCRIPTOR_TABLE(const D3D12_ROOT_DESCRIPTOR_TABLE
&o
) :
740 D3D12_ROOT_DESCRIPTOR_TABLE(o
)
742 CD3DX12_ROOT_DESCRIPTOR_TABLE(
743 UINT numDescriptorRanges
,
744 _In_reads_opt_(numDescriptorRanges
) const D3D12_DESCRIPTOR_RANGE
* _pDescriptorRanges
)
746 Init(numDescriptorRanges
, _pDescriptorRanges
);
750 UINT numDescriptorRanges
,
751 _In_reads_opt_(numDescriptorRanges
) const D3D12_DESCRIPTOR_RANGE
* _pDescriptorRanges
)
753 Init(*this, numDescriptorRanges
, _pDescriptorRanges
);
756 static inline void Init(
757 _Out_ D3D12_ROOT_DESCRIPTOR_TABLE
&rootDescriptorTable
,
758 UINT numDescriptorRanges
,
759 _In_reads_opt_(numDescriptorRanges
) const D3D12_DESCRIPTOR_RANGE
* _pDescriptorRanges
)
761 rootDescriptorTable
.NumDescriptorRanges
= numDescriptorRanges
;
762 rootDescriptorTable
.pDescriptorRanges
= _pDescriptorRanges
;
766 //------------------------------------------------------------------------------------------------
767 struct CD3DX12_ROOT_CONSTANTS
: public D3D12_ROOT_CONSTANTS
769 CD3DX12_ROOT_CONSTANTS() {}
770 explicit CD3DX12_ROOT_CONSTANTS(const D3D12_ROOT_CONSTANTS
&o
) :
771 D3D12_ROOT_CONSTANTS(o
)
773 CD3DX12_ROOT_CONSTANTS(
776 UINT registerSpace
= 0)
778 Init(num32BitValues
, shaderRegister
, registerSpace
);
784 UINT registerSpace
= 0)
786 Init(*this, num32BitValues
, shaderRegister
, registerSpace
);
789 static inline void Init(
790 _Out_ D3D12_ROOT_CONSTANTS
&rootConstants
,
793 UINT registerSpace
= 0)
795 rootConstants
.Num32BitValues
= num32BitValues
;
796 rootConstants
.ShaderRegister
= shaderRegister
;
797 rootConstants
.RegisterSpace
= registerSpace
;
801 //------------------------------------------------------------------------------------------------
802 struct CD3DX12_ROOT_DESCRIPTOR
: public D3D12_ROOT_DESCRIPTOR
804 CD3DX12_ROOT_DESCRIPTOR() {}
805 explicit CD3DX12_ROOT_DESCRIPTOR(const D3D12_ROOT_DESCRIPTOR
&o
) :
806 D3D12_ROOT_DESCRIPTOR(o
)
808 CD3DX12_ROOT_DESCRIPTOR(
810 UINT registerSpace
= 0)
812 Init(shaderRegister
, registerSpace
);
817 UINT registerSpace
= 0)
819 Init(*this, shaderRegister
, registerSpace
);
822 static inline void Init(_Out_ D3D12_ROOT_DESCRIPTOR
&table
, UINT shaderRegister
, UINT registerSpace
= 0)
824 table
.ShaderRegister
= shaderRegister
;
825 table
.RegisterSpace
= registerSpace
;
829 //------------------------------------------------------------------------------------------------
830 struct CD3DX12_ROOT_PARAMETER
: public D3D12_ROOT_PARAMETER
832 CD3DX12_ROOT_PARAMETER() {}
833 explicit CD3DX12_ROOT_PARAMETER(const D3D12_ROOT_PARAMETER
&o
) :
834 D3D12_ROOT_PARAMETER(o
)
837 static inline void InitAsDescriptorTable(
838 _Out_ D3D12_ROOT_PARAMETER
&rootParam
,
839 UINT numDescriptorRanges
,
840 _In_reads_(numDescriptorRanges
) const D3D12_DESCRIPTOR_RANGE
* pDescriptorRanges
,
841 D3D12_SHADER_VISIBILITY visibility
= D3D12_SHADER_VISIBILITY_ALL
)
843 rootParam
.ParameterType
= D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE
;
844 rootParam
.ShaderVisibility
= visibility
;
845 CD3DX12_ROOT_DESCRIPTOR_TABLE::Init(rootParam
.DescriptorTable
, numDescriptorRanges
, pDescriptorRanges
);
848 static inline void InitAsConstants(
849 _Out_ D3D12_ROOT_PARAMETER
&rootParam
,
852 UINT registerSpace
= 0,
853 D3D12_SHADER_VISIBILITY visibility
= D3D12_SHADER_VISIBILITY_ALL
)
855 rootParam
.ParameterType
= D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS
;
856 rootParam
.ShaderVisibility
= visibility
;
857 CD3DX12_ROOT_CONSTANTS::Init(rootParam
.Constants
, num32BitValues
, shaderRegister
, registerSpace
);
860 static inline void InitAsConstantBufferView(
861 _Out_ D3D12_ROOT_PARAMETER
&rootParam
,
863 UINT registerSpace
= 0,
864 D3D12_SHADER_VISIBILITY visibility
= D3D12_SHADER_VISIBILITY_ALL
)
866 rootParam
.ParameterType
= D3D12_ROOT_PARAMETER_TYPE_CBV
;
867 rootParam
.ShaderVisibility
= visibility
;
868 CD3DX12_ROOT_DESCRIPTOR::Init(rootParam
.Descriptor
, shaderRegister
, registerSpace
);
871 static inline void InitAsShaderResourceView(
872 _Out_ D3D12_ROOT_PARAMETER
&rootParam
,
874 UINT registerSpace
= 0,
875 D3D12_SHADER_VISIBILITY visibility
= D3D12_SHADER_VISIBILITY_ALL
)
877 rootParam
.ParameterType
= D3D12_ROOT_PARAMETER_TYPE_SRV
;
878 rootParam
.ShaderVisibility
= visibility
;
879 CD3DX12_ROOT_DESCRIPTOR::Init(rootParam
.Descriptor
, shaderRegister
, registerSpace
);
882 static inline void InitAsUnorderedAccessView(
883 _Out_ D3D12_ROOT_PARAMETER
&rootParam
,
885 UINT registerSpace
= 0,
886 D3D12_SHADER_VISIBILITY visibility
= D3D12_SHADER_VISIBILITY_ALL
)
888 rootParam
.ParameterType
= D3D12_ROOT_PARAMETER_TYPE_UAV
;
889 rootParam
.ShaderVisibility
= visibility
;
890 CD3DX12_ROOT_DESCRIPTOR::Init(rootParam
.Descriptor
, shaderRegister
, registerSpace
);
893 inline void InitAsDescriptorTable(
894 UINT numDescriptorRanges
,
895 _In_reads_(numDescriptorRanges
) const D3D12_DESCRIPTOR_RANGE
* pDescriptorRanges
,
896 D3D12_SHADER_VISIBILITY visibility
= D3D12_SHADER_VISIBILITY_ALL
)
898 InitAsDescriptorTable(*this, numDescriptorRanges
, pDescriptorRanges
, visibility
);
901 inline void InitAsConstants(
904 UINT registerSpace
= 0,
905 D3D12_SHADER_VISIBILITY visibility
= D3D12_SHADER_VISIBILITY_ALL
)
907 InitAsConstants(*this, num32BitValues
, shaderRegister
, registerSpace
, visibility
);
910 inline void InitAsConstantBufferView(
912 UINT registerSpace
= 0,
913 D3D12_SHADER_VISIBILITY visibility
= D3D12_SHADER_VISIBILITY_ALL
)
915 InitAsConstantBufferView(*this, shaderRegister
, registerSpace
, visibility
);
918 inline void InitAsShaderResourceView(
920 UINT registerSpace
= 0,
921 D3D12_SHADER_VISIBILITY visibility
= D3D12_SHADER_VISIBILITY_ALL
)
923 InitAsShaderResourceView(*this, shaderRegister
, registerSpace
, visibility
);
926 inline void InitAsUnorderedAccessView(
928 UINT registerSpace
= 0,
929 D3D12_SHADER_VISIBILITY visibility
= D3D12_SHADER_VISIBILITY_ALL
)
931 InitAsUnorderedAccessView(*this, shaderRegister
, registerSpace
, visibility
);
935 //------------------------------------------------------------------------------------------------
936 struct CD3DX12_STATIC_SAMPLER_DESC
: public D3D12_STATIC_SAMPLER_DESC
938 CD3DX12_STATIC_SAMPLER_DESC() {}
939 explicit CD3DX12_STATIC_SAMPLER_DESC(const D3D12_STATIC_SAMPLER_DESC
&o
) :
940 D3D12_STATIC_SAMPLER_DESC(o
)
942 CD3DX12_STATIC_SAMPLER_DESC(
944 D3D12_FILTER filter
= D3D12_FILTER_ANISOTROPIC
,
945 D3D12_TEXTURE_ADDRESS_MODE addressU
= D3D12_TEXTURE_ADDRESS_MODE_WRAP
,
946 D3D12_TEXTURE_ADDRESS_MODE addressV
= D3D12_TEXTURE_ADDRESS_MODE_WRAP
,
947 D3D12_TEXTURE_ADDRESS_MODE addressW
= D3D12_TEXTURE_ADDRESS_MODE_WRAP
,
948 FLOAT mipLODBias
= 0,
949 UINT maxAnisotropy
= 16,
950 D3D12_COMPARISON_FUNC comparisonFunc
= D3D12_COMPARISON_FUNC_LESS_EQUAL
,
951 D3D12_STATIC_BORDER_COLOR borderColor
= D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE
,
953 FLOAT maxLOD
= D3D12_FLOAT32_MAX
,
954 D3D12_SHADER_VISIBILITY shaderVisibility
= D3D12_SHADER_VISIBILITY_ALL
,
955 UINT registerSpace
= 0)
973 static inline void Init(
974 _Out_ D3D12_STATIC_SAMPLER_DESC
&samplerDesc
,
976 D3D12_FILTER filter
= D3D12_FILTER_ANISOTROPIC
,
977 D3D12_TEXTURE_ADDRESS_MODE addressU
= D3D12_TEXTURE_ADDRESS_MODE_WRAP
,
978 D3D12_TEXTURE_ADDRESS_MODE addressV
= D3D12_TEXTURE_ADDRESS_MODE_WRAP
,
979 D3D12_TEXTURE_ADDRESS_MODE addressW
= D3D12_TEXTURE_ADDRESS_MODE_WRAP
,
980 FLOAT mipLODBias
= 0,
981 UINT maxAnisotropy
= 16,
982 D3D12_COMPARISON_FUNC comparisonFunc
= D3D12_COMPARISON_FUNC_LESS_EQUAL
,
983 D3D12_STATIC_BORDER_COLOR borderColor
= D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE
,
985 FLOAT maxLOD
= D3D12_FLOAT32_MAX
,
986 D3D12_SHADER_VISIBILITY shaderVisibility
= D3D12_SHADER_VISIBILITY_ALL
,
987 UINT registerSpace
= 0)
989 samplerDesc
.ShaderRegister
= shaderRegister
;
990 samplerDesc
.Filter
= filter
;
991 samplerDesc
.AddressU
= addressU
;
992 samplerDesc
.AddressV
= addressV
;
993 samplerDesc
.AddressW
= addressW
;
994 samplerDesc
.MipLODBias
= mipLODBias
;
995 samplerDesc
.MaxAnisotropy
= maxAnisotropy
;
996 samplerDesc
.ComparisonFunc
= comparisonFunc
;
997 samplerDesc
.BorderColor
= borderColor
;
998 samplerDesc
.MinLOD
= minLOD
;
999 samplerDesc
.MaxLOD
= maxLOD
;
1000 samplerDesc
.ShaderVisibility
= shaderVisibility
;
1001 samplerDesc
.RegisterSpace
= registerSpace
;
1004 UINT shaderRegister
,
1005 D3D12_FILTER filter
= D3D12_FILTER_ANISOTROPIC
,
1006 D3D12_TEXTURE_ADDRESS_MODE addressU
= D3D12_TEXTURE_ADDRESS_MODE_WRAP
,
1007 D3D12_TEXTURE_ADDRESS_MODE addressV
= D3D12_TEXTURE_ADDRESS_MODE_WRAP
,
1008 D3D12_TEXTURE_ADDRESS_MODE addressW
= D3D12_TEXTURE_ADDRESS_MODE_WRAP
,
1009 FLOAT mipLODBias
= 0,
1010 UINT maxAnisotropy
= 16,
1011 D3D12_COMPARISON_FUNC comparisonFunc
= D3D12_COMPARISON_FUNC_LESS_EQUAL
,
1012 D3D12_STATIC_BORDER_COLOR borderColor
= D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE
,
1014 FLOAT maxLOD
= D3D12_FLOAT32_MAX
,
1015 D3D12_SHADER_VISIBILITY shaderVisibility
= D3D12_SHADER_VISIBILITY_ALL
,
1016 UINT registerSpace
= 0)
1037 //------------------------------------------------------------------------------------------------
1038 struct CD3DX12_ROOT_SIGNATURE_DESC
: public D3D12_ROOT_SIGNATURE_DESC
1040 CD3DX12_ROOT_SIGNATURE_DESC() {}
1041 explicit CD3DX12_ROOT_SIGNATURE_DESC(const D3D12_ROOT_SIGNATURE_DESC
&o
) :
1042 D3D12_ROOT_SIGNATURE_DESC(o
)
1044 CD3DX12_ROOT_SIGNATURE_DESC(
1046 _In_reads_opt_(numParameters
) const D3D12_ROOT_PARAMETER
* _pParameters
,
1047 UINT numStaticSamplers
= 0,
1048 _In_reads_opt_(numStaticSamplers
) const D3D12_STATIC_SAMPLER_DESC
* _pStaticSamplers
= NULL
,
1049 D3D12_ROOT_SIGNATURE_FLAGS flags
= D3D12_ROOT_SIGNATURE_FLAG_NONE
)
1051 Init(numParameters
, _pParameters
, numStaticSamplers
, _pStaticSamplers
, flags
);
1053 CD3DX12_ROOT_SIGNATURE_DESC(CD3DX12_DEFAULT
)
1055 Init(0, NULL
, 0, NULL
, D3D12_ROOT_SIGNATURE_FLAG_NONE
);
1060 _In_reads_opt_(numParameters
) const D3D12_ROOT_PARAMETER
* _pParameters
,
1061 UINT numStaticSamplers
= 0,
1062 _In_reads_opt_(numStaticSamplers
) const D3D12_STATIC_SAMPLER_DESC
* _pStaticSamplers
= NULL
,
1063 D3D12_ROOT_SIGNATURE_FLAGS flags
= D3D12_ROOT_SIGNATURE_FLAG_NONE
)
1065 Init(*this, numParameters
, _pParameters
, numStaticSamplers
, _pStaticSamplers
, flags
);
1068 static inline void Init(
1069 _Out_ D3D12_ROOT_SIGNATURE_DESC
&desc
,
1071 _In_reads_opt_(numParameters
) const D3D12_ROOT_PARAMETER
* _pParameters
,
1072 UINT numStaticSamplers
= 0,
1073 _In_reads_opt_(numStaticSamplers
) const D3D12_STATIC_SAMPLER_DESC
* _pStaticSamplers
= NULL
,
1074 D3D12_ROOT_SIGNATURE_FLAGS flags
= D3D12_ROOT_SIGNATURE_FLAG_NONE
)
1076 desc
.NumParameters
= numParameters
;
1077 desc
.pParameters
= _pParameters
;
1078 desc
.NumStaticSamplers
= numStaticSamplers
;
1079 desc
.pStaticSamplers
= _pStaticSamplers
;
1084 //------------------------------------------------------------------------------------------------
1085 struct CD3DX12_DESCRIPTOR_RANGE1
: public D3D12_DESCRIPTOR_RANGE1
1087 CD3DX12_DESCRIPTOR_RANGE1() { }
1088 explicit CD3DX12_DESCRIPTOR_RANGE1(const D3D12_DESCRIPTOR_RANGE1
&o
) :
1089 D3D12_DESCRIPTOR_RANGE1(o
)
1091 CD3DX12_DESCRIPTOR_RANGE1(
1092 D3D12_DESCRIPTOR_RANGE_TYPE rangeType
,
1093 UINT numDescriptors
,
1094 UINT baseShaderRegister
,
1095 UINT registerSpace
= 0,
1096 D3D12_DESCRIPTOR_RANGE_FLAGS flags
= D3D12_DESCRIPTOR_RANGE_FLAG_NONE
,
1097 UINT offsetInDescriptorsFromTableStart
=
1098 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND
)
1100 Init(rangeType
, numDescriptors
, baseShaderRegister
, registerSpace
, flags
, offsetInDescriptorsFromTableStart
);
1104 D3D12_DESCRIPTOR_RANGE_TYPE rangeType
,
1105 UINT numDescriptors
,
1106 UINT baseShaderRegister
,
1107 UINT registerSpace
= 0,
1108 D3D12_DESCRIPTOR_RANGE_FLAGS flags
= D3D12_DESCRIPTOR_RANGE_FLAG_NONE
,
1109 UINT offsetInDescriptorsFromTableStart
=
1110 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND
)
1112 Init(*this, rangeType
, numDescriptors
, baseShaderRegister
, registerSpace
, flags
, offsetInDescriptorsFromTableStart
);
1115 static inline void Init(
1116 _Out_ D3D12_DESCRIPTOR_RANGE1
&range
,
1117 D3D12_DESCRIPTOR_RANGE_TYPE rangeType
,
1118 UINT numDescriptors
,
1119 UINT baseShaderRegister
,
1120 UINT registerSpace
= 0,
1121 D3D12_DESCRIPTOR_RANGE_FLAGS flags
= D3D12_DESCRIPTOR_RANGE_FLAG_NONE
,
1122 UINT offsetInDescriptorsFromTableStart
=
1123 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND
)
1125 range
.RangeType
= rangeType
;
1126 range
.NumDescriptors
= numDescriptors
;
1127 range
.BaseShaderRegister
= baseShaderRegister
;
1128 range
.RegisterSpace
= registerSpace
;
1129 range
.Flags
= flags
;
1130 range
.OffsetInDescriptorsFromTableStart
= offsetInDescriptorsFromTableStart
;
1134 //------------------------------------------------------------------------------------------------
1135 struct CD3DX12_ROOT_DESCRIPTOR_TABLE1
: public D3D12_ROOT_DESCRIPTOR_TABLE1
1137 CD3DX12_ROOT_DESCRIPTOR_TABLE1() {}
1138 explicit CD3DX12_ROOT_DESCRIPTOR_TABLE1(const D3D12_ROOT_DESCRIPTOR_TABLE1
&o
) :
1139 D3D12_ROOT_DESCRIPTOR_TABLE1(o
)
1141 CD3DX12_ROOT_DESCRIPTOR_TABLE1(
1142 UINT numDescriptorRanges
,
1143 _In_reads_opt_(numDescriptorRanges
) const D3D12_DESCRIPTOR_RANGE1
* _pDescriptorRanges
)
1145 Init(numDescriptorRanges
, _pDescriptorRanges
);
1149 UINT numDescriptorRanges
,
1150 _In_reads_opt_(numDescriptorRanges
) const D3D12_DESCRIPTOR_RANGE1
* _pDescriptorRanges
)
1152 Init(*this, numDescriptorRanges
, _pDescriptorRanges
);
1155 static inline void Init(
1156 _Out_ D3D12_ROOT_DESCRIPTOR_TABLE1
&rootDescriptorTable
,
1157 UINT numDescriptorRanges
,
1158 _In_reads_opt_(numDescriptorRanges
) const D3D12_DESCRIPTOR_RANGE1
* _pDescriptorRanges
)
1160 rootDescriptorTable
.NumDescriptorRanges
= numDescriptorRanges
;
1161 rootDescriptorTable
.pDescriptorRanges
= _pDescriptorRanges
;
1165 //------------------------------------------------------------------------------------------------
1166 struct CD3DX12_ROOT_DESCRIPTOR1
: public D3D12_ROOT_DESCRIPTOR1
1168 CD3DX12_ROOT_DESCRIPTOR1() {}
1169 explicit CD3DX12_ROOT_DESCRIPTOR1(const D3D12_ROOT_DESCRIPTOR1
&o
) :
1170 D3D12_ROOT_DESCRIPTOR1(o
)
1172 CD3DX12_ROOT_DESCRIPTOR1(
1173 UINT shaderRegister
,
1174 UINT registerSpace
= 0,
1175 D3D12_ROOT_DESCRIPTOR_FLAGS flags
= D3D12_ROOT_DESCRIPTOR_FLAG_NONE
)
1177 Init(shaderRegister
, registerSpace
, flags
);
1181 UINT shaderRegister
,
1182 UINT registerSpace
= 0,
1183 D3D12_ROOT_DESCRIPTOR_FLAGS flags
= D3D12_ROOT_DESCRIPTOR_FLAG_NONE
)
1185 Init(*this, shaderRegister
, registerSpace
, flags
);
1188 static inline void Init(
1189 _Out_ D3D12_ROOT_DESCRIPTOR1
&table
,
1190 UINT shaderRegister
,
1191 UINT registerSpace
= 0,
1192 D3D12_ROOT_DESCRIPTOR_FLAGS flags
= D3D12_ROOT_DESCRIPTOR_FLAG_NONE
)
1194 table
.ShaderRegister
= shaderRegister
;
1195 table
.RegisterSpace
= registerSpace
;
1196 table
.Flags
= flags
;
1200 //------------------------------------------------------------------------------------------------
1201 struct CD3DX12_ROOT_PARAMETER1
: public D3D12_ROOT_PARAMETER1
1203 CD3DX12_ROOT_PARAMETER1() {}
1204 explicit CD3DX12_ROOT_PARAMETER1(const D3D12_ROOT_PARAMETER1
&o
) :
1205 D3D12_ROOT_PARAMETER1(o
)
1208 static inline void InitAsDescriptorTable(
1209 _Out_ D3D12_ROOT_PARAMETER1
&rootParam
,
1210 UINT numDescriptorRanges
,
1211 _In_reads_(numDescriptorRanges
) const D3D12_DESCRIPTOR_RANGE1
* pDescriptorRanges
,
1212 D3D12_SHADER_VISIBILITY visibility
= D3D12_SHADER_VISIBILITY_ALL
)
1214 rootParam
.ParameterType
= D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE
;
1215 rootParam
.ShaderVisibility
= visibility
;
1216 CD3DX12_ROOT_DESCRIPTOR_TABLE1::Init(rootParam
.DescriptorTable
, numDescriptorRanges
, pDescriptorRanges
);
1219 static inline void InitAsConstants(
1220 _Out_ D3D12_ROOT_PARAMETER1
&rootParam
,
1221 UINT num32BitValues
,
1222 UINT shaderRegister
,
1223 UINT registerSpace
= 0,
1224 D3D12_SHADER_VISIBILITY visibility
= D3D12_SHADER_VISIBILITY_ALL
)
1226 rootParam
.ParameterType
= D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS
;
1227 rootParam
.ShaderVisibility
= visibility
;
1228 CD3DX12_ROOT_CONSTANTS::Init(rootParam
.Constants
, num32BitValues
, shaderRegister
, registerSpace
);
1231 static inline void InitAsConstantBufferView(
1232 _Out_ D3D12_ROOT_PARAMETER1
&rootParam
,
1233 UINT shaderRegister
,
1234 UINT registerSpace
= 0,
1235 D3D12_ROOT_DESCRIPTOR_FLAGS flags
= D3D12_ROOT_DESCRIPTOR_FLAG_NONE
,
1236 D3D12_SHADER_VISIBILITY visibility
= D3D12_SHADER_VISIBILITY_ALL
)
1238 rootParam
.ParameterType
= D3D12_ROOT_PARAMETER_TYPE_CBV
;
1239 rootParam
.ShaderVisibility
= visibility
;
1240 CD3DX12_ROOT_DESCRIPTOR1::Init(rootParam
.Descriptor
, shaderRegister
, registerSpace
, flags
);
1243 static inline void InitAsShaderResourceView(
1244 _Out_ D3D12_ROOT_PARAMETER1
&rootParam
,
1245 UINT shaderRegister
,
1246 UINT registerSpace
= 0,
1247 D3D12_ROOT_DESCRIPTOR_FLAGS flags
= D3D12_ROOT_DESCRIPTOR_FLAG_NONE
,
1248 D3D12_SHADER_VISIBILITY visibility
= D3D12_SHADER_VISIBILITY_ALL
)
1250 rootParam
.ParameterType
= D3D12_ROOT_PARAMETER_TYPE_SRV
;
1251 rootParam
.ShaderVisibility
= visibility
;
1252 CD3DX12_ROOT_DESCRIPTOR1::Init(rootParam
.Descriptor
, shaderRegister
, registerSpace
, flags
);
1255 static inline void InitAsUnorderedAccessView(
1256 _Out_ D3D12_ROOT_PARAMETER1
&rootParam
,
1257 UINT shaderRegister
,
1258 UINT registerSpace
= 0,
1259 D3D12_ROOT_DESCRIPTOR_FLAGS flags
= D3D12_ROOT_DESCRIPTOR_FLAG_NONE
,
1260 D3D12_SHADER_VISIBILITY visibility
= D3D12_SHADER_VISIBILITY_ALL
)
1262 rootParam
.ParameterType
= D3D12_ROOT_PARAMETER_TYPE_UAV
;
1263 rootParam
.ShaderVisibility
= visibility
;
1264 CD3DX12_ROOT_DESCRIPTOR1::Init(rootParam
.Descriptor
, shaderRegister
, registerSpace
, flags
);
1267 inline void InitAsDescriptorTable(
1268 UINT numDescriptorRanges
,
1269 _In_reads_(numDescriptorRanges
) const D3D12_DESCRIPTOR_RANGE1
* pDescriptorRanges
,
1270 D3D12_SHADER_VISIBILITY visibility
= D3D12_SHADER_VISIBILITY_ALL
)
1272 InitAsDescriptorTable(*this, numDescriptorRanges
, pDescriptorRanges
, visibility
);
1275 inline void InitAsConstants(
1276 UINT num32BitValues
,
1277 UINT shaderRegister
,
1278 UINT registerSpace
= 0,
1279 D3D12_SHADER_VISIBILITY visibility
= D3D12_SHADER_VISIBILITY_ALL
)
1281 InitAsConstants(*this, num32BitValues
, shaderRegister
, registerSpace
, visibility
);
1284 inline void InitAsConstantBufferView(
1285 UINT shaderRegister
,
1286 UINT registerSpace
= 0,
1287 D3D12_ROOT_DESCRIPTOR_FLAGS flags
= D3D12_ROOT_DESCRIPTOR_FLAG_NONE
,
1288 D3D12_SHADER_VISIBILITY visibility
= D3D12_SHADER_VISIBILITY_ALL
)
1290 InitAsConstantBufferView(*this, shaderRegister
, registerSpace
, flags
, visibility
);
1293 inline void InitAsShaderResourceView(
1294 UINT shaderRegister
,
1295 UINT registerSpace
= 0,
1296 D3D12_ROOT_DESCRIPTOR_FLAGS flags
= D3D12_ROOT_DESCRIPTOR_FLAG_NONE
,
1297 D3D12_SHADER_VISIBILITY visibility
= D3D12_SHADER_VISIBILITY_ALL
)
1299 InitAsShaderResourceView(*this, shaderRegister
, registerSpace
, flags
, visibility
);
1302 inline void InitAsUnorderedAccessView(
1303 UINT shaderRegister
,
1304 UINT registerSpace
= 0,
1305 D3D12_ROOT_DESCRIPTOR_FLAGS flags
= D3D12_ROOT_DESCRIPTOR_FLAG_NONE
,
1306 D3D12_SHADER_VISIBILITY visibility
= D3D12_SHADER_VISIBILITY_ALL
)
1308 InitAsUnorderedAccessView(*this, shaderRegister
, registerSpace
, flags
, visibility
);
1312 //------------------------------------------------------------------------------------------------
1313 struct CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC
: public D3D12_VERSIONED_ROOT_SIGNATURE_DESC
1315 CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC() {}
1316 explicit CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(const D3D12_VERSIONED_ROOT_SIGNATURE_DESC
&o
) :
1317 D3D12_VERSIONED_ROOT_SIGNATURE_DESC(o
)
1319 explicit CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(const D3D12_ROOT_SIGNATURE_DESC
&o
)
1321 Version
= D3D_ROOT_SIGNATURE_VERSION_1_0
;
1324 explicit CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(const D3D12_ROOT_SIGNATURE_DESC1
&o
)
1326 Version
= D3D_ROOT_SIGNATURE_VERSION_1_1
;
1329 CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(
1331 _In_reads_opt_(numParameters
) const D3D12_ROOT_PARAMETER
* _pParameters
,
1332 UINT numStaticSamplers
= 0,
1333 _In_reads_opt_(numStaticSamplers
) const D3D12_STATIC_SAMPLER_DESC
* _pStaticSamplers
= NULL
,
1334 D3D12_ROOT_SIGNATURE_FLAGS flags
= D3D12_ROOT_SIGNATURE_FLAG_NONE
)
1336 Init_1_0(numParameters
, _pParameters
, numStaticSamplers
, _pStaticSamplers
, flags
);
1338 CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(
1340 _In_reads_opt_(numParameters
) const D3D12_ROOT_PARAMETER1
* _pParameters
,
1341 UINT numStaticSamplers
= 0,
1342 _In_reads_opt_(numStaticSamplers
) const D3D12_STATIC_SAMPLER_DESC
* _pStaticSamplers
= NULL
,
1343 D3D12_ROOT_SIGNATURE_FLAGS flags
= D3D12_ROOT_SIGNATURE_FLAG_NONE
)
1345 Init_1_1(numParameters
, _pParameters
, numStaticSamplers
, _pStaticSamplers
, flags
);
1347 CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(CD3DX12_DEFAULT
)
1349 Init_1_1(0, NULL
, 0, NULL
, D3D12_ROOT_SIGNATURE_FLAG_NONE
);
1352 inline void Init_1_0(
1354 _In_reads_opt_(numParameters
) const D3D12_ROOT_PARAMETER
* _pParameters
,
1355 UINT numStaticSamplers
= 0,
1356 _In_reads_opt_(numStaticSamplers
) const D3D12_STATIC_SAMPLER_DESC
* _pStaticSamplers
= NULL
,
1357 D3D12_ROOT_SIGNATURE_FLAGS flags
= D3D12_ROOT_SIGNATURE_FLAG_NONE
)
1359 Init_1_0(*this, numParameters
, _pParameters
, numStaticSamplers
, _pStaticSamplers
, flags
);
1362 static inline void Init_1_0(
1363 _Out_ D3D12_VERSIONED_ROOT_SIGNATURE_DESC
&desc
,
1365 _In_reads_opt_(numParameters
) const D3D12_ROOT_PARAMETER
* _pParameters
,
1366 UINT numStaticSamplers
= 0,
1367 _In_reads_opt_(numStaticSamplers
) const D3D12_STATIC_SAMPLER_DESC
* _pStaticSamplers
= NULL
,
1368 D3D12_ROOT_SIGNATURE_FLAGS flags
= D3D12_ROOT_SIGNATURE_FLAG_NONE
)
1370 desc
.Version
= D3D_ROOT_SIGNATURE_VERSION_1_0
;
1371 desc
.Desc_1_0
.NumParameters
= numParameters
;
1372 desc
.Desc_1_0
.pParameters
= _pParameters
;
1373 desc
.Desc_1_0
.NumStaticSamplers
= numStaticSamplers
;
1374 desc
.Desc_1_0
.pStaticSamplers
= _pStaticSamplers
;
1375 desc
.Desc_1_0
.Flags
= flags
;
1378 inline void Init_1_1(
1380 _In_reads_opt_(numParameters
) const D3D12_ROOT_PARAMETER1
* _pParameters
,
1381 UINT numStaticSamplers
= 0,
1382 _In_reads_opt_(numStaticSamplers
) const D3D12_STATIC_SAMPLER_DESC
* _pStaticSamplers
= NULL
,
1383 D3D12_ROOT_SIGNATURE_FLAGS flags
= D3D12_ROOT_SIGNATURE_FLAG_NONE
)
1385 Init_1_1(*this, numParameters
, _pParameters
, numStaticSamplers
, _pStaticSamplers
, flags
);
1388 static inline void Init_1_1(
1389 _Out_ D3D12_VERSIONED_ROOT_SIGNATURE_DESC
&desc
,
1391 _In_reads_opt_(numParameters
) const D3D12_ROOT_PARAMETER1
* _pParameters
,
1392 UINT numStaticSamplers
= 0,
1393 _In_reads_opt_(numStaticSamplers
) const D3D12_STATIC_SAMPLER_DESC
* _pStaticSamplers
= NULL
,
1394 D3D12_ROOT_SIGNATURE_FLAGS flags
= D3D12_ROOT_SIGNATURE_FLAG_NONE
)
1396 desc
.Version
= D3D_ROOT_SIGNATURE_VERSION_1_1
;
1397 desc
.Desc_1_1
.NumParameters
= numParameters
;
1398 desc
.Desc_1_1
.pParameters
= _pParameters
;
1399 desc
.Desc_1_1
.NumStaticSamplers
= numStaticSamplers
;
1400 desc
.Desc_1_1
.pStaticSamplers
= _pStaticSamplers
;
1401 desc
.Desc_1_1
.Flags
= flags
;
1405 //------------------------------------------------------------------------------------------------
1406 struct CD3DX12_CPU_DESCRIPTOR_HANDLE
: public D3D12_CPU_DESCRIPTOR_HANDLE
1408 CD3DX12_CPU_DESCRIPTOR_HANDLE() {}
1409 explicit CD3DX12_CPU_DESCRIPTOR_HANDLE(const D3D12_CPU_DESCRIPTOR_HANDLE
&o
) :
1410 D3D12_CPU_DESCRIPTOR_HANDLE(o
)
1412 CD3DX12_CPU_DESCRIPTOR_HANDLE(CD3DX12_DEFAULT
) { ptr
= 0; }
1413 CD3DX12_CPU_DESCRIPTOR_HANDLE(_In_
const D3D12_CPU_DESCRIPTOR_HANDLE
&other
, INT offsetScaledByIncrementSize
)
1415 InitOffsetted(other
, offsetScaledByIncrementSize
);
1417 CD3DX12_CPU_DESCRIPTOR_HANDLE(_In_
const D3D12_CPU_DESCRIPTOR_HANDLE
&other
, INT offsetInDescriptors
, UINT descriptorIncrementSize
)
1419 InitOffsetted(other
, offsetInDescriptors
, descriptorIncrementSize
);
1421 CD3DX12_CPU_DESCRIPTOR_HANDLE
& Offset(INT offsetInDescriptors
, UINT descriptorIncrementSize
)
1423 ptr
+= offsetInDescriptors
* descriptorIncrementSize
;
1426 CD3DX12_CPU_DESCRIPTOR_HANDLE
& Offset(INT offsetScaledByIncrementSize
)
1428 ptr
+= offsetScaledByIncrementSize
;
1431 bool operator==(_In_
const D3D12_CPU_DESCRIPTOR_HANDLE
& other
) const
1433 return (ptr
== other
.ptr
);
1435 bool operator!=(_In_
const D3D12_CPU_DESCRIPTOR_HANDLE
& other
) const
1437 return (ptr
!= other
.ptr
);
1439 CD3DX12_CPU_DESCRIPTOR_HANDLE
&operator=(const D3D12_CPU_DESCRIPTOR_HANDLE
&other
)
1445 inline void InitOffsetted(_In_
const D3D12_CPU_DESCRIPTOR_HANDLE
&base
, INT offsetScaledByIncrementSize
)
1447 InitOffsetted(*this, base
, offsetScaledByIncrementSize
);
1450 inline void InitOffsetted(_In_
const D3D12_CPU_DESCRIPTOR_HANDLE
&base
, INT offsetInDescriptors
, UINT descriptorIncrementSize
)
1452 InitOffsetted(*this, base
, offsetInDescriptors
, descriptorIncrementSize
);
1455 static inline void InitOffsetted(_Out_ D3D12_CPU_DESCRIPTOR_HANDLE
&handle
, _In_
const D3D12_CPU_DESCRIPTOR_HANDLE
&base
, INT offsetScaledByIncrementSize
)
1457 handle
.ptr
= base
.ptr
+ offsetScaledByIncrementSize
;
1460 static inline void InitOffsetted(_Out_ D3D12_CPU_DESCRIPTOR_HANDLE
&handle
, _In_
const D3D12_CPU_DESCRIPTOR_HANDLE
&base
, INT offsetInDescriptors
, UINT descriptorIncrementSize
)
1462 handle
.ptr
= base
.ptr
+ offsetInDescriptors
* descriptorIncrementSize
;
1466 //------------------------------------------------------------------------------------------------
1467 struct CD3DX12_GPU_DESCRIPTOR_HANDLE
: public D3D12_GPU_DESCRIPTOR_HANDLE
1469 CD3DX12_GPU_DESCRIPTOR_HANDLE() {}
1470 explicit CD3DX12_GPU_DESCRIPTOR_HANDLE(const D3D12_GPU_DESCRIPTOR_HANDLE
&o
) :
1471 D3D12_GPU_DESCRIPTOR_HANDLE(o
)
1473 CD3DX12_GPU_DESCRIPTOR_HANDLE(CD3DX12_DEFAULT
) { ptr
= 0; }
1474 CD3DX12_GPU_DESCRIPTOR_HANDLE(_In_
const D3D12_GPU_DESCRIPTOR_HANDLE
&other
, INT offsetScaledByIncrementSize
)
1476 InitOffsetted(other
, offsetScaledByIncrementSize
);
1478 CD3DX12_GPU_DESCRIPTOR_HANDLE(_In_
const D3D12_GPU_DESCRIPTOR_HANDLE
&other
, INT offsetInDescriptors
, UINT descriptorIncrementSize
)
1480 InitOffsetted(other
, offsetInDescriptors
, descriptorIncrementSize
);
1482 CD3DX12_GPU_DESCRIPTOR_HANDLE
& Offset(INT offsetInDescriptors
, UINT descriptorIncrementSize
)
1484 ptr
+= offsetInDescriptors
* descriptorIncrementSize
;
1487 CD3DX12_GPU_DESCRIPTOR_HANDLE
& Offset(INT offsetScaledByIncrementSize
)
1489 ptr
+= offsetScaledByIncrementSize
;
1492 inline bool operator==(_In_
const D3D12_GPU_DESCRIPTOR_HANDLE
& other
) const
1494 return (ptr
== other
.ptr
);
1496 inline bool operator!=(_In_
const D3D12_GPU_DESCRIPTOR_HANDLE
& other
) const
1498 return (ptr
!= other
.ptr
);
1500 CD3DX12_GPU_DESCRIPTOR_HANDLE
&operator=(const D3D12_GPU_DESCRIPTOR_HANDLE
&other
)
1506 inline void InitOffsetted(_In_
const D3D12_GPU_DESCRIPTOR_HANDLE
&base
, INT offsetScaledByIncrementSize
)
1508 InitOffsetted(*this, base
, offsetScaledByIncrementSize
);
1511 inline void InitOffsetted(_In_
const D3D12_GPU_DESCRIPTOR_HANDLE
&base
, INT offsetInDescriptors
, UINT descriptorIncrementSize
)
1513 InitOffsetted(*this, base
, offsetInDescriptors
, descriptorIncrementSize
);
1516 static inline void InitOffsetted(_Out_ D3D12_GPU_DESCRIPTOR_HANDLE
&handle
, _In_
const D3D12_GPU_DESCRIPTOR_HANDLE
&base
, INT offsetScaledByIncrementSize
)
1518 handle
.ptr
= base
.ptr
+ offsetScaledByIncrementSize
;
1521 static inline void InitOffsetted(_Out_ D3D12_GPU_DESCRIPTOR_HANDLE
&handle
, _In_
const D3D12_GPU_DESCRIPTOR_HANDLE
&base
, INT offsetInDescriptors
, UINT descriptorIncrementSize
)
1523 handle
.ptr
= base
.ptr
+ offsetInDescriptors
* descriptorIncrementSize
;
1527 //------------------------------------------------------------------------------------------------
1528 inline UINT
D3D12CalcSubresource( UINT MipSlice
, UINT ArraySlice
, UINT PlaneSlice
, UINT MipLevels
, UINT ArraySize
)
1530 return MipSlice
+ ArraySlice
* MipLevels
+ PlaneSlice
* MipLevels
* ArraySize
;
1533 //------------------------------------------------------------------------------------------------
1534 template <typename T
, typename U
, typename V
>
1535 inline void D3D12DecomposeSubresource( UINT Subresource
, UINT MipLevels
, UINT ArraySize
, _Out_ T
& MipSlice
, _Out_ U
& ArraySlice
, _Out_ V
& PlaneSlice
)
1537 MipSlice
= static_cast<T
>(Subresource
% MipLevels
);
1538 ArraySlice
= static_cast<U
>((Subresource
/ MipLevels
) % ArraySize
);
1539 PlaneSlice
= static_cast<V
>(Subresource
/ (MipLevels
* ArraySize
));
1542 //------------------------------------------------------------------------------------------------
1543 inline UINT8
D3D12GetFormatPlaneCount(
1544 _In_ ID3D12Device
* pDevice
,
1548 D3D12_FEATURE_DATA_FORMAT_INFO formatInfo
= {Format
};
1549 if (FAILED(pDevice
->CheckFeatureSupport(D3D12_FEATURE_FORMAT_INFO
, &formatInfo
, sizeof(formatInfo
))))
1553 return formatInfo
.PlaneCount
;
1556 //------------------------------------------------------------------------------------------------
1557 struct CD3DX12_RESOURCE_DESC
: public D3D12_RESOURCE_DESC
1559 CD3DX12_RESOURCE_DESC()
1561 explicit CD3DX12_RESOURCE_DESC( const D3D12_RESOURCE_DESC
& o
) :
1562 D3D12_RESOURCE_DESC( o
)
1564 CD3DX12_RESOURCE_DESC(
1565 D3D12_RESOURCE_DIMENSION dimension
,
1569 UINT16 depthOrArraySize
,
1574 D3D12_TEXTURE_LAYOUT layout
,
1575 D3D12_RESOURCE_FLAGS flags
)
1577 Dimension
= dimension
;
1578 Alignment
= alignment
;
1581 DepthOrArraySize
= depthOrArraySize
;
1582 MipLevels
= mipLevels
;
1584 SampleDesc
.Count
= sampleCount
;
1585 SampleDesc
.Quality
= sampleQuality
;
1589 static inline CD3DX12_RESOURCE_DESC
Buffer(
1590 const D3D12_RESOURCE_ALLOCATION_INFO
& resAllocInfo
,
1591 D3D12_RESOURCE_FLAGS flags
= D3D12_RESOURCE_FLAG_NONE
)
1593 return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_BUFFER
, resAllocInfo
.Alignment
, resAllocInfo
.SizeInBytes
,
1594 1, 1, 1, DXGI_FORMAT_UNKNOWN
, 1, 0, D3D12_TEXTURE_LAYOUT_ROW_MAJOR
, flags
);
1596 static inline CD3DX12_RESOURCE_DESC
Buffer(
1598 D3D12_RESOURCE_FLAGS flags
= D3D12_RESOURCE_FLAG_NONE
,
1599 UINT64 alignment
= 0 )
1601 return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_BUFFER
, alignment
, width
, 1, 1, 1,
1602 DXGI_FORMAT_UNKNOWN
, 1, 0, D3D12_TEXTURE_LAYOUT_ROW_MAJOR
, flags
);
1604 static inline CD3DX12_RESOURCE_DESC
Tex1D(
1607 UINT16 arraySize
= 1,
1608 UINT16 mipLevels
= 0,
1609 D3D12_RESOURCE_FLAGS flags
= D3D12_RESOURCE_FLAG_NONE
,
1610 D3D12_TEXTURE_LAYOUT layout
= D3D12_TEXTURE_LAYOUT_UNKNOWN
,
1611 UINT64 alignment
= 0 )
1613 return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_TEXTURE1D
, alignment
, width
, 1, arraySize
,
1614 mipLevels
, format
, 1, 0, layout
, flags
);
1616 static inline CD3DX12_RESOURCE_DESC
Tex2D(
1620 UINT16 arraySize
= 1,
1621 UINT16 mipLevels
= 0,
1622 UINT sampleCount
= 1,
1623 UINT sampleQuality
= 0,
1624 D3D12_RESOURCE_FLAGS flags
= D3D12_RESOURCE_FLAG_NONE
,
1625 D3D12_TEXTURE_LAYOUT layout
= D3D12_TEXTURE_LAYOUT_UNKNOWN
,
1626 UINT64 alignment
= 0 )
1628 return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_TEXTURE2D
, alignment
, width
, height
, arraySize
,
1629 mipLevels
, format
, sampleCount
, sampleQuality
, layout
, flags
);
1631 static inline CD3DX12_RESOURCE_DESC
Tex3D(
1636 UINT16 mipLevels
= 0,
1637 D3D12_RESOURCE_FLAGS flags
= D3D12_RESOURCE_FLAG_NONE
,
1638 D3D12_TEXTURE_LAYOUT layout
= D3D12_TEXTURE_LAYOUT_UNKNOWN
,
1639 UINT64 alignment
= 0 )
1641 return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_TEXTURE3D
, alignment
, width
, height
, depth
,
1642 mipLevels
, format
, 1, 0, layout
, flags
);
1644 inline UINT16
Depth() const
1645 { return (Dimension
== D3D12_RESOURCE_DIMENSION_TEXTURE3D
? DepthOrArraySize
: 1); }
1646 inline UINT16
ArraySize() const
1647 { return (Dimension
!= D3D12_RESOURCE_DIMENSION_TEXTURE3D
? DepthOrArraySize
: 1); }
1648 inline UINT8
PlaneCount(_In_ ID3D12Device
* pDevice
) const
1649 { return D3D12GetFormatPlaneCount(pDevice
, Format
); }
1650 inline UINT
Subresources(_In_ ID3D12Device
* pDevice
) const
1651 { return MipLevels
* ArraySize() * PlaneCount(pDevice
); }
1652 inline UINT
CalcSubresource(UINT MipSlice
, UINT ArraySlice
, UINT PlaneSlice
)
1653 { return D3D12CalcSubresource(MipSlice
, ArraySlice
, PlaneSlice
, MipLevels
, ArraySize()); }
1654 operator const D3D12_RESOURCE_DESC
&() const { return *this; }
1656 inline bool operator==( const D3D12_RESOURCE_DESC
& l
, const D3D12_RESOURCE_DESC
& r
)
1658 return l
.Dimension
== r
.Dimension
&&
1659 l
.Alignment
== r
.Alignment
&&
1660 l
.Width
== r
.Width
&&
1661 l
.Height
== r
.Height
&&
1662 l
.DepthOrArraySize
== r
.DepthOrArraySize
&&
1663 l
.MipLevels
== r
.MipLevels
&&
1664 l
.Format
== r
.Format
&&
1665 l
.SampleDesc
.Count
== r
.SampleDesc
.Count
&&
1666 l
.SampleDesc
.Quality
== r
.SampleDesc
.Quality
&&
1667 l
.Layout
== r
.Layout
&&
1670 inline bool operator!=( const D3D12_RESOURCE_DESC
& l
, const D3D12_RESOURCE_DESC
& r
)
1671 { return !( l
== r
); }
1673 //------------------------------------------------------------------------------------------------
1674 // Row-by-row memcpy
1675 inline void MemcpySubresource(
1676 _In_
const D3D12_MEMCPY_DEST
* pDest
,
1677 _In_
const D3D12_SUBRESOURCE_DATA
* pSrc
,
1678 SIZE_T RowSizeInBytes
,
1682 for (UINT z
= 0; z
< NumSlices
; ++z
)
1684 BYTE
* pDestSlice
= reinterpret_cast<BYTE
*>(pDest
->pData
) + pDest
->SlicePitch
* z
;
1685 const BYTE
* pSrcSlice
= reinterpret_cast<const BYTE
*>(pSrc
->pData
) + pSrc
->SlicePitch
* z
;
1686 for (UINT y
= 0; y
< NumRows
; ++y
)
1688 memcpy(pDestSlice
+ pDest
->RowPitch
* y
,
1689 pSrcSlice
+ pSrc
->RowPitch
* y
,
1695 //------------------------------------------------------------------------------------------------
1696 // Returns required size of a buffer to be used for data upload
1697 inline UINT64
GetRequiredIntermediateSize(
1698 _In_ ID3D12Resource
* pDestinationResource
,
1699 _In_range_(0,D3D12_REQ_SUBRESOURCES
) UINT FirstSubresource
,
1700 _In_range_(0,D3D12_REQ_SUBRESOURCES
-FirstSubresource
) UINT NumSubresources
)
1702 D3D12_RESOURCE_DESC Desc
= pDestinationResource
->GetDesc();
1703 UINT64 RequiredSize
= 0;
1705 ID3D12Device
* pDevice
;
1706 pDestinationResource
->GetDevice(__uuidof(*pDevice
), reinterpret_cast<void**>(&pDevice
));
1707 pDevice
->GetCopyableFootprints(&Desc
, FirstSubresource
, NumSubresources
, 0, nullptr, nullptr, nullptr, &RequiredSize
);
1710 return RequiredSize
;
1713 //------------------------------------------------------------------------------------------------
1714 // All arrays must be populated (e.g. by calling GetCopyableFootprints)
1715 inline UINT64
UpdateSubresources(
1716 _In_ ID3D12GraphicsCommandList
* pCmdList
,
1717 _In_ ID3D12Resource
* pDestinationResource
,
1718 _In_ ID3D12Resource
* pIntermediate
,
1719 _In_range_(0,D3D12_REQ_SUBRESOURCES
) UINT FirstSubresource
,
1720 _In_range_(0,D3D12_REQ_SUBRESOURCES
-FirstSubresource
) UINT NumSubresources
,
1721 UINT64 RequiredSize
,
1722 _In_reads_(NumSubresources
) const D3D12_PLACED_SUBRESOURCE_FOOTPRINT
* pLayouts
,
1723 _In_reads_(NumSubresources
) const UINT
* pNumRows
,
1724 _In_reads_(NumSubresources
) const UINT64
* pRowSizesInBytes
,
1725 _In_reads_(NumSubresources
) const D3D12_SUBRESOURCE_DATA
* pSrcData
)
1728 D3D12_RESOURCE_DESC IntermediateDesc
= pIntermediate
->GetDesc();
1729 D3D12_RESOURCE_DESC DestinationDesc
= pDestinationResource
->GetDesc();
1730 if (IntermediateDesc
.Dimension
!= D3D12_RESOURCE_DIMENSION_BUFFER
||
1731 IntermediateDesc
.Width
< RequiredSize
+ pLayouts
[0].Offset
||
1732 RequiredSize
> (SIZE_T
)-1 ||
1733 (DestinationDesc
.Dimension
== D3D12_RESOURCE_DIMENSION_BUFFER
&&
1734 (FirstSubresource
!= 0 || NumSubresources
!= 1)))
1740 HRESULT hr
= pIntermediate
->Map(0, NULL
, reinterpret_cast<void**>(&pData
));
1746 for (UINT i
= 0; i
< NumSubresources
; ++i
)
1748 if (pRowSizesInBytes
[i
] > (SIZE_T
)-1) return 0;
1749 D3D12_MEMCPY_DEST DestData
= { pData
+ pLayouts
[i
].Offset
, pLayouts
[i
].Footprint
.RowPitch
, pLayouts
[i
].Footprint
.RowPitch
* pNumRows
[i
] };
1750 MemcpySubresource(&DestData
, &pSrcData
[i
], (SIZE_T
)pRowSizesInBytes
[i
], pNumRows
[i
], pLayouts
[i
].Footprint
.Depth
);
1752 pIntermediate
->Unmap(0, NULL
);
1754 if (DestinationDesc
.Dimension
== D3D12_RESOURCE_DIMENSION_BUFFER
)
1756 CD3DX12_BOX
SrcBox( UINT( pLayouts
[0].Offset
), UINT( pLayouts
[0].Offset
+ pLayouts
[0].Footprint
.Width
) );
1757 pCmdList
->CopyBufferRegion(
1758 pDestinationResource
, 0, pIntermediate
, pLayouts
[0].Offset
, pLayouts
[0].Footprint
.Width
);
1762 for (UINT i
= 0; i
< NumSubresources
; ++i
)
1764 CD3DX12_TEXTURE_COPY_LOCATION
Dst(pDestinationResource
, i
+ FirstSubresource
);
1765 CD3DX12_TEXTURE_COPY_LOCATION
Src(pIntermediate
, pLayouts
[i
]);
1766 pCmdList
->CopyTextureRegion(&Dst
, 0, 0, 0, &Src
, nullptr);
1769 return RequiredSize
;
1772 //------------------------------------------------------------------------------------------------
1773 // Heap-allocating UpdateSubresources implementation
1774 inline UINT64
UpdateSubresources(
1775 _In_ ID3D12GraphicsCommandList
* pCmdList
,
1776 _In_ ID3D12Resource
* pDestinationResource
,
1777 _In_ ID3D12Resource
* pIntermediate
,
1778 UINT64 IntermediateOffset
,
1779 _In_range_(0,D3D12_REQ_SUBRESOURCES
) UINT FirstSubresource
,
1780 _In_range_(0,D3D12_REQ_SUBRESOURCES
-FirstSubresource
) UINT NumSubresources
,
1781 _In_reads_(NumSubresources
) D3D12_SUBRESOURCE_DATA
* pSrcData
)
1783 UINT64 RequiredSize
= 0;
1784 UINT64 MemToAlloc
= static_cast<UINT64
>(sizeof(D3D12_PLACED_SUBRESOURCE_FOOTPRINT
) + sizeof(UINT
) + sizeof(UINT64
)) * NumSubresources
;
1785 if (MemToAlloc
> SIZE_MAX
)
1789 void* pMem
= HeapAlloc(GetProcessHeap(), 0, static_cast<SIZE_T
>(MemToAlloc
));
1794 D3D12_PLACED_SUBRESOURCE_FOOTPRINT
* pLayouts
= reinterpret_cast<D3D12_PLACED_SUBRESOURCE_FOOTPRINT
*>(pMem
);
1795 UINT64
* pRowSizesInBytes
= reinterpret_cast<UINT64
*>(pLayouts
+ NumSubresources
);
1796 UINT
* pNumRows
= reinterpret_cast<UINT
*>(pRowSizesInBytes
+ NumSubresources
);
1798 D3D12_RESOURCE_DESC Desc
= pDestinationResource
->GetDesc();
1799 ID3D12Device
* pDevice
;
1800 pDestinationResource
->GetDevice(__uuidof(*pDevice
), reinterpret_cast<void**>(&pDevice
));
1801 pDevice
->GetCopyableFootprints(&Desc
, FirstSubresource
, NumSubresources
, IntermediateOffset
, pLayouts
, pNumRows
, pRowSizesInBytes
, &RequiredSize
);
1804 UINT64 Result
= UpdateSubresources(pCmdList
, pDestinationResource
, pIntermediate
, FirstSubresource
, NumSubresources
, RequiredSize
, pLayouts
, pNumRows
, pRowSizesInBytes
, pSrcData
);
1805 HeapFree(GetProcessHeap(), 0, pMem
);
1809 //------------------------------------------------------------------------------------------------
1810 // Stack-allocating UpdateSubresources implementation
1811 template <UINT MaxSubresources
>
1812 inline UINT64
UpdateSubresources(
1813 _In_ ID3D12GraphicsCommandList
* pCmdList
,
1814 _In_ ID3D12Resource
* pDestinationResource
,
1815 _In_ ID3D12Resource
* pIntermediate
,
1816 UINT64 IntermediateOffset
,
1817 _In_range_(0, MaxSubresources
) UINT FirstSubresource
,
1818 _In_range_(1, MaxSubresources
- FirstSubresource
) UINT NumSubresources
,
1819 _In_reads_(NumSubresources
) D3D12_SUBRESOURCE_DATA
* pSrcData
)
1821 UINT64 RequiredSize
= 0;
1822 D3D12_PLACED_SUBRESOURCE_FOOTPRINT Layouts
[MaxSubresources
];
1823 UINT NumRows
[MaxSubresources
];
1824 UINT64 RowSizesInBytes
[MaxSubresources
];
1826 D3D12_RESOURCE_DESC Desc
= pDestinationResource
->GetDesc();
1827 ID3D12Device
* pDevice
;
1828 pDestinationResource
->GetDevice(__uuidof(*pDevice
), reinterpret_cast<void**>(&pDevice
));
1829 pDevice
->GetCopyableFootprints(&Desc
, FirstSubresource
, NumSubresources
, IntermediateOffset
, Layouts
, NumRows
, RowSizesInBytes
, &RequiredSize
);
1832 return UpdateSubresources(pCmdList
, pDestinationResource
, pIntermediate
, FirstSubresource
, NumSubresources
, RequiredSize
, Layouts
, NumRows
, RowSizesInBytes
, pSrcData
);
1835 //------------------------------------------------------------------------------------------------
1836 inline bool D3D12IsLayoutOpaque( D3D12_TEXTURE_LAYOUT Layout
)
1837 { return Layout
== D3D12_TEXTURE_LAYOUT_UNKNOWN
|| Layout
== D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE
; }
1839 //------------------------------------------------------------------------------------------------
1840 inline ID3D12CommandList
* const * CommandListCast(ID3D12GraphicsCommandList
* const * pp
)
1842 // This cast is useful for passing strongly typed command list pointers into
1843 // ExecuteCommandLists.
1844 // This cast is valid as long as the const-ness is respected. D3D12 APIs do
1845 // respect the const-ness of their arguments.
1846 return reinterpret_cast<ID3D12CommandList
* const *>(pp
);
1849 //------------------------------------------------------------------------------------------------
1850 // D3D12 exports a new method for serializing root signatures in the Windows 10 Anniversary Update.
1851 // To help enable root signature 1.1 features when they are available and not require maintaining
1852 // two code paths for building root signatures, this helper method reconstructs a 1.0 signature when
1853 // 1.1 is not supported.
1854 inline HRESULT
D3DX12SerializeVersionedRootSignature(
1855 _In_
const D3D12_VERSIONED_ROOT_SIGNATURE_DESC
* pRootSignatureDesc
,
1856 D3D_ROOT_SIGNATURE_VERSION MaxVersion
,
1857 _Outptr_ ID3DBlob
** ppBlob
,
1858 _Always_(_Outptr_opt_result_maybenull_
) ID3DBlob
** ppErrorBlob
)
1862 case D3D_ROOT_SIGNATURE_VERSION_1_0
:
1863 switch (pRootSignatureDesc
->Version
)
1865 case D3D_ROOT_SIGNATURE_VERSION_1_0
:
1866 return D3D12SerializeRootSignature(&pRootSignatureDesc
->Desc_1_0
, D3D_ROOT_SIGNATURE_VERSION_1
, ppBlob
, ppErrorBlob
);
1868 case D3D_ROOT_SIGNATURE_VERSION_1_1
:
1870 const D3D12_ROOT_SIGNATURE_DESC1
& desc_1_1
= pRootSignatureDesc
->Desc_1_1
;
1872 SIZE_T ParametersSize
= sizeof(D3D12_ROOT_PARAMETER
) * desc_1_1
.NumParameters
;
1873 void* pParameters
= (ParametersSize
> 0) ? HeapAlloc(GetProcessHeap(), 0, ParametersSize
) : NULL
;
1874 D3D12_ROOT_PARAMETER
* pParameters_1_0
= reinterpret_cast<D3D12_ROOT_PARAMETER
*>(pParameters
);
1876 for (UINT n
= 0; n
< desc_1_1
.NumParameters
; n
++)
1878 pParameters_1_0
[n
].ParameterType
= desc_1_1
.pParameters
[n
].ParameterType
;
1879 pParameters_1_0
[n
].ShaderVisibility
= desc_1_1
.pParameters
[n
].ShaderVisibility
;
1881 switch (desc_1_1
.pParameters
[n
].ParameterType
)
1883 case D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS
:
1884 pParameters_1_0
[n
].Constants
.Num32BitValues
= desc_1_1
.pParameters
[n
].Constants
.Num32BitValues
;
1885 pParameters_1_0
[n
].Constants
.RegisterSpace
= desc_1_1
.pParameters
[n
].Constants
.RegisterSpace
;
1886 pParameters_1_0
[n
].Constants
.ShaderRegister
= desc_1_1
.pParameters
[n
].Constants
.ShaderRegister
;
1889 case D3D12_ROOT_PARAMETER_TYPE_CBV
:
1890 case D3D12_ROOT_PARAMETER_TYPE_SRV
:
1891 case D3D12_ROOT_PARAMETER_TYPE_UAV
:
1892 pParameters_1_0
[n
].Descriptor
.RegisterSpace
= desc_1_1
.pParameters
[n
].Descriptor
.RegisterSpace
;
1893 pParameters_1_0
[n
].Descriptor
.ShaderRegister
= desc_1_1
.pParameters
[n
].Descriptor
.ShaderRegister
;
1896 case D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE
:
1897 const D3D12_ROOT_DESCRIPTOR_TABLE1
& table_1_1
= desc_1_1
.pParameters
[n
].DescriptorTable
;
1899 SIZE_T DescriptorRangesSize
= sizeof(D3D12_DESCRIPTOR_RANGE
) * table_1_1
.NumDescriptorRanges
;
1900 void* pDescriptorRanges
= (DescriptorRangesSize
> 0) ? HeapAlloc(GetProcessHeap(), 0, DescriptorRangesSize
) : NULL
;
1901 D3D12_DESCRIPTOR_RANGE
* pDescriptorRanges_1_0
= reinterpret_cast<D3D12_DESCRIPTOR_RANGE
*>(pDescriptorRanges
);
1903 for (UINT x
= 0; x
< table_1_1
.NumDescriptorRanges
; x
++)
1905 pDescriptorRanges_1_0
[x
].BaseShaderRegister
= table_1_1
.pDescriptorRanges
[x
].BaseShaderRegister
;
1906 pDescriptorRanges_1_0
[x
].NumDescriptors
= table_1_1
.pDescriptorRanges
[x
].NumDescriptors
;
1907 pDescriptorRanges_1_0
[x
].OffsetInDescriptorsFromTableStart
= table_1_1
.pDescriptorRanges
[x
].OffsetInDescriptorsFromTableStart
;
1908 pDescriptorRanges_1_0
[x
].RangeType
= table_1_1
.pDescriptorRanges
[x
].RangeType
;
1909 pDescriptorRanges_1_0
[x
].RegisterSpace
= table_1_1
.pDescriptorRanges
[x
].RegisterSpace
;
1912 D3D12_ROOT_DESCRIPTOR_TABLE
& table_1_0
= pParameters_1_0
[n
].DescriptorTable
;
1913 table_1_0
.NumDescriptorRanges
= table_1_1
.NumDescriptorRanges
;
1914 table_1_0
.pDescriptorRanges
= pDescriptorRanges_1_0
;
1918 CD3DX12_ROOT_SIGNATURE_DESC
desc_1_0(desc_1_1
.NumParameters
, pParameters_1_0
, desc_1_1
.NumStaticSamplers
, desc_1_1
.pStaticSamplers
, desc_1_1
.Flags
);
1919 HRESULT hr
= D3D12SerializeRootSignature(&desc_1_0
, D3D_ROOT_SIGNATURE_VERSION_1
, ppBlob
, ppErrorBlob
);
1921 for (UINT n
= 0; n
< desc_1_0
.NumParameters
; n
++)
1923 if (desc_1_0
.pParameters
[n
].ParameterType
== D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE
)
1925 HeapFree(GetProcessHeap(), 0, reinterpret_cast<void*>(const_cast<D3D12_DESCRIPTOR_RANGE
*>(pParameters_1_0
[n
].DescriptorTable
.pDescriptorRanges
)));
1928 HeapFree(GetProcessHeap(), 0, pParameters
);
1934 case D3D_ROOT_SIGNATURE_VERSION_1_1
:
1935 return D3D12SerializeVersionedRootSignature(pRootSignatureDesc
, ppBlob
, ppErrorBlob
);
1938 return E_INVALIDARG
;
1941 #endif // defined( __cplusplus )
1943 #endif //__D3DX12_H__