15 #if defined(__cplusplus)
22 inline bool operator==(
const D3D12_VIEWPORT& l,
const D3D12_VIEWPORT& r)
24 return l.TopLeftX == r.TopLeftX && l.TopLeftY == r.TopLeftY && l.Width == r.Width &&
25 l.Height == r.Height && l.MinDepth == r.MinDepth && l.MaxDepth == r.MaxDepth;
29 inline bool operator!=(
const D3D12_VIEWPORT& l,
const D3D12_VIEWPORT& r)
54 operator const D3D12_RECT&()
const {
return *
this; }
105 operator const D3D12_BOX&()
const {
return *
this; }
107 inline bool operator==(
const D3D12_BOX& l,
const D3D12_BOX& r)
109 return l.left == r.left && l.top == r.top && l.front == r.front &&
110 l.right == r.right && l.bottom == r.bottom && l.back == r.back;
112 inline bool operator!=(
const D3D12_BOX& l,
const D3D12_BOX& r)
123 D3D12_DEPTH_STENCIL_DESC(o)
128 DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL;
129 DepthFunc = D3D12_COMPARISON_FUNC_LESS;
130 StencilEnable = FALSE;
131 StencilReadMask = D3D12_DEFAULT_STENCIL_READ_MASK;
132 StencilWriteMask = D3D12_DEFAULT_STENCIL_WRITE_MASK;
133 const D3D12_DEPTH_STENCILOP_DESC defaultStencilOp =
134 {D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, D3D12_COMPARISON_FUNC_ALWAYS};
135 FrontFace = defaultStencilOp;
136 BackFace = defaultStencilOp;
140 D3D12_DEPTH_WRITE_MASK depthWriteMask,
141 D3D12_COMPARISON_FUNC depthFunc,
143 UINT8 stencilReadMask,
144 UINT8 stencilWriteMask,
145 D3D12_STENCIL_OP frontStencilFailOp,
146 D3D12_STENCIL_OP frontStencilDepthFailOp,
147 D3D12_STENCIL_OP frontStencilPassOp,
148 D3D12_COMPARISON_FUNC frontStencilFunc,
149 D3D12_STENCIL_OP backStencilFailOp,
150 D3D12_STENCIL_OP backStencilDepthFailOp,
151 D3D12_STENCIL_OP backStencilPassOp,
152 D3D12_COMPARISON_FUNC backStencilFunc)
154 DepthEnable = depthEnable;
155 DepthWriteMask = depthWriteMask;
156 DepthFunc = depthFunc;
157 StencilEnable = stencilEnable;
158 StencilReadMask = stencilReadMask;
159 StencilWriteMask = stencilWriteMask;
160 FrontFace.StencilFailOp = frontStencilFailOp;
161 FrontFace.StencilDepthFailOp = frontStencilDepthFailOp;
162 FrontFace.StencilPassOp = frontStencilPassOp;
163 FrontFace.StencilFunc = frontStencilFunc;
164 BackFace.StencilFailOp = backStencilFailOp;
165 BackFace.StencilDepthFailOp = backStencilDepthFailOp;
166 BackFace.StencilPassOp = backStencilPassOp;
167 BackFace.StencilFunc = backStencilFunc;
170 operator const D3D12_DEPTH_STENCIL_DESC&()
const {
return *
this; }
183 AlphaToCoverageEnable = FALSE;
184 IndependentBlendEnable = FALSE;
185 const D3D12_RENDER_TARGET_BLEND_DESC defaultRenderTargetBlendDesc =
196 D3D12_COLOR_WRITE_ENABLE_ALL,
198 for (UINT i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i)
199 RenderTarget[i] = defaultRenderTargetBlendDesc;
202 operator const D3D12_BLEND_DESC&()
const {
return *
this; }
211 D3D12_RASTERIZER_DESC(o)
215 FillMode = D3D12_FILL_MODE_SOLID;
216 CullMode = D3D12_CULL_MODE_BACK;
217 FrontCounterClockwise = FALSE;
218 DepthBias = D3D12_DEFAULT_DEPTH_BIAS;
219 DepthBiasClamp = D3D12_DEFAULT_DEPTH_BIAS_CLAMP;
220 SlopeScaledDepthBias = D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS;
221 DepthClipEnable = TRUE;
222 MultisampleEnable = FALSE;
223 AntialiasedLineEnable = FALSE;
224 ForcedSampleCount = 0;
225 ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
228 D3D12_FILL_MODE fillMode,
229 D3D12_CULL_MODE cullMode,
230 BOOL frontCounterClockwise,
232 FLOAT depthBiasClamp,
233 FLOAT slopeScaledDepthBias,
234 BOOL depthClipEnable,
235 BOOL multisampleEnable,
236 BOOL antialiasedLineEnable,
237 UINT forcedSampleCount,
238 D3D12_CONSERVATIVE_RASTERIZATION_MODE conservativeRaster)
242 FrontCounterClockwise = frontCounterClockwise;
243 DepthBias = depthBias;
244 DepthBiasClamp = depthBiasClamp;
245 SlopeScaledDepthBias = slopeScaledDepthBias;
246 DepthClipEnable = depthClipEnable;
247 MultisampleEnable = multisampleEnable;
248 AntialiasedLineEnable = antialiasedLineEnable;
249 ForcedSampleCount = forcedSampleCount;
250 ConservativeRaster = conservativeRaster;
253 operator const D3D12_RASTERIZER_DESC&()
const {
return *
this; }
262 D3D12_RESOURCE_ALLOCATION_INFO(o)
269 Alignment = alignment;
271 operator const D3D12_RESOURCE_ALLOCATION_INFO&()
const {
return *
this; }
280 D3D12_HEAP_PROPERTIES(o)
283 D3D12_CPU_PAGE_PROPERTY cpuPageProperty,
284 D3D12_MEMORY_POOL memoryPoolPreference,
285 UINT creationNodeMask = 1,
288 Type = D3D12_HEAP_TYPE_CUSTOM;
289 CPUPageProperty = cpuPageProperty;
290 MemoryPoolPreference = memoryPoolPreference;
291 CreationNodeMask = creationNodeMask;
292 VisibleNodeMask = nodeMask;
295 D3D12_HEAP_TYPE type,
296 UINT creationNodeMask = 1,
300 CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
301 MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
302 CreationNodeMask = creationNodeMask;
303 VisibleNodeMask = nodeMask;
305 operator const D3D12_HEAP_PROPERTIES&()
const {
return *
this; }
308 return Type == D3D12_HEAP_TYPE_UPLOAD ||
Type == D3D12_HEAP_TYPE_READBACK || (
Type == D3D12_HEAP_TYPE_CUSTOM && (CPUPageProperty == D3D12_CPU_PAGE_PROPERTY_WRITE_COMBINE || CPUPageProperty == D3D12_CPU_PAGE_PROPERTY_WRITE_BACK));
311 inline bool operator==(
const D3D12_HEAP_PROPERTIES& l,
const D3D12_HEAP_PROPERTIES& r)
313 return l.Type == r.Type && l.CPUPageProperty == r.CPUPageProperty &&
314 l.MemoryPoolPreference == r.MemoryPoolPreference &&
315 l.CreationNodeMask == r.CreationNodeMask &&
316 l.VisibleNodeMask == r.VisibleNodeMask;
318 inline bool operator!=(
const D3D12_HEAP_PROPERTIES& l,
const D3D12_HEAP_PROPERTIES& r)
333 D3D12_HEAP_PROPERTIES properties,
334 UINT64 alignment = 0,
335 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE)
338 Properties = properties;
339 Alignment = alignment;
344 D3D12_HEAP_TYPE type,
345 UINT64 alignment = 0,
346 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE)
350 Alignment = alignment;
355 D3D12_CPU_PAGE_PROPERTY cpuPageProperty,
356 D3D12_MEMORY_POOL memoryPoolPreference,
357 UINT64 alignment = 0,
358 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE)
362 Alignment = alignment;
366 const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
367 D3D12_HEAP_PROPERTIES properties,
368 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE)
370 SizeInBytes = resAllocInfo.SizeInBytes;
371 Properties = properties;
372 Alignment = resAllocInfo.Alignment;
376 const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
377 D3D12_HEAP_TYPE type,
378 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE)
380 SizeInBytes = resAllocInfo.SizeInBytes;
382 Alignment = resAllocInfo.Alignment;
386 const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
387 D3D12_CPU_PAGE_PROPERTY cpuPageProperty,
388 D3D12_MEMORY_POOL memoryPoolPreference,
389 D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE)
391 SizeInBytes = resAllocInfo.SizeInBytes;
393 Alignment = resAllocInfo.Alignment;
396 operator const D3D12_HEAP_DESC&()
const {
return *
this; }
402 inline bool operator==(
const D3D12_HEAP_DESC& l,
const D3D12_HEAP_DESC& r)
404 return l.SizeInBytes == r.SizeInBytes &&
405 l.Properties == r.Properties &&
406 l.Alignment == r.Alignment &&
409 inline bool operator!=(
const D3D12_HEAP_DESC& l,
const D3D12_HEAP_DESC& r)
424 const FLOAT color[4])
427 memcpy(Color, color,
sizeof(Color));
436 memcpy(&DepthStencil.Depth, &depth,
sizeof(depth));
437 DepthStencil.Stencil = stencil;
439 operator const D3D12_CLEAR_VALUE&()
const {
return *
this; }
457 operator const D3D12_RANGE&()
const {
return *
this; }
466 D3D12_TILED_RESOURCE_COORDINATE(o)
477 Subresource = subresource;
479 operator const D3D12_TILED_RESOURCE_COORDINATE&()
const {
return *
this; }
488 D3D12_TILE_REGION_SIZE(o)
503 operator const D3D12_TILE_REGION_SIZE&()
const {
return *
this; }
512 D3D12_SUBRESOURCE_TILING(o)
516 UINT16 heightInTiles,
518 UINT startTileIndexInOverallResource)
520 WidthInTiles = widthInTiles;
521 HeightInTiles = heightInTiles;
522 DepthInTiles = depthInTiles;
523 StartTileIndexInOverallResource = startTileIndexInOverallResource;
525 operator const D3D12_SUBRESOURCE_TILING&()
const {
return *
this; }
541 WidthInTexels = widthInTexels;
542 HeightInTexels = heightInTexels;
543 DepthInTexels = depthInTexels;
545 operator const D3D12_TILE_SHAPE&()
const {
return *
this; }
554 D3D12_RESOURCE_BARRIER(o)
557 _In_ ID3D12Resource* pResource,
558 D3D12_RESOURCE_STATES stateBefore,
559 D3D12_RESOURCE_STATES stateAfter,
560 UINT subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES,
561 D3D12_RESOURCE_BARRIER_FLAGS flags = D3D12_RESOURCE_BARRIER_FLAG_NONE)
564 ZeroMemory(&result,
sizeof(result));
565 D3D12_RESOURCE_BARRIER& barrier = result;
566 result.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
567 result.Flags = flags;
575 _In_ ID3D12Resource* pResourceBefore,
576 _In_ ID3D12Resource* pResourceAfter)
579 ZeroMemory(&result,
sizeof(result));
580 D3D12_RESOURCE_BARRIER& barrier = result;
581 result.Type = D3D12_RESOURCE_BARRIER_TYPE_ALIASING;
582 barrier.
Aliasing.pResourceBefore = pResourceBefore;
583 barrier.
Aliasing.pResourceAfter = pResourceAfter;
587 _In_ ID3D12Resource* pResource)
590 ZeroMemory(&result,
sizeof(result));
591 D3D12_RESOURCE_BARRIER& barrier = result;
592 result.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV;
593 barrier.
UAV.pResource = pResource;
596 operator const D3D12_RESOURCE_BARRIER&()
const {
return *
this; }
605 D3D12_PACKED_MIP_INFO(o)
608 UINT8 numStandardMips,
610 UINT numTilesForPackedMips,
611 UINT startTileIndexInOverallResource)
613 NumStandardMips = numStandardMips;
614 NumPackedMips = numPackedMips;
615 NumTilesForPackedMips = numTilesForPackedMips;
616 StartTileIndexInOverallResource = startTileIndexInOverallResource;
618 operator const D3D12_PACKED_MIP_INFO&()
const {
return *
this; }
627 D3D12_SUBRESOURCE_FOOTPRINT(o)
643 const D3D12_RESOURCE_DESC& resDesc,
646 Format = resDesc.Format;
647 Width = UINT(resDesc.Width);
648 Height = resDesc.Height;
649 Depth = (resDesc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? resDesc.DepthOrArraySize : 1);
652 operator const D3D12_SUBRESOURCE_FOOTPRINT&()
const {
return *
this; }
661 D3D12_TEXTURE_COPY_LOCATION(o)
667 Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
668 PlacedFootprint = Footprint;
673 Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
674 SubresourceIndex = Sub;
683 D3D12_DESCRIPTOR_RANGE(o)
686 D3D12_DESCRIPTOR_RANGE_TYPE rangeType,
688 UINT baseShaderRegister,
689 UINT registerSpace = 0,
690 UINT offsetInDescriptorsFromTableStart =
691 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND)
693 Init(rangeType, numDescriptors, baseShaderRegister, registerSpace, offsetInDescriptorsFromTableStart);
697 D3D12_DESCRIPTOR_RANGE_TYPE rangeType,
699 UINT baseShaderRegister,
700 UINT registerSpace = 0,
701 UINT offsetInDescriptorsFromTableStart =
702 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND)
704 Init(*
this, rangeType, numDescriptors, baseShaderRegister, registerSpace, offsetInDescriptorsFromTableStart);
708 _Out_ D3D12_DESCRIPTOR_RANGE& range,
709 D3D12_DESCRIPTOR_RANGE_TYPE rangeType,
711 UINT baseShaderRegister,
712 UINT registerSpace = 0,
713 UINT offsetInDescriptorsFromTableStart =
714 D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND)
716 range.RangeType = rangeType;
717 range.NumDescriptors = numDescriptors;
718 range.BaseShaderRegister = baseShaderRegister;
719 range.RegisterSpace = registerSpace;
720 range.OffsetInDescriptorsFromTableStart = offsetInDescriptorsFromTableStart;
729 D3D12_ROOT_DESCRIPTOR_TABLE(o)
732 UINT numDescriptorRanges,
733 _In_reads_opt_(numDescriptorRanges)
const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges)
735 Init(numDescriptorRanges, _pDescriptorRanges);
739 UINT numDescriptorRanges,
740 _In_reads_opt_(numDescriptorRanges)
const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges)
742 Init(*
this, numDescriptorRanges, _pDescriptorRanges);
746 _Out_ D3D12_ROOT_DESCRIPTOR_TABLE& rootDescriptorTable,
747 UINT numDescriptorRanges,
748 _In_reads_opt_(numDescriptorRanges)
const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges)
750 rootDescriptorTable.NumDescriptorRanges = numDescriptorRanges;
751 rootDescriptorTable.pDescriptorRanges = _pDescriptorRanges;
760 D3D12_ROOT_CONSTANTS(o)
765 UINT registerSpace = 0)
767 Init(num32BitValues, shaderRegister, registerSpace);
773 UINT registerSpace = 0)
775 Init(*
this, num32BitValues, shaderRegister, registerSpace);
779 _Out_ D3D12_ROOT_CONSTANTS& rootConstants,
782 UINT registerSpace = 0)
784 rootConstants.Num32BitValues = num32BitValues;
785 rootConstants.ShaderRegister = shaderRegister;
786 rootConstants.RegisterSpace = registerSpace;
795 D3D12_ROOT_DESCRIPTOR(o)
799 UINT registerSpace = 0)
801 Init(shaderRegister, registerSpace);
806 UINT registerSpace = 0)
808 Init(*
this, shaderRegister, registerSpace);
811 static inline void Init(_Out_ D3D12_ROOT_DESCRIPTOR& table, UINT shaderRegister, UINT registerSpace = 0)
813 table.ShaderRegister = shaderRegister;
814 table.RegisterSpace = registerSpace;
823 D3D12_ROOT_PARAMETER(o)
827 _Out_ D3D12_ROOT_PARAMETER& rootParam,
828 UINT numDescriptorRanges,
829 _In_reads_(numDescriptorRanges)
const D3D12_DESCRIPTOR_RANGE* pDescriptorRanges,
830 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
832 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
833 rootParam.ShaderVisibility = visibility;
838 _Out_ D3D12_ROOT_PARAMETER& rootParam,
841 UINT registerSpace = 0,
842 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
844 rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;
845 rootParam.ShaderVisibility = visibility;
850 _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_CBV;
856 rootParam.ShaderVisibility = visibility;
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_SRV;
867 rootParam.ShaderVisibility = visibility;
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_UAV;
878 rootParam.ShaderVisibility = visibility;
883 UINT numDescriptorRanges,
884 _In_reads_(numDescriptorRanges)
const D3D12_DESCRIPTOR_RANGE* pDescriptorRanges,
885 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
893 UINT registerSpace = 0,
894 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
896 InitAsConstants(*
this, num32BitValues, shaderRegister, registerSpace, visibility);
901 UINT registerSpace = 0,
902 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
909 UINT registerSpace = 0,
910 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
917 UINT registerSpace = 0,
918 D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL)
929 D3D12_STATIC_SAMPLER_DESC(o)
933 D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC,
934 D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
935 D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
936 D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
937 FLOAT mipLODBias = 0,
938 UINT maxAnisotropy = 16,
939 D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL,
940 D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE,
942 FLOAT maxLOD = D3D12_FLOAT32_MAX,
943 D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
944 UINT registerSpace = 0)
963 _Out_ D3D12_STATIC_SAMPLER_DESC& samplerDesc,
965 D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC,
966 D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
967 D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
968 D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
969 FLOAT mipLODBias = 0,
970 UINT maxAnisotropy = 16,
971 D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL,
972 D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE,
974 FLOAT maxLOD = D3D12_FLOAT32_MAX,
975 D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
976 UINT registerSpace = 0)
978 samplerDesc.ShaderRegister = shaderRegister;
979 samplerDesc.Filter = filter;
980 samplerDesc.AddressU = addressU;
981 samplerDesc.AddressV = addressV;
982 samplerDesc.AddressW = addressW;
983 samplerDesc.MipLODBias = mipLODBias;
984 samplerDesc.MaxAnisotropy = maxAnisotropy;
985 samplerDesc.ComparisonFunc = comparisonFunc;
986 samplerDesc.BorderColor = borderColor;
987 samplerDesc.MinLOD = minLOD;
988 samplerDesc.MaxLOD = maxLOD;
989 samplerDesc.ShaderVisibility = shaderVisibility;
990 samplerDesc.RegisterSpace = registerSpace;
994 D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC,
995 D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
996 D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
997 D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP,
998 FLOAT mipLODBias = 0,
999 UINT maxAnisotropy = 16,
1000 D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL,
1001 D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE,
1003 FLOAT maxLOD = D3D12_FLOAT32_MAX,
1004 D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,
1005 UINT registerSpace = 0)
1030 D3D12_ROOT_SIGNATURE_DESC(o)
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(numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags);
1043 Init(0, NULL, 0, NULL, D3D12_ROOT_SIGNATURE_FLAG_NONE);
1048 _In_reads_opt_(numParameters)
const D3D12_ROOT_PARAMETER* _pParameters,
1049 UINT numStaticSamplers = 0,
1050 _In_reads_opt_(numStaticSamplers)
const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = NULL,
1051 D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE)
1053 Init(*
this, numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags);
1057 _Out_ D3D12_ROOT_SIGNATURE_DESC& desc,
1059 _In_reads_opt_(numParameters)
const D3D12_ROOT_PARAMETER* _pParameters,
1060 UINT numStaticSamplers = 0,
1061 _In_reads_opt_(numStaticSamplers)
const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = NULL,
1062 D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE)
1064 desc.NumParameters = numParameters;
1065 desc.pParameters = _pParameters;
1066 desc.NumStaticSamplers = numStaticSamplers;
1067 desc.pStaticSamplers = _pStaticSamplers;
1077 D3D12_CPU_DESCRIPTOR_HANDLE(o)
1086 InitOffsetted(other, offsetInDescriptors, descriptorIncrementSize);
1090 ptr += offsetInDescriptors * descriptorIncrementSize;
1095 ptr += offsetScaledByIncrementSize;
1100 return (ptr == other.ptr);
1104 return (ptr != other.ptr);
1112 inline void InitOffsetted(_In_
const D3D12_CPU_DESCRIPTOR_HANDLE& base, INT offsetScaledByIncrementSize)
1117 inline void InitOffsetted(_In_
const D3D12_CPU_DESCRIPTOR_HANDLE& base, INT offsetInDescriptors, UINT descriptorIncrementSize)
1119 InitOffsetted(*
this, base, offsetInDescriptors, descriptorIncrementSize);
1122 static inline void InitOffsetted(_Out_ D3D12_CPU_DESCRIPTOR_HANDLE& handle, _In_
const D3D12_CPU_DESCRIPTOR_HANDLE& base, INT offsetScaledByIncrementSize)
1124 handle.ptr = base.ptr + offsetScaledByIncrementSize;
1127 static inline void InitOffsetted(_Out_ D3D12_CPU_DESCRIPTOR_HANDLE& handle, _In_
const D3D12_CPU_DESCRIPTOR_HANDLE& base, INT offsetInDescriptors, UINT descriptorIncrementSize)
1129 handle.ptr = base.ptr + offsetInDescriptors * descriptorIncrementSize;
1138 D3D12_GPU_DESCRIPTOR_HANDLE(o)
1147 InitOffsetted(other, offsetInDescriptors, descriptorIncrementSize);
1151 ptr += offsetInDescriptors * descriptorIncrementSize;
1156 ptr += offsetScaledByIncrementSize;
1159 inline bool operator==(_In_
const D3D12_GPU_DESCRIPTOR_HANDLE& other)
1161 return (ptr == other.ptr);
1163 inline bool operator!=(_In_
const D3D12_GPU_DESCRIPTOR_HANDLE& other)
1165 return (ptr != other.ptr);
1173 inline void InitOffsetted(_In_
const D3D12_GPU_DESCRIPTOR_HANDLE& base, INT offsetScaledByIncrementSize)
1178 inline void InitOffsetted(_In_
const D3D12_GPU_DESCRIPTOR_HANDLE& base, INT offsetInDescriptors, UINT descriptorIncrementSize)
1180 InitOffsetted(*
this, base, offsetInDescriptors, descriptorIncrementSize);
1183 static inline void InitOffsetted(_Out_ D3D12_GPU_DESCRIPTOR_HANDLE& handle, _In_
const D3D12_GPU_DESCRIPTOR_HANDLE& base, INT offsetScaledByIncrementSize)
1185 handle.ptr = base.ptr + offsetScaledByIncrementSize;
1188 static inline void InitOffsetted(_Out_ D3D12_GPU_DESCRIPTOR_HANDLE& handle, _In_
const D3D12_GPU_DESCRIPTOR_HANDLE& base, INT offsetInDescriptors, UINT descriptorIncrementSize)
1190 handle.ptr = base.ptr + offsetInDescriptors * descriptorIncrementSize;
1197 return MipSlice + ArraySlice * MipLevels + PlaneSlice * MipLevels * ArraySize;
1201 template <
typename T,
typename U,
typename V>
1202 inline void D3D12DecomposeSubresource(UINT Subresource, UINT MipLevels, UINT ArraySize, _Out_ T& MipSlice, _Out_ U& ArraySlice, _Out_ V& PlaneSlice)
1204 MipSlice =
static_cast<T
>(Subresource % MipLevels);
1205 ArraySlice =
static_cast<U
>((Subresource / MipLevels) % ArraySize);
1206 PlaneSlice =
static_cast<V
>(Subresource / (MipLevels * ArraySize));
1211 _In_ ID3D12Device* pDevice,
1214 D3D12_FEATURE_DATA_FORMAT_INFO formatInfo = {Format};
1215 if (FAILED(pDevice->CheckFeatureSupport(D3D12_FEATURE_FORMAT_INFO, &formatInfo,
sizeof(formatInfo))))
1219 return formatInfo.PlaneCount;
1228 D3D12_RESOURCE_DESC(o)
1231 D3D12_RESOURCE_DIMENSION dimension,
1235 UINT16 depthOrArraySize,
1240 D3D12_TEXTURE_LAYOUT layout,
1241 D3D12_RESOURCE_FLAGS flags)
1243 Dimension = dimension;
1244 Alignment = alignment;
1247 DepthOrArraySize = depthOrArraySize;
1248 MipLevels = mipLevels;
1256 const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo,
1257 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE)
1259 return CD3DX12_RESOURCE_DESC(D3D12_RESOURCE_DIMENSION_BUFFER, resAllocInfo.Alignment, resAllocInfo.SizeInBytes,
1260 1, 1, 1, DXGI_FORMAT_UNKNOWN, 1, 0, D3D12_TEXTURE_LAYOUT_ROW_MAJOR, flags);
1264 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
1265 UINT64 alignment = 0)
1268 DXGI_FORMAT_UNKNOWN, 1, 0, D3D12_TEXTURE_LAYOUT_ROW_MAJOR, flags);
1273 UINT16 arraySize = 1,
1274 UINT16 mipLevels = 0,
1275 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
1276 D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN,
1277 UINT64 alignment = 0)
1280 mipLevels, format, 1, 0, layout, flags);
1286 UINT16 arraySize = 1,
1287 UINT16 mipLevels = 0,
1288 UINT sampleCount = 1,
1289 UINT sampleQuality = 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_TEXTURE2D, alignment, width, height, arraySize,
1295 mipLevels, format, sampleCount, sampleQuality, layout, flags);
1302 UINT16 mipLevels = 0,
1303 D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE,
1304 D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN,
1305 UINT64 alignment = 0)
1308 mipLevels, format, 1, 0, layout, flags);
1312 return (Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1);
1316 return (Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1);
1330 operator const D3D12_RESOURCE_DESC&()
const {
return *
this; }
1332 inline bool operator==(
const D3D12_RESOURCE_DESC& l,
const D3D12_RESOURCE_DESC& r)
1334 return l.Dimension == r.Dimension &&
1335 l.Alignment == r.Alignment &&
1336 l.Width == r.Width &&
1337 l.Height == r.Height &&
1338 l.DepthOrArraySize == r.DepthOrArraySize &&
1339 l.MipLevels == r.MipLevels &&
1340 l.Format == r.Format &&
1341 l.SampleDesc.Count == r.SampleDesc.Count &&
1342 l.SampleDesc.Quality == r.SampleDesc.Quality &&
1343 l.Layout == r.Layout &&
1346 inline bool operator!=(
const D3D12_RESOURCE_DESC& l,
const D3D12_RESOURCE_DESC& r)
1354 _In_
const D3D12_MEMCPY_DEST* pDest,
1355 _In_
const D3D12_SUBRESOURCE_DATA* pSrc,
1356 SIZE_T RowSizeInBytes,
1360 for (UINT z = 0; z < NumSlices; ++z)
1362 BYTE* pDestSlice =
reinterpret_cast<BYTE*
>(pDest->pData) + pDest->SlicePitch * z;
1363 const BYTE* pSrcSlice =
reinterpret_cast<const BYTE*
>(pSrc->pData) + pSrc->SlicePitch * z;
1364 for (UINT y = 0; y < NumRows; ++y)
1366 memcpy(pDestSlice + pDest->RowPitch * y,
1367 pSrcSlice + pSrc->RowPitch * y,
1376 _In_ ID3D12Resource* pDestinationResource,
1377 _In_range_(0, D3D12_REQ_SUBRESOURCES) UINT FirstSubresource,
1378 _In_range_(0, D3D12_REQ_SUBRESOURCES - FirstSubresource) UINT NumSubresources)
1380 D3D12_RESOURCE_DESC Desc = pDestinationResource->GetDesc();
1381 UINT64 RequiredSize = 0;
1383 ID3D12Device* pDevice;
1384 pDestinationResource->GetDevice(__uuidof(*pDevice),
reinterpret_cast<void**
>(&pDevice));
1385 pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, 0,
nullptr,
nullptr,
nullptr, &RequiredSize);
1388 return RequiredSize;
1394 _In_ ID3D12GraphicsCommandList* pCmdList,
1395 _In_ ID3D12Resource* pDestinationResource,
1396 _In_ ID3D12Resource* pIntermediate,
1397 _In_range_(0, D3D12_REQ_SUBRESOURCES) UINT FirstSubresource,
1398 _In_range_(0, D3D12_REQ_SUBRESOURCES - FirstSubresource) UINT NumSubresources,
1399 UINT64 RequiredSize,
1400 _In_reads_(NumSubresources)
const D3D12_PLACED_SUBRESOURCE_FOOTPRINT* pLayouts,
1401 _In_reads_(NumSubresources)
const UINT* pNumRows,
1402 _In_reads_(NumSubresources)
const UINT64* pRowSizesInBytes,
1403 _In_reads_(NumSubresources)
const D3D12_SUBRESOURCE_DATA* pSrcData)
1406 D3D12_RESOURCE_DESC IntermediateDesc = pIntermediate->GetDesc();
1407 D3D12_RESOURCE_DESC DestinationDesc = pDestinationResource->GetDesc();
1408 if (IntermediateDesc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER ||
1409 IntermediateDesc.Width < RequiredSize + pLayouts[0].Offset ||
1410 RequiredSize > (SIZE_T)-1 ||
1411 (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER &&
1412 (FirstSubresource != 0 || NumSubresources != 1)))
1418 HRESULT hr = pIntermediate->Map(0, NULL,
reinterpret_cast<void**
>(&pData));
1424 for (UINT i = 0; i < NumSubresources; ++i)
1426 if (pRowSizesInBytes[i] > (SIZE_T)-1)
return 0;
1427 D3D12_MEMCPY_DEST DestData = {pData + pLayouts[i].Offset, pLayouts[i].Footprint.RowPitch, pLayouts[i].Footprint.RowPitch * pNumRows[i]};
1428 MemcpySubresource(&DestData, &pSrcData[i], (SIZE_T)pRowSizesInBytes[i], pNumRows[i], pLayouts[i].Footprint.Depth);
1430 pIntermediate->Unmap(0, NULL);
1432 if (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER)
1434 CD3DX12_BOX SrcBox(UINT(pLayouts[0].Offset), UINT(pLayouts[0].Offset + pLayouts[0].Footprint.Width));
1435 pCmdList->CopyBufferRegion(
1436 pDestinationResource, 0, pIntermediate, pLayouts[0].Offset, pLayouts[0].Footprint.Width);
1440 for (UINT i = 0; i < NumSubresources; ++i)
1444 pCmdList->CopyTextureRegion(&Dst, 0, 0, 0, &Src,
nullptr);
1447 return RequiredSize;
1453 _In_ ID3D12GraphicsCommandList* pCmdList,
1454 _In_ ID3D12Resource* pDestinationResource,
1455 _In_ ID3D12Resource* pIntermediate,
1456 UINT64 IntermediateOffset,
1457 _In_range_(0, D3D12_REQ_SUBRESOURCES) UINT FirstSubresource,
1458 _In_range_(0, D3D12_REQ_SUBRESOURCES - FirstSubresource) UINT NumSubresources,
1459 _In_reads_(NumSubresources) D3D12_SUBRESOURCE_DATA* pSrcData)
1461 UINT64 RequiredSize = 0;
1462 UINT64 MemToAlloc =
static_cast<UINT64
>(
sizeof(D3D12_PLACED_SUBRESOURCE_FOOTPRINT) +
sizeof(UINT) +
sizeof(UINT64)) * NumSubresources;
1463 if (MemToAlloc > SIZE_MAX)
1467 void* pMem = HeapAlloc(GetProcessHeap(), 0,
static_cast<SIZE_T
>(MemToAlloc));
1472 D3D12_PLACED_SUBRESOURCE_FOOTPRINT* pLayouts =
reinterpret_cast<D3D12_PLACED_SUBRESOURCE_FOOTPRINT*
>(pMem);
1473 UINT64* pRowSizesInBytes =
reinterpret_cast<UINT64*
>(pLayouts + NumSubresources);
1474 UINT* pNumRows =
reinterpret_cast<UINT*
>(pRowSizesInBytes + NumSubresources);
1476 D3D12_RESOURCE_DESC Desc = pDestinationResource->GetDesc();
1477 ID3D12Device* pDevice;
1478 pDestinationResource->GetDevice(__uuidof(*pDevice),
reinterpret_cast<void**
>(&pDevice));
1479 pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, IntermediateOffset, pLayouts, pNumRows, pRowSizesInBytes, &RequiredSize);
1482 UINT64 Result =
UpdateSubresources(pCmdList, pDestinationResource, pIntermediate, FirstSubresource, NumSubresources, RequiredSize, pLayouts, pNumRows, pRowSizesInBytes, pSrcData);
1483 HeapFree(GetProcessHeap(), 0, pMem);
1489 template <UINT MaxSubresources>
1491 _In_ ID3D12GraphicsCommandList* pCmdList,
1492 _In_ ID3D12Resource* pDestinationResource,
1493 _In_ ID3D12Resource* pIntermediate,
1494 UINT64 IntermediateOffset,
1495 _In_range_(0, MaxSubresources) UINT FirstSubresource,
1496 _In_range_(1, MaxSubresources - FirstSubresource) UINT NumSubresources,
1497 _In_reads_(NumSubresources) D3D12_SUBRESOURCE_DATA* pSrcData)
1499 UINT64 RequiredSize = 0;
1500 D3D12_PLACED_SUBRESOURCE_FOOTPRINT Layouts[MaxSubresources];
1501 UINT NumRows[MaxSubresources];
1502 UINT64 RowSizesInBytes[MaxSubresources];
1504 D3D12_RESOURCE_DESC Desc = pDestinationResource->GetDesc();
1505 ID3D12Device* pDevice;
1506 pDestinationResource->GetDevice(__uuidof(*pDevice),
reinterpret_cast<void**
>(&pDevice));
1507 pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, IntermediateOffset, Layouts, NumRows, RowSizesInBytes, &RequiredSize);
1510 return UpdateSubresources(pCmdList, pDestinationResource, pIntermediate, FirstSubresource, NumSubresources, RequiredSize, Layouts, NumRows, RowSizesInBytes, pSrcData);
1516 return Layout == D3D12_TEXTURE_LAYOUT_UNKNOWN || Layout == D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE;
1526 return reinterpret_cast<ID3D12CommandList* const*
>(pp);
1530 #endif // defined( __cplusplus )
1532 #endif //__D3DX12_H__