Path: blob/master/thirdparty/directx_headers/include/directx/d3dx12_root_signature.h
9906 views
//*********************************************************1//2// Copyright (c) Microsoft Corporation.3// Licensed under the MIT License (MIT).4//5//*********************************************************67#pragma once89#ifndef __cplusplus10#error D3DX12 requires C++11#endif1213#include "d3d12.h"14#include "d3dx12_default.h"1516//------------------------------------------------------------------------------------------------17struct CD3DX12_DESCRIPTOR_RANGE : public D3D12_DESCRIPTOR_RANGE18{19CD3DX12_DESCRIPTOR_RANGE() = default;20explicit CD3DX12_DESCRIPTOR_RANGE(const D3D12_DESCRIPTOR_RANGE &o) noexcept :21D3D12_DESCRIPTOR_RANGE(o)22{}23CD3DX12_DESCRIPTOR_RANGE(24D3D12_DESCRIPTOR_RANGE_TYPE rangeType,25UINT numDescriptors,26UINT baseShaderRegister,27UINT registerSpace = 0,28UINT offsetInDescriptorsFromTableStart =29D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) noexcept30{31Init(rangeType, numDescriptors, baseShaderRegister, registerSpace, offsetInDescriptorsFromTableStart);32}3334inline void Init(35D3D12_DESCRIPTOR_RANGE_TYPE rangeType,36UINT numDescriptors,37UINT baseShaderRegister,38UINT registerSpace = 0,39UINT offsetInDescriptorsFromTableStart =40D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) noexcept41{42Init(*this, rangeType, numDescriptors, baseShaderRegister, registerSpace, offsetInDescriptorsFromTableStart);43}4445static inline void Init(46_Out_ D3D12_DESCRIPTOR_RANGE &range,47D3D12_DESCRIPTOR_RANGE_TYPE rangeType,48UINT numDescriptors,49UINT baseShaderRegister,50UINT registerSpace = 0,51UINT offsetInDescriptorsFromTableStart =52D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) noexcept53{54range.RangeType = rangeType;55range.NumDescriptors = numDescriptors;56range.BaseShaderRegister = baseShaderRegister;57range.RegisterSpace = registerSpace;58range.OffsetInDescriptorsFromTableStart = offsetInDescriptorsFromTableStart;59}60};6162//------------------------------------------------------------------------------------------------63struct CD3DX12_ROOT_DESCRIPTOR_TABLE : public D3D12_ROOT_DESCRIPTOR_TABLE64{65CD3DX12_ROOT_DESCRIPTOR_TABLE() = default;66explicit CD3DX12_ROOT_DESCRIPTOR_TABLE(const D3D12_ROOT_DESCRIPTOR_TABLE &o) noexcept :67D3D12_ROOT_DESCRIPTOR_TABLE(o)68{}69CD3DX12_ROOT_DESCRIPTOR_TABLE(70UINT numDescriptorRanges,71_In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges) noexcept72{73Init(numDescriptorRanges, _pDescriptorRanges);74}7576inline void Init(77UINT numDescriptorRanges,78_In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges) noexcept79{80Init(*this, numDescriptorRanges, _pDescriptorRanges);81}8283static inline void Init(84_Out_ D3D12_ROOT_DESCRIPTOR_TABLE &rootDescriptorTable,85UINT numDescriptorRanges,86_In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges) noexcept87{88rootDescriptorTable.NumDescriptorRanges = numDescriptorRanges;89rootDescriptorTable.pDescriptorRanges = _pDescriptorRanges;90}91};9293//------------------------------------------------------------------------------------------------94struct CD3DX12_ROOT_CONSTANTS : public D3D12_ROOT_CONSTANTS95{96CD3DX12_ROOT_CONSTANTS() = default;97explicit CD3DX12_ROOT_CONSTANTS(const D3D12_ROOT_CONSTANTS &o) noexcept :98D3D12_ROOT_CONSTANTS(o)99{}100CD3DX12_ROOT_CONSTANTS(101UINT num32BitValues,102UINT shaderRegister,103UINT registerSpace = 0) noexcept104{105Init(num32BitValues, shaderRegister, registerSpace);106}107108inline void Init(109UINT num32BitValues,110UINT shaderRegister,111UINT registerSpace = 0) noexcept112{113Init(*this, num32BitValues, shaderRegister, registerSpace);114}115116static inline void Init(117_Out_ D3D12_ROOT_CONSTANTS &rootConstants,118UINT num32BitValues,119UINT shaderRegister,120UINT registerSpace = 0) noexcept121{122rootConstants.Num32BitValues = num32BitValues;123rootConstants.ShaderRegister = shaderRegister;124rootConstants.RegisterSpace = registerSpace;125}126};127128//------------------------------------------------------------------------------------------------129struct CD3DX12_ROOT_DESCRIPTOR : public D3D12_ROOT_DESCRIPTOR130{131CD3DX12_ROOT_DESCRIPTOR() = default;132explicit CD3DX12_ROOT_DESCRIPTOR(const D3D12_ROOT_DESCRIPTOR &o) noexcept :133D3D12_ROOT_DESCRIPTOR(o)134{}135CD3DX12_ROOT_DESCRIPTOR(136UINT shaderRegister,137UINT registerSpace = 0) noexcept138{139Init(shaderRegister, registerSpace);140}141142inline void Init(143UINT shaderRegister,144UINT registerSpace = 0) noexcept145{146Init(*this, shaderRegister, registerSpace);147}148149static inline void Init(_Out_ D3D12_ROOT_DESCRIPTOR &table, UINT shaderRegister, UINT registerSpace = 0) noexcept150{151table.ShaderRegister = shaderRegister;152table.RegisterSpace = registerSpace;153}154};155156//------------------------------------------------------------------------------------------------157struct CD3DX12_ROOT_PARAMETER : public D3D12_ROOT_PARAMETER158{159CD3DX12_ROOT_PARAMETER() = default;160explicit CD3DX12_ROOT_PARAMETER(const D3D12_ROOT_PARAMETER &o) noexcept :161D3D12_ROOT_PARAMETER(o)162{}163164static inline void InitAsDescriptorTable(165_Out_ D3D12_ROOT_PARAMETER &rootParam,166UINT numDescriptorRanges,167_In_reads_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* pDescriptorRanges,168D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept169{170rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;171rootParam.ShaderVisibility = visibility;172CD3DX12_ROOT_DESCRIPTOR_TABLE::Init(rootParam.DescriptorTable, numDescriptorRanges, pDescriptorRanges);173}174175static inline void InitAsConstants(176_Out_ D3D12_ROOT_PARAMETER &rootParam,177UINT num32BitValues,178UINT shaderRegister,179UINT registerSpace = 0,180D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept181{182rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;183rootParam.ShaderVisibility = visibility;184CD3DX12_ROOT_CONSTANTS::Init(rootParam.Constants, num32BitValues, shaderRegister, registerSpace);185}186187static inline void InitAsConstantBufferView(188_Out_ D3D12_ROOT_PARAMETER &rootParam,189UINT shaderRegister,190UINT registerSpace = 0,191D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept192{193rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;194rootParam.ShaderVisibility = visibility;195CD3DX12_ROOT_DESCRIPTOR::Init(rootParam.Descriptor, shaderRegister, registerSpace);196}197198static inline void InitAsShaderResourceView(199_Out_ D3D12_ROOT_PARAMETER &rootParam,200UINT shaderRegister,201UINT registerSpace = 0,202D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept203{204rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_SRV;205rootParam.ShaderVisibility = visibility;206CD3DX12_ROOT_DESCRIPTOR::Init(rootParam.Descriptor, shaderRegister, registerSpace);207}208209static inline void InitAsUnorderedAccessView(210_Out_ D3D12_ROOT_PARAMETER &rootParam,211UINT shaderRegister,212UINT registerSpace = 0,213D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept214{215rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV;216rootParam.ShaderVisibility = visibility;217CD3DX12_ROOT_DESCRIPTOR::Init(rootParam.Descriptor, shaderRegister, registerSpace);218}219220inline void InitAsDescriptorTable(221UINT numDescriptorRanges,222_In_reads_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* pDescriptorRanges,223D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept224{225InitAsDescriptorTable(*this, numDescriptorRanges, pDescriptorRanges, visibility);226}227228inline void InitAsConstants(229UINT num32BitValues,230UINT shaderRegister,231UINT registerSpace = 0,232D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept233{234InitAsConstants(*this, num32BitValues, shaderRegister, registerSpace, visibility);235}236237inline void InitAsConstantBufferView(238UINT shaderRegister,239UINT registerSpace = 0,240D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept241{242InitAsConstantBufferView(*this, shaderRegister, registerSpace, visibility);243}244245inline void InitAsShaderResourceView(246UINT shaderRegister,247UINT registerSpace = 0,248D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept249{250InitAsShaderResourceView(*this, shaderRegister, registerSpace, visibility);251}252253inline void InitAsUnorderedAccessView(254UINT shaderRegister,255UINT registerSpace = 0,256D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept257{258InitAsUnorderedAccessView(*this, shaderRegister, registerSpace, visibility);259}260};261262//------------------------------------------------------------------------------------------------263struct CD3DX12_STATIC_SAMPLER_DESC : public D3D12_STATIC_SAMPLER_DESC264{265CD3DX12_STATIC_SAMPLER_DESC() = default;266explicit CD3DX12_STATIC_SAMPLER_DESC(const D3D12_STATIC_SAMPLER_DESC &o) noexcept :267D3D12_STATIC_SAMPLER_DESC(o)268{}269CD3DX12_STATIC_SAMPLER_DESC(270UINT shaderRegister,271D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC,272D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP,273D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP,274D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP,275FLOAT mipLODBias = 0,276UINT maxAnisotropy = 16,277D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL,278D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE,279FLOAT minLOD = 0.f,280FLOAT maxLOD = D3D12_FLOAT32_MAX,281D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,282UINT registerSpace = 0) noexcept283{284Init(285shaderRegister,286filter,287addressU,288addressV,289addressW,290mipLODBias,291maxAnisotropy,292comparisonFunc,293borderColor,294minLOD,295maxLOD,296shaderVisibility,297registerSpace);298}299300static inline void Init(301_Out_ D3D12_STATIC_SAMPLER_DESC &samplerDesc,302UINT shaderRegister,303D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC,304D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP,305D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP,306D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP,307FLOAT mipLODBias = 0,308UINT maxAnisotropy = 16,309D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL,310D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE,311FLOAT minLOD = 0.f,312FLOAT maxLOD = D3D12_FLOAT32_MAX,313D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,314UINT registerSpace = 0) noexcept315{316samplerDesc.ShaderRegister = shaderRegister;317samplerDesc.Filter = filter;318samplerDesc.AddressU = addressU;319samplerDesc.AddressV = addressV;320samplerDesc.AddressW = addressW;321samplerDesc.MipLODBias = mipLODBias;322samplerDesc.MaxAnisotropy = maxAnisotropy;323samplerDesc.ComparisonFunc = comparisonFunc;324samplerDesc.BorderColor = borderColor;325samplerDesc.MinLOD = minLOD;326samplerDesc.MaxLOD = maxLOD;327samplerDesc.ShaderVisibility = shaderVisibility;328samplerDesc.RegisterSpace = registerSpace;329}330inline void Init(331UINT shaderRegister,332D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC,333D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP,334D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP,335D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP,336FLOAT mipLODBias = 0,337UINT maxAnisotropy = 16,338D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL,339D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE,340FLOAT minLOD = 0.f,341FLOAT maxLOD = D3D12_FLOAT32_MAX,342D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,343UINT registerSpace = 0) noexcept344{345Init(346*this,347shaderRegister,348filter,349addressU,350addressV,351addressW,352mipLODBias,353maxAnisotropy,354comparisonFunc,355borderColor,356minLOD,357maxLOD,358shaderVisibility,359registerSpace);360}361};362363//------------------------------------------------------------------------------------------------364#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)365struct CD3DX12_STATIC_SAMPLER_DESC1 : public D3D12_STATIC_SAMPLER_DESC1366{367CD3DX12_STATIC_SAMPLER_DESC1() = default;368explicit CD3DX12_STATIC_SAMPLER_DESC1(const D3D12_STATIC_SAMPLER_DESC &o) noexcept369{370memcpy(this, &o, sizeof(D3D12_STATIC_SAMPLER_DESC));371Flags = D3D12_SAMPLER_FLAGS::D3D12_SAMPLER_FLAG_NONE;372}373explicit CD3DX12_STATIC_SAMPLER_DESC1(const D3D12_STATIC_SAMPLER_DESC1 & o) noexcept :374D3D12_STATIC_SAMPLER_DESC1(o)375{}376CD3DX12_STATIC_SAMPLER_DESC1(377UINT shaderRegister,378D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC,379D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP,380D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP,381D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP,382FLOAT mipLODBias = 0,383UINT maxAnisotropy = 16,384D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL,385D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE,386FLOAT minLOD = 0.f,387FLOAT maxLOD = D3D12_FLOAT32_MAX,388D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,389UINT registerSpace = 0,390D3D12_SAMPLER_FLAGS flags = D3D12_SAMPLER_FLAGS::D3D12_SAMPLER_FLAG_NONE) noexcept391{392Init(393shaderRegister,394filter,395addressU,396addressV,397addressW,398mipLODBias,399maxAnisotropy,400comparisonFunc,401borderColor,402minLOD,403maxLOD,404shaderVisibility,405registerSpace,406flags);407}408409static inline void Init(410_Out_ D3D12_STATIC_SAMPLER_DESC1 &samplerDesc,411UINT shaderRegister,412D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC,413D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP,414D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP,415D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP,416FLOAT mipLODBias = 0,417UINT maxAnisotropy = 16,418D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL,419D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE,420FLOAT minLOD = 0.f,421FLOAT maxLOD = D3D12_FLOAT32_MAX,422D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,423UINT registerSpace = 0,424D3D12_SAMPLER_FLAGS flags = D3D12_SAMPLER_FLAGS::D3D12_SAMPLER_FLAG_NONE) noexcept425{426samplerDesc.ShaderRegister = shaderRegister;427samplerDesc.Filter = filter;428samplerDesc.AddressU = addressU;429samplerDesc.AddressV = addressV;430samplerDesc.AddressW = addressW;431samplerDesc.MipLODBias = mipLODBias;432samplerDesc.MaxAnisotropy = maxAnisotropy;433samplerDesc.ComparisonFunc = comparisonFunc;434samplerDesc.BorderColor = borderColor;435samplerDesc.MinLOD = minLOD;436samplerDesc.MaxLOD = maxLOD;437samplerDesc.ShaderVisibility = shaderVisibility;438samplerDesc.RegisterSpace = registerSpace;439samplerDesc.Flags = flags;440}441inline void Init(442UINT shaderRegister,443D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC,444D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP,445D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP,446D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP,447FLOAT mipLODBias = 0,448UINT maxAnisotropy = 16,449D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL,450D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE,451FLOAT minLOD = 0.f,452FLOAT maxLOD = D3D12_FLOAT32_MAX,453D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL,454UINT registerSpace = 0,455D3D12_SAMPLER_FLAGS flags = D3D12_SAMPLER_FLAGS::D3D12_SAMPLER_FLAG_NONE) noexcept456{457Init(458*this,459shaderRegister,460filter,461addressU,462addressV,463addressW,464mipLODBias,465maxAnisotropy,466comparisonFunc,467borderColor,468minLOD,469maxLOD,470shaderVisibility,471registerSpace,472flags);473}474};475#endif // D3D12_SDK_VERSION >= 609476477//------------------------------------------------------------------------------------------------478struct CD3DX12_ROOT_SIGNATURE_DESC : public D3D12_ROOT_SIGNATURE_DESC479{480CD3DX12_ROOT_SIGNATURE_DESC() = default;481explicit CD3DX12_ROOT_SIGNATURE_DESC(const D3D12_ROOT_SIGNATURE_DESC &o) noexcept :482D3D12_ROOT_SIGNATURE_DESC(o)483{}484CD3DX12_ROOT_SIGNATURE_DESC(485UINT numParameters,486_In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters,487UINT numStaticSamplers = 0,488_In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr,489D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept490{491Init(numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags);492}493CD3DX12_ROOT_SIGNATURE_DESC(CD3DX12_DEFAULT) noexcept494{495Init(0, nullptr, 0, nullptr, D3D12_ROOT_SIGNATURE_FLAG_NONE);496}497498inline void Init(499UINT numParameters,500_In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters,501UINT numStaticSamplers = 0,502_In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr,503D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept504{505Init(*this, numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags);506}507508static inline void Init(509_Out_ D3D12_ROOT_SIGNATURE_DESC &desc,510UINT numParameters,511_In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters,512UINT numStaticSamplers = 0,513_In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr,514D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept515{516desc.NumParameters = numParameters;517desc.pParameters = _pParameters;518desc.NumStaticSamplers = numStaticSamplers;519desc.pStaticSamplers = _pStaticSamplers;520desc.Flags = flags;521}522};523524//------------------------------------------------------------------------------------------------525struct CD3DX12_DESCRIPTOR_RANGE1 : public D3D12_DESCRIPTOR_RANGE1526{527CD3DX12_DESCRIPTOR_RANGE1() = default;528explicit CD3DX12_DESCRIPTOR_RANGE1(const D3D12_DESCRIPTOR_RANGE1 &o) noexcept :529D3D12_DESCRIPTOR_RANGE1(o)530{}531CD3DX12_DESCRIPTOR_RANGE1(532D3D12_DESCRIPTOR_RANGE_TYPE rangeType,533UINT numDescriptors,534UINT baseShaderRegister,535UINT registerSpace = 0,536D3D12_DESCRIPTOR_RANGE_FLAGS flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE,537UINT offsetInDescriptorsFromTableStart =538D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) noexcept539{540Init(rangeType, numDescriptors, baseShaderRegister, registerSpace, flags, offsetInDescriptorsFromTableStart);541}542543inline void Init(544D3D12_DESCRIPTOR_RANGE_TYPE rangeType,545UINT numDescriptors,546UINT baseShaderRegister,547UINT registerSpace = 0,548D3D12_DESCRIPTOR_RANGE_FLAGS flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE,549UINT offsetInDescriptorsFromTableStart =550D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) noexcept551{552Init(*this, rangeType, numDescriptors, baseShaderRegister, registerSpace, flags, offsetInDescriptorsFromTableStart);553}554555static inline void Init(556_Out_ D3D12_DESCRIPTOR_RANGE1 &range,557D3D12_DESCRIPTOR_RANGE_TYPE rangeType,558UINT numDescriptors,559UINT baseShaderRegister,560UINT registerSpace = 0,561D3D12_DESCRIPTOR_RANGE_FLAGS flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE,562UINT offsetInDescriptorsFromTableStart =563D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) noexcept564{565range.RangeType = rangeType;566range.NumDescriptors = numDescriptors;567range.BaseShaderRegister = baseShaderRegister;568range.RegisterSpace = registerSpace;569range.Flags = flags;570range.OffsetInDescriptorsFromTableStart = offsetInDescriptorsFromTableStart;571}572};573574//------------------------------------------------------------------------------------------------575struct CD3DX12_ROOT_DESCRIPTOR_TABLE1 : public D3D12_ROOT_DESCRIPTOR_TABLE1576{577CD3DX12_ROOT_DESCRIPTOR_TABLE1() = default;578explicit CD3DX12_ROOT_DESCRIPTOR_TABLE1(const D3D12_ROOT_DESCRIPTOR_TABLE1 &o) noexcept :579D3D12_ROOT_DESCRIPTOR_TABLE1(o)580{}581CD3DX12_ROOT_DESCRIPTOR_TABLE1(582UINT numDescriptorRanges,583_In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE1* _pDescriptorRanges) noexcept584{585Init(numDescriptorRanges, _pDescriptorRanges);586}587588inline void Init(589UINT numDescriptorRanges,590_In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE1* _pDescriptorRanges) noexcept591{592Init(*this, numDescriptorRanges, _pDescriptorRanges);593}594595static inline void Init(596_Out_ D3D12_ROOT_DESCRIPTOR_TABLE1 &rootDescriptorTable,597UINT numDescriptorRanges,598_In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE1* _pDescriptorRanges) noexcept599{600rootDescriptorTable.NumDescriptorRanges = numDescriptorRanges;601rootDescriptorTable.pDescriptorRanges = _pDescriptorRanges;602}603};604605//------------------------------------------------------------------------------------------------606struct CD3DX12_ROOT_DESCRIPTOR1 : public D3D12_ROOT_DESCRIPTOR1607{608CD3DX12_ROOT_DESCRIPTOR1() = default;609explicit CD3DX12_ROOT_DESCRIPTOR1(const D3D12_ROOT_DESCRIPTOR1 &o) noexcept :610D3D12_ROOT_DESCRIPTOR1(o)611{}612CD3DX12_ROOT_DESCRIPTOR1(613UINT shaderRegister,614UINT registerSpace = 0,615D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE) noexcept616{617Init(shaderRegister, registerSpace, flags);618}619620inline void Init(621UINT shaderRegister,622UINT registerSpace = 0,623D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE) noexcept624{625Init(*this, shaderRegister, registerSpace, flags);626}627628static inline void Init(629_Out_ D3D12_ROOT_DESCRIPTOR1 &table,630UINT shaderRegister,631UINT registerSpace = 0,632D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE) noexcept633{634table.ShaderRegister = shaderRegister;635table.RegisterSpace = registerSpace;636table.Flags = flags;637}638};639640//------------------------------------------------------------------------------------------------641struct CD3DX12_ROOT_PARAMETER1 : public D3D12_ROOT_PARAMETER1642{643CD3DX12_ROOT_PARAMETER1() = default;644explicit CD3DX12_ROOT_PARAMETER1(const D3D12_ROOT_PARAMETER1 &o) noexcept :645D3D12_ROOT_PARAMETER1(o)646{}647648static inline void InitAsDescriptorTable(649_Out_ D3D12_ROOT_PARAMETER1 &rootParam,650UINT numDescriptorRanges,651_In_reads_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE1* pDescriptorRanges,652D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept653{654rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;655rootParam.ShaderVisibility = visibility;656CD3DX12_ROOT_DESCRIPTOR_TABLE1::Init(rootParam.DescriptorTable, numDescriptorRanges, pDescriptorRanges);657}658659static inline void InitAsConstants(660_Out_ D3D12_ROOT_PARAMETER1 &rootParam,661UINT num32BitValues,662UINT shaderRegister,663UINT registerSpace = 0,664D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept665{666rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;667rootParam.ShaderVisibility = visibility;668CD3DX12_ROOT_CONSTANTS::Init(rootParam.Constants, num32BitValues, shaderRegister, registerSpace);669}670671static inline void InitAsConstantBufferView(672_Out_ D3D12_ROOT_PARAMETER1 &rootParam,673UINT shaderRegister,674UINT registerSpace = 0,675D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE,676D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept677{678rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;679rootParam.ShaderVisibility = visibility;680CD3DX12_ROOT_DESCRIPTOR1::Init(rootParam.Descriptor, shaderRegister, registerSpace, flags);681}682683static inline void InitAsShaderResourceView(684_Out_ D3D12_ROOT_PARAMETER1 &rootParam,685UINT shaderRegister,686UINT registerSpace = 0,687D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE,688D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept689{690rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_SRV;691rootParam.ShaderVisibility = visibility;692CD3DX12_ROOT_DESCRIPTOR1::Init(rootParam.Descriptor, shaderRegister, registerSpace, flags);693}694695static inline void InitAsUnorderedAccessView(696_Out_ D3D12_ROOT_PARAMETER1 &rootParam,697UINT shaderRegister,698UINT registerSpace = 0,699D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE,700D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept701{702rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV;703rootParam.ShaderVisibility = visibility;704CD3DX12_ROOT_DESCRIPTOR1::Init(rootParam.Descriptor, shaderRegister, registerSpace, flags);705}706707inline void InitAsDescriptorTable(708UINT numDescriptorRanges,709_In_reads_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE1* pDescriptorRanges,710D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept711{712InitAsDescriptorTable(*this, numDescriptorRanges, pDescriptorRanges, visibility);713}714715inline void InitAsConstants(716UINT num32BitValues,717UINT shaderRegister,718UINT registerSpace = 0,719D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept720{721InitAsConstants(*this, num32BitValues, shaderRegister, registerSpace, visibility);722}723724inline void InitAsConstantBufferView(725UINT shaderRegister,726UINT registerSpace = 0,727D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE,728D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept729{730InitAsConstantBufferView(*this, shaderRegister, registerSpace, flags, visibility);731}732733inline void InitAsShaderResourceView(734UINT shaderRegister,735UINT registerSpace = 0,736D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE,737D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept738{739InitAsShaderResourceView(*this, shaderRegister, registerSpace, flags, visibility);740}741742inline void InitAsUnorderedAccessView(743UINT shaderRegister,744UINT registerSpace = 0,745D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE,746D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept747{748InitAsUnorderedAccessView(*this, shaderRegister, registerSpace, flags, visibility);749}750};751752//------------------------------------------------------------------------------------------------753struct CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC : public D3D12_VERSIONED_ROOT_SIGNATURE_DESC754{755CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC() = default;756explicit CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(const D3D12_VERSIONED_ROOT_SIGNATURE_DESC &o) noexcept :757D3D12_VERSIONED_ROOT_SIGNATURE_DESC(o)758{}759explicit CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(const D3D12_ROOT_SIGNATURE_DESC &o) noexcept760{761Version = D3D_ROOT_SIGNATURE_VERSION_1_0;762Desc_1_0 = o;763}764explicit CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(const D3D12_ROOT_SIGNATURE_DESC1 &o) noexcept765{766Version = D3D_ROOT_SIGNATURE_VERSION_1_1;767Desc_1_1 = o;768}769#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)770explicit CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(const D3D12_ROOT_SIGNATURE_DESC2& o) noexcept771{772Version = D3D_ROOT_SIGNATURE_VERSION_1_2;773Desc_1_2 = o;774}775#endif776CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(777UINT numParameters,778_In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters,779UINT numStaticSamplers = 0,780_In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr,781D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept782{783Init_1_0(numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags);784}785CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(786UINT numParameters,787_In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER1* _pParameters,788UINT numStaticSamplers = 0,789_In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr,790D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept791{792Init_1_1(numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags);793}794CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(CD3DX12_DEFAULT) noexcept795{796Init_1_1(0, nullptr, 0, nullptr, D3D12_ROOT_SIGNATURE_FLAG_NONE);797}798799inline void Init_1_0(800UINT numParameters,801_In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters,802UINT numStaticSamplers = 0,803_In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr,804D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept805{806Init_1_0(*this, numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags);807}808809static inline void Init_1_0(810_Out_ D3D12_VERSIONED_ROOT_SIGNATURE_DESC &desc,811UINT numParameters,812_In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters,813UINT numStaticSamplers = 0,814_In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr,815D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept816{817desc.Version = D3D_ROOT_SIGNATURE_VERSION_1_0;818desc.Desc_1_0.NumParameters = numParameters;819desc.Desc_1_0.pParameters = _pParameters;820desc.Desc_1_0.NumStaticSamplers = numStaticSamplers;821desc.Desc_1_0.pStaticSamplers = _pStaticSamplers;822desc.Desc_1_0.Flags = flags;823}824825inline void Init_1_1(826UINT numParameters,827_In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER1* _pParameters,828UINT numStaticSamplers = 0,829_In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr,830D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept831{832Init_1_1(*this, numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags);833}834835static inline void Init_1_1(836_Out_ D3D12_VERSIONED_ROOT_SIGNATURE_DESC &desc,837UINT numParameters,838_In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER1* _pParameters,839UINT numStaticSamplers = 0,840_In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr,841D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept842{843desc.Version = D3D_ROOT_SIGNATURE_VERSION_1_1;844desc.Desc_1_1.NumParameters = numParameters;845desc.Desc_1_1.pParameters = _pParameters;846desc.Desc_1_1.NumStaticSamplers = numStaticSamplers;847desc.Desc_1_1.pStaticSamplers = _pStaticSamplers;848desc.Desc_1_1.Flags = flags;849}850851#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)852static inline void Init_1_2(853_Out_ D3D12_VERSIONED_ROOT_SIGNATURE_DESC& desc,854UINT numParameters,855_In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER1* _pParameters,856UINT numStaticSamplers = 0,857_In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC1* _pStaticSamplers = nullptr,858D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept859{860desc.Version = D3D_ROOT_SIGNATURE_VERSION_1_2;861desc.Desc_1_2.NumParameters = numParameters;862desc.Desc_1_2.pParameters = _pParameters;863desc.Desc_1_2.NumStaticSamplers = numStaticSamplers;864desc.Desc_1_2.pStaticSamplers = _pStaticSamplers;865desc.Desc_1_2.Flags = flags;866}867#endif868};869870//------------------------------------------------------------------------------------------------871struct CD3DX12_CPU_DESCRIPTOR_HANDLE : public D3D12_CPU_DESCRIPTOR_HANDLE872{873CD3DX12_CPU_DESCRIPTOR_HANDLE() = default;874explicit CD3DX12_CPU_DESCRIPTOR_HANDLE(const D3D12_CPU_DESCRIPTOR_HANDLE &o) noexcept :875D3D12_CPU_DESCRIPTOR_HANDLE(o)876{}877CD3DX12_CPU_DESCRIPTOR_HANDLE(CD3DX12_DEFAULT) noexcept { ptr = 0; }878CD3DX12_CPU_DESCRIPTOR_HANDLE(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE &other, INT offsetScaledByIncrementSize) noexcept879{880InitOffsetted(other, offsetScaledByIncrementSize);881}882CD3DX12_CPU_DESCRIPTOR_HANDLE(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE &other, INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept883{884InitOffsetted(other, offsetInDescriptors, descriptorIncrementSize);885}886CD3DX12_CPU_DESCRIPTOR_HANDLE& Offset(INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept887{888ptr = SIZE_T(INT64(ptr) + INT64(offsetInDescriptors) * INT64(descriptorIncrementSize));889return *this;890}891CD3DX12_CPU_DESCRIPTOR_HANDLE& Offset(INT offsetScaledByIncrementSize) noexcept892{893ptr = SIZE_T(INT64(ptr) + INT64(offsetScaledByIncrementSize));894return *this;895}896bool operator==(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE& other) const noexcept897{898return (ptr == other.ptr);899}900bool operator!=(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE& other) const noexcept901{902return (ptr != other.ptr);903}904CD3DX12_CPU_DESCRIPTOR_HANDLE &operator=(const D3D12_CPU_DESCRIPTOR_HANDLE &other) noexcept905{906ptr = other.ptr;907return *this;908}909910inline void InitOffsetted(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE &base, INT offsetScaledByIncrementSize) noexcept911{912InitOffsetted(*this, base, offsetScaledByIncrementSize);913}914915inline void InitOffsetted(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE &base, INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept916{917InitOffsetted(*this, base, offsetInDescriptors, descriptorIncrementSize);918}919920static inline void InitOffsetted(_Out_ D3D12_CPU_DESCRIPTOR_HANDLE &handle, _In_ const D3D12_CPU_DESCRIPTOR_HANDLE &base, INT offsetScaledByIncrementSize) noexcept921{922handle.ptr = SIZE_T(INT64(base.ptr) + INT64(offsetScaledByIncrementSize));923}924925static inline void InitOffsetted(_Out_ D3D12_CPU_DESCRIPTOR_HANDLE &handle, _In_ const D3D12_CPU_DESCRIPTOR_HANDLE &base, INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept926{927handle.ptr = SIZE_T(INT64(base.ptr) + INT64(offsetInDescriptors) * INT64(descriptorIncrementSize));928}929};930931//------------------------------------------------------------------------------------------------932struct CD3DX12_GPU_DESCRIPTOR_HANDLE : public D3D12_GPU_DESCRIPTOR_HANDLE933{934CD3DX12_GPU_DESCRIPTOR_HANDLE() = default;935explicit CD3DX12_GPU_DESCRIPTOR_HANDLE(const D3D12_GPU_DESCRIPTOR_HANDLE &o) noexcept :936D3D12_GPU_DESCRIPTOR_HANDLE(o)937{}938CD3DX12_GPU_DESCRIPTOR_HANDLE(CD3DX12_DEFAULT) noexcept { ptr = 0; }939CD3DX12_GPU_DESCRIPTOR_HANDLE(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE &other, INT offsetScaledByIncrementSize) noexcept940{941InitOffsetted(other, offsetScaledByIncrementSize);942}943CD3DX12_GPU_DESCRIPTOR_HANDLE(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE &other, INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept944{945InitOffsetted(other, offsetInDescriptors, descriptorIncrementSize);946}947CD3DX12_GPU_DESCRIPTOR_HANDLE& Offset(INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept948{949ptr = UINT64(INT64(ptr) + INT64(offsetInDescriptors) * INT64(descriptorIncrementSize));950return *this;951}952CD3DX12_GPU_DESCRIPTOR_HANDLE& Offset(INT offsetScaledByIncrementSize) noexcept953{954ptr = UINT64(INT64(ptr) + INT64(offsetScaledByIncrementSize));955return *this;956}957inline bool operator==(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE& other) const noexcept958{959return (ptr == other.ptr);960}961inline bool operator!=(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE& other) const noexcept962{963return (ptr != other.ptr);964}965CD3DX12_GPU_DESCRIPTOR_HANDLE &operator=(const D3D12_GPU_DESCRIPTOR_HANDLE &other) noexcept966{967ptr = other.ptr;968return *this;969}970971inline void InitOffsetted(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE &base, INT offsetScaledByIncrementSize) noexcept972{973InitOffsetted(*this, base, offsetScaledByIncrementSize);974}975976inline void InitOffsetted(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE &base, INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept977{978InitOffsetted(*this, base, offsetInDescriptors, descriptorIncrementSize);979}980981static inline void InitOffsetted(_Out_ D3D12_GPU_DESCRIPTOR_HANDLE &handle, _In_ const D3D12_GPU_DESCRIPTOR_HANDLE &base, INT offsetScaledByIncrementSize) noexcept982{983handle.ptr = UINT64(INT64(base.ptr) + INT64(offsetScaledByIncrementSize));984}985986static inline void InitOffsetted(_Out_ D3D12_GPU_DESCRIPTOR_HANDLE &handle, _In_ const D3D12_GPU_DESCRIPTOR_HANDLE &base, INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept987{988handle.ptr = UINT64(INT64(base.ptr) + INT64(offsetInDescriptors) * INT64(descriptorIncrementSize));989}990};991992//------------------------------------------------------------------------------------------------993// D3D12 exports a new method for serializing root signatures in the Windows 10 Anniversary Update.994// To help enable root signature 1.1 features when they are available and not require maintaining995// two code paths for building root signatures, this helper method reconstructs a 1.0 signature when996// 1.1 is not supported.997inline HRESULT D3DX12SerializeVersionedRootSignature(998_In_ HMODULE pLibD3D12,999_In_ const D3D12_VERSIONED_ROOT_SIGNATURE_DESC* pRootSignatureDesc,1000D3D_ROOT_SIGNATURE_VERSION MaxVersion,1001_Outptr_ ID3DBlob** ppBlob,1002_Always_(_Outptr_opt_result_maybenull_) ID3DBlob** ppErrorBlob) noexcept1003{1004if (ppErrorBlob != nullptr)1005{1006*ppErrorBlob = nullptr;1007}10081009PFN_D3D12_SERIALIZE_ROOT_SIGNATURE d3d_D3D12SerializeRootSignature = (PFN_D3D12_SERIALIZE_ROOT_SIGNATURE)(void *)GetProcAddress(pLibD3D12, "D3D12SerializeRootSignature");1010if (d3d_D3D12SerializeRootSignature == nullptr) {1011return E_INVALIDARG;1012}1013PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE d3d_D3D12SerializeVersionedRootSignature = (PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE)(void *)GetProcAddress(pLibD3D12, "D3D12SerializeVersionedRootSignature");1014switch (MaxVersion)1015{1016case D3D_ROOT_SIGNATURE_VERSION_1_0:1017switch (pRootSignatureDesc->Version)1018{1019case D3D_ROOT_SIGNATURE_VERSION_1_0:1020return d3d_D3D12SerializeRootSignature(&pRootSignatureDesc->Desc_1_0, D3D_ROOT_SIGNATURE_VERSION_1, ppBlob, ppErrorBlob);10211022case D3D_ROOT_SIGNATURE_VERSION_1_1:1023#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)1024case D3D_ROOT_SIGNATURE_VERSION_1_2:1025#endif1026{1027HRESULT hr = S_OK;1028const D3D12_ROOT_SIGNATURE_DESC1& desc_1_1 = pRootSignatureDesc->Desc_1_1;10291030const SIZE_T ParametersSize = sizeof(D3D12_ROOT_PARAMETER) * desc_1_1.NumParameters;1031void* pParameters = (ParametersSize > 0) ? HeapAlloc(GetProcessHeap(), 0, ParametersSize) : nullptr;1032if (ParametersSize > 0 && pParameters == nullptr)1033{1034hr = E_OUTOFMEMORY;1035}1036auto pParameters_1_0 = static_cast<D3D12_ROOT_PARAMETER*>(pParameters);10371038if (SUCCEEDED(hr))1039{1040for (UINT n = 0; n < desc_1_1.NumParameters; n++)1041{1042__analysis_assume(ParametersSize == sizeof(D3D12_ROOT_PARAMETER) * desc_1_1.NumParameters);1043pParameters_1_0[n].ParameterType = desc_1_1.pParameters[n].ParameterType;1044pParameters_1_0[n].ShaderVisibility = desc_1_1.pParameters[n].ShaderVisibility;10451046switch (desc_1_1.pParameters[n].ParameterType)1047{1048case D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS:1049pParameters_1_0[n].Constants.Num32BitValues = desc_1_1.pParameters[n].Constants.Num32BitValues;1050pParameters_1_0[n].Constants.RegisterSpace = desc_1_1.pParameters[n].Constants.RegisterSpace;1051pParameters_1_0[n].Constants.ShaderRegister = desc_1_1.pParameters[n].Constants.ShaderRegister;1052break;10531054case D3D12_ROOT_PARAMETER_TYPE_CBV:1055case D3D12_ROOT_PARAMETER_TYPE_SRV:1056case D3D12_ROOT_PARAMETER_TYPE_UAV:1057pParameters_1_0[n].Descriptor.RegisterSpace = desc_1_1.pParameters[n].Descriptor.RegisterSpace;1058pParameters_1_0[n].Descriptor.ShaderRegister = desc_1_1.pParameters[n].Descriptor.ShaderRegister;1059break;10601061case D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE:1062const D3D12_ROOT_DESCRIPTOR_TABLE1& table_1_1 = desc_1_1.pParameters[n].DescriptorTable;10631064const SIZE_T DescriptorRangesSize = sizeof(D3D12_DESCRIPTOR_RANGE) * table_1_1.NumDescriptorRanges;1065void* pDescriptorRanges = (DescriptorRangesSize > 0 && SUCCEEDED(hr)) ? HeapAlloc(GetProcessHeap(), 0, DescriptorRangesSize) : nullptr;1066if (DescriptorRangesSize > 0 && pDescriptorRanges == nullptr)1067{1068hr = E_OUTOFMEMORY;1069}1070auto pDescriptorRanges_1_0 = static_cast<D3D12_DESCRIPTOR_RANGE*>(pDescriptorRanges);10711072if (SUCCEEDED(hr))1073{1074for (UINT x = 0; x < table_1_1.NumDescriptorRanges; x++)1075{1076__analysis_assume(DescriptorRangesSize == sizeof(D3D12_DESCRIPTOR_RANGE) * table_1_1.NumDescriptorRanges);1077pDescriptorRanges_1_0[x].BaseShaderRegister = table_1_1.pDescriptorRanges[x].BaseShaderRegister;1078pDescriptorRanges_1_0[x].NumDescriptors = table_1_1.pDescriptorRanges[x].NumDescriptors;1079pDescriptorRanges_1_0[x].OffsetInDescriptorsFromTableStart = table_1_1.pDescriptorRanges[x].OffsetInDescriptorsFromTableStart;1080pDescriptorRanges_1_0[x].RangeType = table_1_1.pDescriptorRanges[x].RangeType;1081pDescriptorRanges_1_0[x].RegisterSpace = table_1_1.pDescriptorRanges[x].RegisterSpace;1082}1083}10841085D3D12_ROOT_DESCRIPTOR_TABLE& table_1_0 = pParameters_1_0[n].DescriptorTable;1086table_1_0.NumDescriptorRanges = table_1_1.NumDescriptorRanges;1087table_1_0.pDescriptorRanges = pDescriptorRanges_1_0;1088}1089}1090}10911092D3D12_STATIC_SAMPLER_DESC* pStaticSamplers = nullptr;1093#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)1094if (desc_1_1.NumStaticSamplers > 0 && pRootSignatureDesc->Version == D3D_ROOT_SIGNATURE_VERSION_1_2)1095{1096const SIZE_T SamplersSize = sizeof(D3D12_STATIC_SAMPLER_DESC) * desc_1_1.NumStaticSamplers;1097pStaticSamplers = static_cast<D3D12_STATIC_SAMPLER_DESC*>(HeapAlloc(GetProcessHeap(), 0, SamplersSize));10981099if (pStaticSamplers == nullptr)1100{1101hr = E_OUTOFMEMORY;1102}1103else1104{1105const D3D12_ROOT_SIGNATURE_DESC2& desc_1_2 = pRootSignatureDesc->Desc_1_2;1106for (UINT n = 0; n < desc_1_1.NumStaticSamplers; ++n)1107{1108if ((desc_1_2.pStaticSamplers[n].Flags & ~D3D12_SAMPLER_FLAG_UINT_BORDER_COLOR) != 0)1109{1110hr = E_INVALIDARG;1111break;1112}1113memcpy(pStaticSamplers + n, desc_1_2.pStaticSamplers + n, sizeof(D3D12_STATIC_SAMPLER_DESC));1114}1115}1116}1117#endif11181119if (SUCCEEDED(hr))1120{1121const CD3DX12_ROOT_SIGNATURE_DESC desc_1_0(desc_1_1.NumParameters, pParameters_1_0, desc_1_1.NumStaticSamplers, pStaticSamplers == nullptr ? desc_1_1.pStaticSamplers : pStaticSamplers, desc_1_1.Flags);1122hr = d3d_D3D12SerializeRootSignature(&desc_1_0, D3D_ROOT_SIGNATURE_VERSION_1, ppBlob, ppErrorBlob);1123}11241125if (pParameters)1126{1127for (UINT n = 0; n < desc_1_1.NumParameters; n++)1128{1129if (desc_1_1.pParameters[n].ParameterType == D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE)1130{1131auto pDescriptorRanges_1_0 = pParameters_1_0[n].DescriptorTable.pDescriptorRanges;1132HeapFree(GetProcessHeap(), 0, reinterpret_cast<void*>(const_cast<D3D12_DESCRIPTOR_RANGE*>(pDescriptorRanges_1_0)));1133}1134}1135HeapFree(GetProcessHeap(), 0, pParameters);1136}11371138if (pStaticSamplers)1139{1140HeapFree(GetProcessHeap(), 0, pStaticSamplers);1141}11421143return hr;1144}1145}1146break;11471148case D3D_ROOT_SIGNATURE_VERSION_1_1:1149switch (pRootSignatureDesc->Version)1150{1151case D3D_ROOT_SIGNATURE_VERSION_1_0:1152case D3D_ROOT_SIGNATURE_VERSION_1_1:1153return d3d_D3D12SerializeVersionedRootSignature(pRootSignatureDesc, ppBlob, ppErrorBlob);11541155#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)1156case D3D_ROOT_SIGNATURE_VERSION_1_2:1157{1158HRESULT hr = S_OK;1159const D3D12_ROOT_SIGNATURE_DESC1& desc_1_1 = pRootSignatureDesc->Desc_1_1;11601161D3D12_STATIC_SAMPLER_DESC* pStaticSamplers = nullptr;1162if (desc_1_1.NumStaticSamplers > 0)1163{1164const SIZE_T SamplersSize = sizeof(D3D12_STATIC_SAMPLER_DESC) * desc_1_1.NumStaticSamplers;1165pStaticSamplers = static_cast<D3D12_STATIC_SAMPLER_DESC*>(HeapAlloc(GetProcessHeap(), 0, SamplersSize));11661167if (pStaticSamplers == nullptr)1168{1169hr = E_OUTOFMEMORY;1170}1171else1172{1173const D3D12_ROOT_SIGNATURE_DESC2& desc_1_2 = pRootSignatureDesc->Desc_1_2;1174for (UINT n = 0; n < desc_1_1.NumStaticSamplers; ++n)1175{1176if ((desc_1_2.pStaticSamplers[n].Flags & ~D3D12_SAMPLER_FLAG_UINT_BORDER_COLOR) != 0)1177{1178hr = E_INVALIDARG;1179break;1180}1181memcpy(pStaticSamplers + n, desc_1_2.pStaticSamplers + n, sizeof(D3D12_STATIC_SAMPLER_DESC));1182}1183}1184}11851186if (SUCCEEDED(hr))1187{1188const CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC desc(desc_1_1.NumParameters, desc_1_1.pParameters, desc_1_1.NumStaticSamplers, pStaticSamplers == nullptr ? desc_1_1.pStaticSamplers : pStaticSamplers, desc_1_1.Flags);1189hr = d3d_D3D12SerializeVersionedRootSignature(&desc, ppBlob, ppErrorBlob);1190}11911192if (pStaticSamplers)1193{1194HeapFree(GetProcessHeap(), 0, pStaticSamplers);1195}11961197return hr;1198}1199#endif12001201}1202#if defined(D3D12_SDK_VERSION) && (D3D12_SDK_VERSION >= 609)1203case D3D_ROOT_SIGNATURE_VERSION_1_2:1204#endif1205return d3d_D3D12SerializeVersionedRootSignature(pRootSignatureDesc, ppBlob, ppErrorBlob);1206}12071208return E_INVALIDARG;1209}121012111212