| //********************************************************* |
| // |
| // Copyright (c) Microsoft. All rights reserved. |
| // This code is licensed under the MIT License (MIT). |
| // THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF |
| // ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY |
| // IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR |
| // PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT. |
| // |
| //********************************************************* |
| |
| #ifndef __D3DX12_H__ |
| #define __D3DX12_H__ |
| |
| #include "d3d12.h" |
| |
| #if defined(__cplusplus) |
| |
| struct CD3DX12_DEFAULT {}; |
| extern const DECLSPEC_SELECTANY CD3DX12_DEFAULT D3D12_DEFAULT; |
| |
| //------------------------------------------------------------------------------------------------ |
| inline bool operator==(const D3D12_VIEWPORT& l, const D3D12_VIEWPORT& r) { |
| return l.TopLeftX == r.TopLeftX && l.TopLeftY == r.TopLeftY && l.Width == r.Width && l.Height == r.Height && |
| l.MinDepth == r.MinDepth && l.MaxDepth == r.MaxDepth; |
| } |
| |
| //------------------------------------------------------------------------------------------------ |
| inline bool operator!=(const D3D12_VIEWPORT& l, const D3D12_VIEWPORT& r) { return !(l == r); } |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_RECT : public D3D12_RECT { |
| CD3DX12_RECT() {} |
| explicit CD3DX12_RECT(const D3D12_RECT& o) : D3D12_RECT(o) {} |
| explicit CD3DX12_RECT(LONG Left, LONG Top, LONG Right, LONG Bottom) { |
| left = Left; |
| top = Top; |
| right = Right; |
| bottom = Bottom; |
| } |
| ~CD3DX12_RECT() {} |
| operator const D3D12_RECT&() const { return *this; } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_VIEWPORT : public D3D12_VIEWPORT { |
| CD3DX12_VIEWPORT() {} |
| explicit CD3DX12_VIEWPORT(const D3D12_VIEWPORT& o) : D3D12_VIEWPORT(o) {} |
| explicit CD3DX12_VIEWPORT(FLOAT topLeftX, FLOAT topLeftY, FLOAT width, FLOAT height, FLOAT minDepth = D3D12_MIN_DEPTH, |
| FLOAT maxDepth = D3D12_MAX_DEPTH) { |
| TopLeftX = topLeftX; |
| TopLeftY = topLeftY; |
| Width = width; |
| Height = height; |
| MinDepth = minDepth; |
| MaxDepth = maxDepth; |
| } |
| explicit CD3DX12_VIEWPORT(_In_ ID3D12Resource* pResource, UINT mipSlice = 0, FLOAT topLeftX = 0.0f, |
| FLOAT topLeftY = 0.0f, FLOAT minDepth = D3D12_MIN_DEPTH, FLOAT maxDepth = D3D12_MAX_DEPTH) { |
| D3D12_RESOURCE_DESC Desc = pResource->GetDesc(); |
| const UINT64 SubresourceWidth = Desc.Width >> mipSlice; |
| const UINT64 SubresourceHeight = Desc.Height >> mipSlice; |
| switch (Desc.Dimension) { |
| case D3D12_RESOURCE_DIMENSION_BUFFER: |
| TopLeftX = topLeftX; |
| TopLeftY = 0.0f; |
| Width = Desc.Width - topLeftX; |
| Height = 1.0f; |
| break; |
| case D3D12_RESOURCE_DIMENSION_TEXTURE1D: |
| TopLeftX = topLeftX; |
| TopLeftY = 0.0f; |
| Width = (SubresourceWidth ? SubresourceWidth : 1.0f) - topLeftX; |
| Height = 1.0f; |
| break; |
| case D3D12_RESOURCE_DIMENSION_TEXTURE2D: |
| case D3D12_RESOURCE_DIMENSION_TEXTURE3D: |
| TopLeftX = topLeftX; |
| TopLeftY = topLeftY; |
| Width = (SubresourceWidth ? SubresourceWidth : 1.0f) - topLeftX; |
| Height = (SubresourceHeight ? SubresourceHeight : 1.0f) - topLeftY; |
| break; |
| default: |
| break; |
| } |
| |
| MinDepth = minDepth; |
| MaxDepth = maxDepth; |
| } |
| ~CD3DX12_VIEWPORT() {} |
| operator const D3D12_VIEWPORT&() const { return *this; } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_BOX : public D3D12_BOX { |
| CD3DX12_BOX() {} |
| explicit CD3DX12_BOX(const D3D12_BOX& o) : D3D12_BOX(o) {} |
| explicit CD3DX12_BOX(LONG Left, LONG Right) { |
| left = Left; |
| top = 0; |
| front = 0; |
| right = Right; |
| bottom = 1; |
| back = 1; |
| } |
| explicit CD3DX12_BOX(LONG Left, LONG Top, LONG Right, LONG Bottom) { |
| left = Left; |
| top = Top; |
| front = 0; |
| right = Right; |
| bottom = Bottom; |
| back = 1; |
| } |
| explicit CD3DX12_BOX(LONG Left, LONG Top, LONG Front, LONG Right, LONG Bottom, LONG Back) { |
| left = Left; |
| top = Top; |
| front = Front; |
| right = Right; |
| bottom = Bottom; |
| back = Back; |
| } |
| ~CD3DX12_BOX() {} |
| operator const D3D12_BOX&() const { return *this; } |
| }; |
| inline bool operator==(const D3D12_BOX& l, const D3D12_BOX& r) { |
| return l.left == r.left && l.top == r.top && l.front == r.front && l.right == r.right && l.bottom == r.bottom && |
| l.back == r.back; |
| } |
| inline bool operator!=(const D3D12_BOX& l, const D3D12_BOX& r) { return !(l == r); } |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_DEPTH_STENCIL_DESC : public D3D12_DEPTH_STENCIL_DESC { |
| CD3DX12_DEPTH_STENCIL_DESC() {} |
| explicit CD3DX12_DEPTH_STENCIL_DESC(const D3D12_DEPTH_STENCIL_DESC& o) : D3D12_DEPTH_STENCIL_DESC(o) {} |
| explicit CD3DX12_DEPTH_STENCIL_DESC(CD3DX12_DEFAULT) { |
| DepthEnable = TRUE; |
| DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL; |
| DepthFunc = D3D12_COMPARISON_FUNC_LESS; |
| StencilEnable = FALSE; |
| StencilReadMask = D3D12_DEFAULT_STENCIL_READ_MASK; |
| StencilWriteMask = D3D12_DEFAULT_STENCIL_WRITE_MASK; |
| const D3D12_DEPTH_STENCILOP_DESC defaultStencilOp = {D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, |
| D3D12_STENCIL_OP_KEEP, D3D12_COMPARISON_FUNC_ALWAYS}; |
| FrontFace = defaultStencilOp; |
| BackFace = defaultStencilOp; |
| } |
| explicit CD3DX12_DEPTH_STENCIL_DESC(BOOL depthEnable, D3D12_DEPTH_WRITE_MASK depthWriteMask, |
| D3D12_COMPARISON_FUNC depthFunc, BOOL stencilEnable, UINT8 stencilReadMask, |
| UINT8 stencilWriteMask, D3D12_STENCIL_OP frontStencilFailOp, |
| D3D12_STENCIL_OP frontStencilDepthFailOp, D3D12_STENCIL_OP frontStencilPassOp, |
| D3D12_COMPARISON_FUNC frontStencilFunc, D3D12_STENCIL_OP backStencilFailOp, |
| D3D12_STENCIL_OP backStencilDepthFailOp, D3D12_STENCIL_OP backStencilPassOp, |
| D3D12_COMPARISON_FUNC backStencilFunc) { |
| DepthEnable = depthEnable; |
| DepthWriteMask = depthWriteMask; |
| DepthFunc = depthFunc; |
| StencilEnable = stencilEnable; |
| StencilReadMask = stencilReadMask; |
| StencilWriteMask = stencilWriteMask; |
| FrontFace.StencilFailOp = frontStencilFailOp; |
| FrontFace.StencilDepthFailOp = frontStencilDepthFailOp; |
| FrontFace.StencilPassOp = frontStencilPassOp; |
| FrontFace.StencilFunc = frontStencilFunc; |
| BackFace.StencilFailOp = backStencilFailOp; |
| BackFace.StencilDepthFailOp = backStencilDepthFailOp; |
| BackFace.StencilPassOp = backStencilPassOp; |
| BackFace.StencilFunc = backStencilFunc; |
| } |
| ~CD3DX12_DEPTH_STENCIL_DESC() {} |
| operator const D3D12_DEPTH_STENCIL_DESC&() const { return *this; } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_BLEND_DESC : public D3D12_BLEND_DESC { |
| CD3DX12_BLEND_DESC() {} |
| explicit CD3DX12_BLEND_DESC(const D3D12_BLEND_DESC& o) : D3D12_BLEND_DESC(o) {} |
| explicit CD3DX12_BLEND_DESC(CD3DX12_DEFAULT) { |
| AlphaToCoverageEnable = FALSE; |
| IndependentBlendEnable = FALSE; |
| const D3D12_RENDER_TARGET_BLEND_DESC defaultRenderTargetBlendDesc = { |
| FALSE, |
| FALSE, |
| D3D12_BLEND_ONE, |
| D3D12_BLEND_ZERO, |
| D3D12_BLEND_OP_ADD, |
| D3D12_BLEND_ONE, |
| D3D12_BLEND_ZERO, |
| D3D12_BLEND_OP_ADD, |
| D3D12_LOGIC_OP_NOOP, |
| D3D12_COLOR_WRITE_ENABLE_ALL, |
| }; |
| for (UINT i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i) RenderTarget[i] = defaultRenderTargetBlendDesc; |
| } |
| ~CD3DX12_BLEND_DESC() {} |
| operator const D3D12_BLEND_DESC&() const { return *this; } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_RASTERIZER_DESC : public D3D12_RASTERIZER_DESC { |
| CD3DX12_RASTERIZER_DESC() {} |
| explicit CD3DX12_RASTERIZER_DESC(const D3D12_RASTERIZER_DESC& o) : D3D12_RASTERIZER_DESC(o) {} |
| explicit CD3DX12_RASTERIZER_DESC(CD3DX12_DEFAULT) { |
| FillMode = D3D12_FILL_MODE_SOLID; |
| CullMode = D3D12_CULL_MODE_BACK; |
| FrontCounterClockwise = FALSE; |
| DepthBias = D3D12_DEFAULT_DEPTH_BIAS; |
| DepthBiasClamp = D3D12_DEFAULT_DEPTH_BIAS_CLAMP; |
| SlopeScaledDepthBias = D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS; |
| DepthClipEnable = TRUE; |
| MultisampleEnable = FALSE; |
| AntialiasedLineEnable = FALSE; |
| ForcedSampleCount = 0; |
| ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF; |
| } |
| explicit CD3DX12_RASTERIZER_DESC(D3D12_FILL_MODE fillMode, D3D12_CULL_MODE cullMode, BOOL frontCounterClockwise, |
| INT depthBias, FLOAT depthBiasClamp, FLOAT slopeScaledDepthBias, |
| BOOL depthClipEnable, BOOL multisampleEnable, BOOL antialiasedLineEnable, |
| UINT forcedSampleCount, D3D12_CONSERVATIVE_RASTERIZATION_MODE conservativeRaster) { |
| FillMode = fillMode; |
| CullMode = cullMode; |
| FrontCounterClockwise = frontCounterClockwise; |
| DepthBias = depthBias; |
| DepthBiasClamp = depthBiasClamp; |
| SlopeScaledDepthBias = slopeScaledDepthBias; |
| DepthClipEnable = depthClipEnable; |
| MultisampleEnable = multisampleEnable; |
| AntialiasedLineEnable = antialiasedLineEnable; |
| ForcedSampleCount = forcedSampleCount; |
| ConservativeRaster = conservativeRaster; |
| } |
| ~CD3DX12_RASTERIZER_DESC() {} |
| operator const D3D12_RASTERIZER_DESC&() const { return *this; } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_RESOURCE_ALLOCATION_INFO : public D3D12_RESOURCE_ALLOCATION_INFO { |
| CD3DX12_RESOURCE_ALLOCATION_INFO() {} |
| explicit CD3DX12_RESOURCE_ALLOCATION_INFO(const D3D12_RESOURCE_ALLOCATION_INFO& o) |
| : D3D12_RESOURCE_ALLOCATION_INFO(o) {} |
| CD3DX12_RESOURCE_ALLOCATION_INFO(UINT64 size, UINT64 alignment) { |
| SizeInBytes = size; |
| Alignment = alignment; |
| } |
| operator const D3D12_RESOURCE_ALLOCATION_INFO&() const { return *this; } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_HEAP_PROPERTIES : public D3D12_HEAP_PROPERTIES { |
| CD3DX12_HEAP_PROPERTIES() {} |
| explicit CD3DX12_HEAP_PROPERTIES(const D3D12_HEAP_PROPERTIES& o) : D3D12_HEAP_PROPERTIES(o) {} |
| CD3DX12_HEAP_PROPERTIES(D3D12_CPU_PAGE_PROPERTY cpuPageProperty, D3D12_MEMORY_POOL memoryPoolPreference, |
| UINT creationNodeMask = 1, UINT nodeMask = 1) { |
| Type = D3D12_HEAP_TYPE_CUSTOM; |
| CPUPageProperty = cpuPageProperty; |
| MemoryPoolPreference = memoryPoolPreference; |
| CreationNodeMask = creationNodeMask; |
| VisibleNodeMask = nodeMask; |
| } |
| explicit CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE type, UINT creationNodeMask = 1, UINT nodeMask = 1) { |
| Type = type; |
| CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; |
| MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; |
| CreationNodeMask = creationNodeMask; |
| VisibleNodeMask = nodeMask; |
| } |
| operator const D3D12_HEAP_PROPERTIES&() const { return *this; } |
| bool IsCPUAccessible() const { |
| 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)); |
| } |
| }; |
| inline bool operator==(const D3D12_HEAP_PROPERTIES& l, const D3D12_HEAP_PROPERTIES& r) { |
| return l.Type == r.Type && l.CPUPageProperty == r.CPUPageProperty && |
| l.MemoryPoolPreference == r.MemoryPoolPreference && l.CreationNodeMask == r.CreationNodeMask && |
| l.VisibleNodeMask == r.VisibleNodeMask; |
| } |
| inline bool operator!=(const D3D12_HEAP_PROPERTIES& l, const D3D12_HEAP_PROPERTIES& r) { return !(l == r); } |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_HEAP_DESC : public D3D12_HEAP_DESC { |
| CD3DX12_HEAP_DESC() {} |
| explicit CD3DX12_HEAP_DESC(const D3D12_HEAP_DESC& o) : D3D12_HEAP_DESC(o) {} |
| CD3DX12_HEAP_DESC(UINT64 size, D3D12_HEAP_PROPERTIES properties, UINT64 alignment = 0, |
| D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE) { |
| SizeInBytes = size; |
| Properties = properties; |
| Alignment = alignment; |
| Flags = flags; |
| } |
| CD3DX12_HEAP_DESC(UINT64 size, D3D12_HEAP_TYPE type, UINT64 alignment = 0, |
| D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE) { |
| SizeInBytes = size; |
| Properties = CD3DX12_HEAP_PROPERTIES(type); |
| Alignment = alignment; |
| Flags = flags; |
| } |
| CD3DX12_HEAP_DESC(UINT64 size, D3D12_CPU_PAGE_PROPERTY cpuPageProperty, D3D12_MEMORY_POOL memoryPoolPreference, |
| UINT64 alignment = 0, D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE) { |
| SizeInBytes = size; |
| Properties = CD3DX12_HEAP_PROPERTIES(cpuPageProperty, memoryPoolPreference); |
| Alignment = alignment; |
| Flags = flags; |
| } |
| CD3DX12_HEAP_DESC(const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo, D3D12_HEAP_PROPERTIES properties, |
| D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE) { |
| SizeInBytes = resAllocInfo.SizeInBytes; |
| Properties = properties; |
| Alignment = resAllocInfo.Alignment; |
| Flags = flags; |
| } |
| CD3DX12_HEAP_DESC(const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo, D3D12_HEAP_TYPE type, |
| D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE) { |
| SizeInBytes = resAllocInfo.SizeInBytes; |
| Properties = CD3DX12_HEAP_PROPERTIES(type); |
| Alignment = resAllocInfo.Alignment; |
| Flags = flags; |
| } |
| CD3DX12_HEAP_DESC(const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo, D3D12_CPU_PAGE_PROPERTY cpuPageProperty, |
| D3D12_MEMORY_POOL memoryPoolPreference, D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE) { |
| SizeInBytes = resAllocInfo.SizeInBytes; |
| Properties = CD3DX12_HEAP_PROPERTIES(cpuPageProperty, memoryPoolPreference); |
| Alignment = resAllocInfo.Alignment; |
| Flags = flags; |
| } |
| operator const D3D12_HEAP_DESC&() const { return *this; } |
| bool IsCPUAccessible() const { return static_cast<const CD3DX12_HEAP_PROPERTIES*>(&Properties)->IsCPUAccessible(); } |
| }; |
| inline bool operator==(const D3D12_HEAP_DESC& l, const D3D12_HEAP_DESC& r) { |
| return l.SizeInBytes == r.SizeInBytes && l.Properties == r.Properties && l.Alignment == r.Alignment && |
| l.Flags == r.Flags; |
| } |
| inline bool operator!=(const D3D12_HEAP_DESC& l, const D3D12_HEAP_DESC& r) { return !(l == r); } |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_CLEAR_VALUE : public D3D12_CLEAR_VALUE { |
| CD3DX12_CLEAR_VALUE() {} |
| explicit CD3DX12_CLEAR_VALUE(const D3D12_CLEAR_VALUE& o) : D3D12_CLEAR_VALUE(o) {} |
| CD3DX12_CLEAR_VALUE(DXGI_FORMAT format, const FLOAT color[4]) { |
| Format = format; |
| memcpy(Color, color, sizeof(Color)); |
| } |
| CD3DX12_CLEAR_VALUE(DXGI_FORMAT format, FLOAT depth, UINT8 stencil) { |
| Format = format; |
| /* Use memcpy to preserve NAN values */ |
| memcpy(&DepthStencil.Depth, &depth, sizeof(depth)); |
| DepthStencil.Stencil = stencil; |
| } |
| operator const D3D12_CLEAR_VALUE&() const { return *this; } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_RANGE : public D3D12_RANGE { |
| CD3DX12_RANGE() {} |
| explicit CD3DX12_RANGE(const D3D12_RANGE& o) : D3D12_RANGE(o) {} |
| CD3DX12_RANGE(SIZE_T begin, SIZE_T end) { |
| Begin = begin; |
| End = end; |
| } |
| operator const D3D12_RANGE&() const { return *this; } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_SHADER_BYTECODE : public D3D12_SHADER_BYTECODE { |
| CD3DX12_SHADER_BYTECODE() {} |
| explicit CD3DX12_SHADER_BYTECODE(const D3D12_SHADER_BYTECODE& o) : D3D12_SHADER_BYTECODE(o) {} |
| CD3DX12_SHADER_BYTECODE(_In_ ID3DBlob* pShaderBlob) { |
| pShaderBytecode = pShaderBlob->GetBufferPointer(); |
| BytecodeLength = pShaderBlob->GetBufferSize(); |
| } |
| CD3DX12_SHADER_BYTECODE(_In_reads_(bytecodeLength) const void* _pShaderBytecode, SIZE_T bytecodeLength) { |
| pShaderBytecode = _pShaderBytecode; |
| BytecodeLength = bytecodeLength; |
| } |
| operator const D3D12_SHADER_BYTECODE&() const { return *this; } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_TILED_RESOURCE_COORDINATE : public D3D12_TILED_RESOURCE_COORDINATE { |
| CD3DX12_TILED_RESOURCE_COORDINATE() {} |
| explicit CD3DX12_TILED_RESOURCE_COORDINATE(const D3D12_TILED_RESOURCE_COORDINATE& o) |
| : D3D12_TILED_RESOURCE_COORDINATE(o) {} |
| CD3DX12_TILED_RESOURCE_COORDINATE(UINT x, UINT y, UINT z, UINT subresource) { |
| X = x; |
| Y = y; |
| Z = z; |
| Subresource = subresource; |
| } |
| operator const D3D12_TILED_RESOURCE_COORDINATE&() const { return *this; } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_TILE_REGION_SIZE : public D3D12_TILE_REGION_SIZE { |
| CD3DX12_TILE_REGION_SIZE() {} |
| explicit CD3DX12_TILE_REGION_SIZE(const D3D12_TILE_REGION_SIZE& o) : D3D12_TILE_REGION_SIZE(o) {} |
| CD3DX12_TILE_REGION_SIZE(UINT numTiles, BOOL useBox, UINT width, UINT16 height, UINT16 depth) { |
| NumTiles = numTiles; |
| UseBox = useBox; |
| Width = width; |
| Height = height; |
| Depth = depth; |
| } |
| operator const D3D12_TILE_REGION_SIZE&() const { return *this; } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_SUBRESOURCE_TILING : public D3D12_SUBRESOURCE_TILING { |
| CD3DX12_SUBRESOURCE_TILING() {} |
| explicit CD3DX12_SUBRESOURCE_TILING(const D3D12_SUBRESOURCE_TILING& o) : D3D12_SUBRESOURCE_TILING(o) {} |
| CD3DX12_SUBRESOURCE_TILING(UINT widthInTiles, UINT16 heightInTiles, UINT16 depthInTiles, |
| UINT startTileIndexInOverallResource) { |
| WidthInTiles = widthInTiles; |
| HeightInTiles = heightInTiles; |
| DepthInTiles = depthInTiles; |
| StartTileIndexInOverallResource = startTileIndexInOverallResource; |
| } |
| operator const D3D12_SUBRESOURCE_TILING&() const { return *this; } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_TILE_SHAPE : public D3D12_TILE_SHAPE { |
| CD3DX12_TILE_SHAPE() {} |
| explicit CD3DX12_TILE_SHAPE(const D3D12_TILE_SHAPE& o) : D3D12_TILE_SHAPE(o) {} |
| CD3DX12_TILE_SHAPE(UINT widthInTexels, UINT heightInTexels, UINT depthInTexels) { |
| WidthInTexels = widthInTexels; |
| HeightInTexels = heightInTexels; |
| DepthInTexels = depthInTexels; |
| } |
| operator const D3D12_TILE_SHAPE&() const { return *this; } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_RESOURCE_BARRIER : public D3D12_RESOURCE_BARRIER { |
| CD3DX12_RESOURCE_BARRIER() {} |
| explicit CD3DX12_RESOURCE_BARRIER(const D3D12_RESOURCE_BARRIER& o) : D3D12_RESOURCE_BARRIER(o) {} |
| static inline CD3DX12_RESOURCE_BARRIER Transition( |
| _In_ ID3D12Resource* pResource, D3D12_RESOURCE_STATES stateBefore, D3D12_RESOURCE_STATES stateAfter, |
| UINT subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES, |
| D3D12_RESOURCE_BARRIER_FLAGS flags = D3D12_RESOURCE_BARRIER_FLAG_NONE) { |
| CD3DX12_RESOURCE_BARRIER result; |
| ZeroMemory(&result, sizeof(result)); |
| D3D12_RESOURCE_BARRIER& barrier = result; |
| result.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; |
| result.Flags = flags; |
| barrier.Transition.pResource = pResource; |
| barrier.Transition.StateBefore = stateBefore; |
| barrier.Transition.StateAfter = stateAfter; |
| barrier.Transition.Subresource = subresource; |
| return result; |
| } |
| static inline CD3DX12_RESOURCE_BARRIER Aliasing(_In_ ID3D12Resource* pResourceBefore, |
| _In_ ID3D12Resource* pResourceAfter) { |
| CD3DX12_RESOURCE_BARRIER result; |
| ZeroMemory(&result, sizeof(result)); |
| D3D12_RESOURCE_BARRIER& barrier = result; |
| result.Type = D3D12_RESOURCE_BARRIER_TYPE_ALIASING; |
| barrier.Aliasing.pResourceBefore = pResourceBefore; |
| barrier.Aliasing.pResourceAfter = pResourceAfter; |
| return result; |
| } |
| static inline CD3DX12_RESOURCE_BARRIER UAV(_In_ ID3D12Resource* pResource) { |
| CD3DX12_RESOURCE_BARRIER result; |
| ZeroMemory(&result, sizeof(result)); |
| D3D12_RESOURCE_BARRIER& barrier = result; |
| result.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV; |
| barrier.UAV.pResource = pResource; |
| return result; |
| } |
| operator const D3D12_RESOURCE_BARRIER&() const { return *this; } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_PACKED_MIP_INFO : public D3D12_PACKED_MIP_INFO { |
| CD3DX12_PACKED_MIP_INFO() {} |
| explicit CD3DX12_PACKED_MIP_INFO(const D3D12_PACKED_MIP_INFO& o) : D3D12_PACKED_MIP_INFO(o) {} |
| CD3DX12_PACKED_MIP_INFO(UINT8 numStandardMips, UINT8 numPackedMips, UINT numTilesForPackedMips, |
| UINT startTileIndexInOverallResource) { |
| NumStandardMips = numStandardMips; |
| NumPackedMips = numPackedMips; |
| NumTilesForPackedMips = numTilesForPackedMips; |
| StartTileIndexInOverallResource = startTileIndexInOverallResource; |
| } |
| operator const D3D12_PACKED_MIP_INFO&() const { return *this; } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_SUBRESOURCE_FOOTPRINT : public D3D12_SUBRESOURCE_FOOTPRINT { |
| CD3DX12_SUBRESOURCE_FOOTPRINT() {} |
| explicit CD3DX12_SUBRESOURCE_FOOTPRINT(const D3D12_SUBRESOURCE_FOOTPRINT& o) : D3D12_SUBRESOURCE_FOOTPRINT(o) {} |
| CD3DX12_SUBRESOURCE_FOOTPRINT(DXGI_FORMAT format, UINT width, UINT height, UINT depth, UINT rowPitch) { |
| Format = format; |
| Width = width; |
| Height = height; |
| Depth = depth; |
| RowPitch = rowPitch; |
| } |
| explicit CD3DX12_SUBRESOURCE_FOOTPRINT(const D3D12_RESOURCE_DESC& resDesc, UINT rowPitch) { |
| Format = resDesc.Format; |
| Width = UINT(resDesc.Width); |
| Height = resDesc.Height; |
| Depth = (resDesc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? resDesc.DepthOrArraySize : 1); |
| RowPitch = rowPitch; |
| } |
| operator const D3D12_SUBRESOURCE_FOOTPRINT&() const { return *this; } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_TEXTURE_COPY_LOCATION : public D3D12_TEXTURE_COPY_LOCATION { |
| CD3DX12_TEXTURE_COPY_LOCATION() {} |
| explicit CD3DX12_TEXTURE_COPY_LOCATION(const D3D12_TEXTURE_COPY_LOCATION& o) : D3D12_TEXTURE_COPY_LOCATION(o) {} |
| CD3DX12_TEXTURE_COPY_LOCATION(ID3D12Resource* pRes) { pResource = pRes; } |
| CD3DX12_TEXTURE_COPY_LOCATION(ID3D12Resource* pRes, D3D12_PLACED_SUBRESOURCE_FOOTPRINT const& Footprint) { |
| pResource = pRes; |
| Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; |
| PlacedFootprint = Footprint; |
| } |
| CD3DX12_TEXTURE_COPY_LOCATION(ID3D12Resource* pRes, UINT Sub) { |
| pResource = pRes; |
| Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; |
| SubresourceIndex = Sub; |
| } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_DESCRIPTOR_RANGE : public D3D12_DESCRIPTOR_RANGE { |
| CD3DX12_DESCRIPTOR_RANGE() {} |
| explicit CD3DX12_DESCRIPTOR_RANGE(const D3D12_DESCRIPTOR_RANGE& o) : D3D12_DESCRIPTOR_RANGE(o) {} |
| CD3DX12_DESCRIPTOR_RANGE(D3D12_DESCRIPTOR_RANGE_TYPE rangeType, UINT numDescriptors, UINT baseShaderRegister, |
| UINT registerSpace = 0, |
| UINT offsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) { |
| Init(rangeType, numDescriptors, baseShaderRegister, registerSpace, offsetInDescriptorsFromTableStart); |
| } |
| |
| inline void Init(D3D12_DESCRIPTOR_RANGE_TYPE rangeType, UINT numDescriptors, UINT baseShaderRegister, |
| UINT registerSpace = 0, |
| UINT offsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) { |
| Init(*this, rangeType, numDescriptors, baseShaderRegister, registerSpace, offsetInDescriptorsFromTableStart); |
| } |
| |
| static inline void Init(_Out_ D3D12_DESCRIPTOR_RANGE& range, D3D12_DESCRIPTOR_RANGE_TYPE rangeType, |
| UINT numDescriptors, UINT baseShaderRegister, UINT registerSpace = 0, |
| UINT offsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) { |
| range.RangeType = rangeType; |
| range.NumDescriptors = numDescriptors; |
| range.BaseShaderRegister = baseShaderRegister; |
| range.RegisterSpace = registerSpace; |
| range.OffsetInDescriptorsFromTableStart = offsetInDescriptorsFromTableStart; |
| } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_ROOT_DESCRIPTOR_TABLE : public D3D12_ROOT_DESCRIPTOR_TABLE { |
| CD3DX12_ROOT_DESCRIPTOR_TABLE() {} |
| explicit CD3DX12_ROOT_DESCRIPTOR_TABLE(const D3D12_ROOT_DESCRIPTOR_TABLE& o) : D3D12_ROOT_DESCRIPTOR_TABLE(o) {} |
| CD3DX12_ROOT_DESCRIPTOR_TABLE(UINT numDescriptorRanges, |
| _In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges) { |
| Init(numDescriptorRanges, _pDescriptorRanges); |
| } |
| |
| inline void Init(UINT numDescriptorRanges, |
| _In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges) { |
| Init(*this, numDescriptorRanges, _pDescriptorRanges); |
| } |
| |
| static inline void Init(_Out_ D3D12_ROOT_DESCRIPTOR_TABLE& rootDescriptorTable, UINT numDescriptorRanges, |
| _In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges) { |
| rootDescriptorTable.NumDescriptorRanges = numDescriptorRanges; |
| rootDescriptorTable.pDescriptorRanges = _pDescriptorRanges; |
| } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_ROOT_CONSTANTS : public D3D12_ROOT_CONSTANTS { |
| CD3DX12_ROOT_CONSTANTS() {} |
| explicit CD3DX12_ROOT_CONSTANTS(const D3D12_ROOT_CONSTANTS& o) : D3D12_ROOT_CONSTANTS(o) {} |
| CD3DX12_ROOT_CONSTANTS(UINT num32BitValues, UINT shaderRegister, UINT registerSpace = 0) { |
| Init(num32BitValues, shaderRegister, registerSpace); |
| } |
| |
| inline void Init(UINT num32BitValues, UINT shaderRegister, UINT registerSpace = 0) { |
| Init(*this, num32BitValues, shaderRegister, registerSpace); |
| } |
| |
| static inline void Init(_Out_ D3D12_ROOT_CONSTANTS& rootConstants, UINT num32BitValues, UINT shaderRegister, |
| UINT registerSpace = 0) { |
| rootConstants.Num32BitValues = num32BitValues; |
| rootConstants.ShaderRegister = shaderRegister; |
| rootConstants.RegisterSpace = registerSpace; |
| } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_ROOT_DESCRIPTOR : public D3D12_ROOT_DESCRIPTOR { |
| CD3DX12_ROOT_DESCRIPTOR() {} |
| explicit CD3DX12_ROOT_DESCRIPTOR(const D3D12_ROOT_DESCRIPTOR& o) : D3D12_ROOT_DESCRIPTOR(o) {} |
| CD3DX12_ROOT_DESCRIPTOR(UINT shaderRegister, UINT registerSpace = 0) { Init(shaderRegister, registerSpace); } |
| |
| inline void Init(UINT shaderRegister, UINT registerSpace = 0) { Init(*this, shaderRegister, registerSpace); } |
| |
| static inline void Init(_Out_ D3D12_ROOT_DESCRIPTOR& table, UINT shaderRegister, UINT registerSpace = 0) { |
| table.ShaderRegister = shaderRegister; |
| table.RegisterSpace = registerSpace; |
| } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_ROOT_PARAMETER : public D3D12_ROOT_PARAMETER { |
| CD3DX12_ROOT_PARAMETER() {} |
| explicit CD3DX12_ROOT_PARAMETER(const D3D12_ROOT_PARAMETER& o) : D3D12_ROOT_PARAMETER(o) {} |
| |
| static inline void InitAsDescriptorTable(_Out_ D3D12_ROOT_PARAMETER& rootParam, UINT numDescriptorRanges, |
| _In_reads_(numDescriptorRanges) |
| const D3D12_DESCRIPTOR_RANGE* pDescriptorRanges, |
| D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) { |
| rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE; |
| rootParam.ShaderVisibility = visibility; |
| CD3DX12_ROOT_DESCRIPTOR_TABLE::Init(rootParam.DescriptorTable, numDescriptorRanges, pDescriptorRanges); |
| } |
| |
| static inline void InitAsConstants(_Out_ D3D12_ROOT_PARAMETER& rootParam, UINT num32BitValues, UINT shaderRegister, |
| UINT registerSpace = 0, |
| D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) { |
| rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS; |
| rootParam.ShaderVisibility = visibility; |
| CD3DX12_ROOT_CONSTANTS::Init(rootParam.Constants, num32BitValues, shaderRegister, registerSpace); |
| } |
| |
| static inline void InitAsConstantBufferView(_Out_ D3D12_ROOT_PARAMETER& rootParam, UINT shaderRegister, |
| UINT registerSpace = 0, |
| D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) { |
| rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV; |
| rootParam.ShaderVisibility = visibility; |
| CD3DX12_ROOT_DESCRIPTOR::Init(rootParam.Descriptor, shaderRegister, registerSpace); |
| } |
| |
| static inline void InitAsShaderResourceView(_Out_ D3D12_ROOT_PARAMETER& rootParam, UINT shaderRegister, |
| UINT registerSpace = 0, |
| D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) { |
| rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_SRV; |
| rootParam.ShaderVisibility = visibility; |
| CD3DX12_ROOT_DESCRIPTOR::Init(rootParam.Descriptor, shaderRegister, registerSpace); |
| } |
| |
| static inline void InitAsUnorderedAccessView(_Out_ D3D12_ROOT_PARAMETER& rootParam, UINT shaderRegister, |
| UINT registerSpace = 0, |
| D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) { |
| rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV; |
| rootParam.ShaderVisibility = visibility; |
| CD3DX12_ROOT_DESCRIPTOR::Init(rootParam.Descriptor, shaderRegister, registerSpace); |
| } |
| |
| inline void InitAsDescriptorTable(UINT numDescriptorRanges, |
| _In_reads_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* pDescriptorRanges, |
| D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) { |
| InitAsDescriptorTable(*this, numDescriptorRanges, pDescriptorRanges, visibility); |
| } |
| |
| inline void InitAsConstants(UINT num32BitValues, UINT shaderRegister, UINT registerSpace = 0, |
| D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) { |
| InitAsConstants(*this, num32BitValues, shaderRegister, registerSpace, visibility); |
| } |
| |
| inline void InitAsConstantBufferView(UINT shaderRegister, UINT registerSpace = 0, |
| D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) { |
| InitAsConstantBufferView(*this, shaderRegister, registerSpace, visibility); |
| } |
| |
| inline void InitAsShaderResourceView(UINT shaderRegister, UINT registerSpace = 0, |
| D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) { |
| InitAsShaderResourceView(*this, shaderRegister, registerSpace, visibility); |
| } |
| |
| inline void InitAsUnorderedAccessView(UINT shaderRegister, UINT registerSpace = 0, |
| D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) { |
| InitAsUnorderedAccessView(*this, shaderRegister, registerSpace, visibility); |
| } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_STATIC_SAMPLER_DESC : public D3D12_STATIC_SAMPLER_DESC { |
| CD3DX12_STATIC_SAMPLER_DESC() {} |
| explicit CD3DX12_STATIC_SAMPLER_DESC(const D3D12_STATIC_SAMPLER_DESC& o) : D3D12_STATIC_SAMPLER_DESC(o) {} |
| CD3DX12_STATIC_SAMPLER_DESC(UINT shaderRegister, D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC, |
| D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP, |
| D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP, |
| D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP, |
| FLOAT mipLODBias = 0, UINT maxAnisotropy = 16, |
| D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL, |
| D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE, |
| FLOAT minLOD = 0.f, FLOAT maxLOD = D3D12_FLOAT32_MAX, |
| D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL, |
| UINT registerSpace = 0) { |
| Init(shaderRegister, filter, addressU, addressV, addressW, mipLODBias, maxAnisotropy, comparisonFunc, borderColor, |
| minLOD, maxLOD, shaderVisibility, registerSpace); |
| } |
| |
| static inline void Init(_Out_ D3D12_STATIC_SAMPLER_DESC& samplerDesc, UINT shaderRegister, |
| D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC, |
| D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP, |
| D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP, |
| D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP, FLOAT mipLODBias = 0, |
| UINT maxAnisotropy = 16, |
| D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL, |
| D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE, |
| FLOAT minLOD = 0.f, FLOAT maxLOD = D3D12_FLOAT32_MAX, |
| D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL, |
| UINT registerSpace = 0) { |
| samplerDesc.ShaderRegister = shaderRegister; |
| samplerDesc.Filter = filter; |
| samplerDesc.AddressU = addressU; |
| samplerDesc.AddressV = addressV; |
| samplerDesc.AddressW = addressW; |
| samplerDesc.MipLODBias = mipLODBias; |
| samplerDesc.MaxAnisotropy = maxAnisotropy; |
| samplerDesc.ComparisonFunc = comparisonFunc; |
| samplerDesc.BorderColor = borderColor; |
| samplerDesc.MinLOD = minLOD; |
| samplerDesc.MaxLOD = maxLOD; |
| samplerDesc.ShaderVisibility = shaderVisibility; |
| samplerDesc.RegisterSpace = registerSpace; |
| } |
| inline void Init(UINT shaderRegister, D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC, |
| D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP, |
| D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP, |
| D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP, FLOAT mipLODBias = 0, |
| UINT maxAnisotropy = 16, D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL, |
| D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE, FLOAT minLOD = 0.f, |
| FLOAT maxLOD = D3D12_FLOAT32_MAX, |
| D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL, UINT registerSpace = 0) { |
| Init(*this, shaderRegister, filter, addressU, addressV, addressW, mipLODBias, maxAnisotropy, comparisonFunc, |
| borderColor, minLOD, maxLOD, shaderVisibility, registerSpace); |
| } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_ROOT_SIGNATURE_DESC : public D3D12_ROOT_SIGNATURE_DESC { |
| CD3DX12_ROOT_SIGNATURE_DESC() {} |
| explicit CD3DX12_ROOT_SIGNATURE_DESC(const D3D12_ROOT_SIGNATURE_DESC& o) : D3D12_ROOT_SIGNATURE_DESC(o) {} |
| CD3DX12_ROOT_SIGNATURE_DESC(UINT numParameters, |
| _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters, |
| UINT numStaticSamplers = 0, |
| _In_reads_opt_(numStaticSamplers) |
| const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = NULL, |
| D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) { |
| Init(numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags); |
| } |
| CD3DX12_ROOT_SIGNATURE_DESC(CD3DX12_DEFAULT) { Init(0, NULL, 0, NULL, D3D12_ROOT_SIGNATURE_FLAG_NONE); } |
| |
| inline void Init(UINT numParameters, _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters, |
| UINT numStaticSamplers = 0, |
| _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = NULL, |
| D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) { |
| Init(*this, numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags); |
| } |
| |
| static inline void Init(_Out_ D3D12_ROOT_SIGNATURE_DESC& desc, UINT numParameters, |
| _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters, |
| UINT numStaticSamplers = 0, |
| _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = NULL, |
| D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) { |
| desc.NumParameters = numParameters; |
| desc.pParameters = _pParameters; |
| desc.NumStaticSamplers = numStaticSamplers; |
| desc.pStaticSamplers = _pStaticSamplers; |
| desc.Flags = flags; |
| } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_DESCRIPTOR_RANGE1 : public D3D12_DESCRIPTOR_RANGE1 { |
| CD3DX12_DESCRIPTOR_RANGE1() {} |
| explicit CD3DX12_DESCRIPTOR_RANGE1(const D3D12_DESCRIPTOR_RANGE1& o) : D3D12_DESCRIPTOR_RANGE1(o) {} |
| CD3DX12_DESCRIPTOR_RANGE1(D3D12_DESCRIPTOR_RANGE_TYPE rangeType, UINT numDescriptors, UINT baseShaderRegister, |
| UINT registerSpace = 0, |
| D3D12_DESCRIPTOR_RANGE_FLAGS flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE, |
| UINT offsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) { |
| Init(rangeType, numDescriptors, baseShaderRegister, registerSpace, flags, offsetInDescriptorsFromTableStart); |
| } |
| |
| inline void Init(D3D12_DESCRIPTOR_RANGE_TYPE rangeType, UINT numDescriptors, UINT baseShaderRegister, |
| UINT registerSpace = 0, D3D12_DESCRIPTOR_RANGE_FLAGS flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE, |
| UINT offsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) { |
| Init(*this, rangeType, numDescriptors, baseShaderRegister, registerSpace, flags, offsetInDescriptorsFromTableStart); |
| } |
| |
| static inline void Init(_Out_ D3D12_DESCRIPTOR_RANGE1& range, D3D12_DESCRIPTOR_RANGE_TYPE rangeType, |
| UINT numDescriptors, UINT baseShaderRegister, UINT registerSpace = 0, |
| D3D12_DESCRIPTOR_RANGE_FLAGS flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE, |
| UINT offsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) { |
| range.RangeType = rangeType; |
| range.NumDescriptors = numDescriptors; |
| range.BaseShaderRegister = baseShaderRegister; |
| range.RegisterSpace = registerSpace; |
| range.Flags = flags; |
| range.OffsetInDescriptorsFromTableStart = offsetInDescriptorsFromTableStart; |
| } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_ROOT_DESCRIPTOR_TABLE1 : public D3D12_ROOT_DESCRIPTOR_TABLE1 { |
| CD3DX12_ROOT_DESCRIPTOR_TABLE1() {} |
| explicit CD3DX12_ROOT_DESCRIPTOR_TABLE1(const D3D12_ROOT_DESCRIPTOR_TABLE1& o) : D3D12_ROOT_DESCRIPTOR_TABLE1(o) {} |
| CD3DX12_ROOT_DESCRIPTOR_TABLE1(UINT numDescriptorRanges, _In_reads_opt_(numDescriptorRanges) |
| const D3D12_DESCRIPTOR_RANGE1* _pDescriptorRanges) { |
| Init(numDescriptorRanges, _pDescriptorRanges); |
| } |
| |
| inline void Init(UINT numDescriptorRanges, |
| _In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE1* _pDescriptorRanges) { |
| Init(*this, numDescriptorRanges, _pDescriptorRanges); |
| } |
| |
| static inline void Init(_Out_ D3D12_ROOT_DESCRIPTOR_TABLE1& rootDescriptorTable, UINT numDescriptorRanges, |
| _In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE1* _pDescriptorRanges) { |
| rootDescriptorTable.NumDescriptorRanges = numDescriptorRanges; |
| rootDescriptorTable.pDescriptorRanges = _pDescriptorRanges; |
| } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_ROOT_DESCRIPTOR1 : public D3D12_ROOT_DESCRIPTOR1 { |
| CD3DX12_ROOT_DESCRIPTOR1() {} |
| explicit CD3DX12_ROOT_DESCRIPTOR1(const D3D12_ROOT_DESCRIPTOR1& o) : D3D12_ROOT_DESCRIPTOR1(o) {} |
| CD3DX12_ROOT_DESCRIPTOR1(UINT shaderRegister, UINT registerSpace = 0, |
| D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE) { |
| Init(shaderRegister, registerSpace, flags); |
| } |
| |
| inline void Init(UINT shaderRegister, UINT registerSpace = 0, |
| D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE) { |
| Init(*this, shaderRegister, registerSpace, flags); |
| } |
| |
| static inline void Init(_Out_ D3D12_ROOT_DESCRIPTOR1& table, UINT shaderRegister, UINT registerSpace = 0, |
| D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE) { |
| table.ShaderRegister = shaderRegister; |
| table.RegisterSpace = registerSpace; |
| table.Flags = flags; |
| } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_ROOT_PARAMETER1 : public D3D12_ROOT_PARAMETER1 { |
| CD3DX12_ROOT_PARAMETER1() {} |
| explicit CD3DX12_ROOT_PARAMETER1(const D3D12_ROOT_PARAMETER1& o) : D3D12_ROOT_PARAMETER1(o) {} |
| |
| static inline void InitAsDescriptorTable(_Out_ D3D12_ROOT_PARAMETER1& rootParam, UINT numDescriptorRanges, |
| _In_reads_(numDescriptorRanges) |
| const D3D12_DESCRIPTOR_RANGE1* pDescriptorRanges, |
| D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) { |
| rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE; |
| rootParam.ShaderVisibility = visibility; |
| CD3DX12_ROOT_DESCRIPTOR_TABLE1::Init(rootParam.DescriptorTable, numDescriptorRanges, pDescriptorRanges); |
| } |
| |
| static inline void InitAsConstants(_Out_ D3D12_ROOT_PARAMETER1& rootParam, UINT num32BitValues, UINT shaderRegister, |
| UINT registerSpace = 0, |
| D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) { |
| rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS; |
| rootParam.ShaderVisibility = visibility; |
| CD3DX12_ROOT_CONSTANTS::Init(rootParam.Constants, num32BitValues, shaderRegister, registerSpace); |
| } |
| |
| static inline void InitAsConstantBufferView(_Out_ D3D12_ROOT_PARAMETER1& rootParam, UINT shaderRegister, |
| UINT registerSpace = 0, |
| D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE, |
| D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) { |
| rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV; |
| rootParam.ShaderVisibility = visibility; |
| CD3DX12_ROOT_DESCRIPTOR1::Init(rootParam.Descriptor, shaderRegister, registerSpace, flags); |
| } |
| |
| static inline void InitAsShaderResourceView(_Out_ D3D12_ROOT_PARAMETER1& rootParam, UINT shaderRegister, |
| UINT registerSpace = 0, |
| D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE, |
| D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) { |
| rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_SRV; |
| rootParam.ShaderVisibility = visibility; |
| CD3DX12_ROOT_DESCRIPTOR1::Init(rootParam.Descriptor, shaderRegister, registerSpace, flags); |
| } |
| |
| static inline void InitAsUnorderedAccessView(_Out_ D3D12_ROOT_PARAMETER1& rootParam, UINT shaderRegister, |
| UINT registerSpace = 0, |
| D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE, |
| D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) { |
| rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV; |
| rootParam.ShaderVisibility = visibility; |
| CD3DX12_ROOT_DESCRIPTOR1::Init(rootParam.Descriptor, shaderRegister, registerSpace, flags); |
| } |
| |
| inline void InitAsDescriptorTable(UINT numDescriptorRanges, |
| _In_reads_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE1* pDescriptorRanges, |
| D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) { |
| InitAsDescriptorTable(*this, numDescriptorRanges, pDescriptorRanges, visibility); |
| } |
| |
| inline void InitAsConstants(UINT num32BitValues, UINT shaderRegister, UINT registerSpace = 0, |
| D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) { |
| InitAsConstants(*this, num32BitValues, shaderRegister, registerSpace, visibility); |
| } |
| |
| inline void InitAsConstantBufferView(UINT shaderRegister, UINT registerSpace = 0, |
| D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE, |
| D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) { |
| InitAsConstantBufferView(*this, shaderRegister, registerSpace, flags, visibility); |
| } |
| |
| inline void InitAsShaderResourceView(UINT shaderRegister, UINT registerSpace = 0, |
| D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE, |
| D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) { |
| InitAsShaderResourceView(*this, shaderRegister, registerSpace, flags, visibility); |
| } |
| |
| inline void InitAsUnorderedAccessView(UINT shaderRegister, UINT registerSpace = 0, |
| D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE, |
| D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) { |
| InitAsUnorderedAccessView(*this, shaderRegister, registerSpace, flags, visibility); |
| } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC : public D3D12_VERSIONED_ROOT_SIGNATURE_DESC { |
| CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC() {} |
| explicit CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(const D3D12_VERSIONED_ROOT_SIGNATURE_DESC& o) |
| : D3D12_VERSIONED_ROOT_SIGNATURE_DESC(o) {} |
| explicit CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(const D3D12_ROOT_SIGNATURE_DESC& o) { |
| Version = D3D_ROOT_SIGNATURE_VERSION_1_0; |
| Desc_1_0 = o; |
| } |
| explicit CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(const D3D12_ROOT_SIGNATURE_DESC1& o) { |
| Version = D3D_ROOT_SIGNATURE_VERSION_1_1; |
| Desc_1_1 = o; |
| } |
| CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(UINT numParameters, |
| _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters, |
| UINT numStaticSamplers = 0, |
| _In_reads_opt_(numStaticSamplers) |
| const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = NULL, |
| D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) { |
| Init_1_0(numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags); |
| } |
| CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(UINT numParameters, |
| _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER1* _pParameters, |
| UINT numStaticSamplers = 0, |
| _In_reads_opt_(numStaticSamplers) |
| const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = NULL, |
| D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) { |
| Init_1_1(numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags); |
| } |
| CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(CD3DX12_DEFAULT) { Init_1_1(0, NULL, 0, NULL, D3D12_ROOT_SIGNATURE_FLAG_NONE); } |
| |
| inline void Init_1_0(UINT numParameters, _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters, |
| UINT numStaticSamplers = 0, |
| _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = NULL, |
| D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) { |
| Init_1_0(*this, numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags); |
| } |
| |
| static inline void Init_1_0(_Out_ D3D12_VERSIONED_ROOT_SIGNATURE_DESC& desc, UINT numParameters, |
| _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters, |
| UINT numStaticSamplers = 0, |
| _In_reads_opt_(numStaticSamplers) |
| const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = NULL, |
| D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) { |
| desc.Version = D3D_ROOT_SIGNATURE_VERSION_1_0; |
| desc.Desc_1_0.NumParameters = numParameters; |
| desc.Desc_1_0.pParameters = _pParameters; |
| desc.Desc_1_0.NumStaticSamplers = numStaticSamplers; |
| desc.Desc_1_0.pStaticSamplers = _pStaticSamplers; |
| desc.Desc_1_0.Flags = flags; |
| } |
| |
| inline void Init_1_1(UINT numParameters, _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER1* _pParameters, |
| UINT numStaticSamplers = 0, |
| _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = NULL, |
| D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) { |
| Init_1_1(*this, numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags); |
| } |
| |
| static inline void Init_1_1(_Out_ D3D12_VERSIONED_ROOT_SIGNATURE_DESC& desc, UINT numParameters, |
| _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER1* _pParameters, |
| UINT numStaticSamplers = 0, |
| _In_reads_opt_(numStaticSamplers) |
| const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = NULL, |
| D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) { |
| desc.Version = D3D_ROOT_SIGNATURE_VERSION_1_1; |
| desc.Desc_1_1.NumParameters = numParameters; |
| desc.Desc_1_1.pParameters = _pParameters; |
| desc.Desc_1_1.NumStaticSamplers = numStaticSamplers; |
| desc.Desc_1_1.pStaticSamplers = _pStaticSamplers; |
| desc.Desc_1_1.Flags = flags; |
| } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_CPU_DESCRIPTOR_HANDLE : public D3D12_CPU_DESCRIPTOR_HANDLE { |
| CD3DX12_CPU_DESCRIPTOR_HANDLE() {} |
| explicit CD3DX12_CPU_DESCRIPTOR_HANDLE(const D3D12_CPU_DESCRIPTOR_HANDLE& o) : D3D12_CPU_DESCRIPTOR_HANDLE(o) {} |
| CD3DX12_CPU_DESCRIPTOR_HANDLE(CD3DX12_DEFAULT) { ptr = 0; } |
| CD3DX12_CPU_DESCRIPTOR_HANDLE(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE& other, INT offsetScaledByIncrementSize) { |
| InitOffsetted(other, offsetScaledByIncrementSize); |
| } |
| CD3DX12_CPU_DESCRIPTOR_HANDLE(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE& other, INT offsetInDescriptors, |
| UINT descriptorIncrementSize) { |
| InitOffsetted(other, offsetInDescriptors, descriptorIncrementSize); |
| } |
| CD3DX12_CPU_DESCRIPTOR_HANDLE& Offset(INT offsetInDescriptors, UINT descriptorIncrementSize) { |
| ptr += offsetInDescriptors * descriptorIncrementSize; |
| return *this; |
| } |
| CD3DX12_CPU_DESCRIPTOR_HANDLE& Offset(INT offsetScaledByIncrementSize) { |
| ptr += offsetScaledByIncrementSize; |
| return *this; |
| } |
| bool operator==(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE& other) const { return (ptr == other.ptr); } |
| bool operator!=(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE& other) const { return (ptr != other.ptr); } |
| CD3DX12_CPU_DESCRIPTOR_HANDLE& operator=(const D3D12_CPU_DESCRIPTOR_HANDLE& other) { |
| ptr = other.ptr; |
| return *this; |
| } |
| |
| inline void InitOffsetted(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE& base, INT offsetScaledByIncrementSize) { |
| InitOffsetted(*this, base, offsetScaledByIncrementSize); |
| } |
| |
| inline void InitOffsetted(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE& base, INT offsetInDescriptors, |
| UINT descriptorIncrementSize) { |
| InitOffsetted(*this, base, offsetInDescriptors, descriptorIncrementSize); |
| } |
| |
| static inline void InitOffsetted(_Out_ D3D12_CPU_DESCRIPTOR_HANDLE& handle, |
| _In_ const D3D12_CPU_DESCRIPTOR_HANDLE& base, INT offsetScaledByIncrementSize) { |
| handle.ptr = base.ptr + offsetScaledByIncrementSize; |
| } |
| |
| static inline void InitOffsetted(_Out_ D3D12_CPU_DESCRIPTOR_HANDLE& handle, |
| _In_ const D3D12_CPU_DESCRIPTOR_HANDLE& base, INT offsetInDescriptors, |
| UINT descriptorIncrementSize) { |
| handle.ptr = base.ptr + offsetInDescriptors * descriptorIncrementSize; |
| } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_GPU_DESCRIPTOR_HANDLE : public D3D12_GPU_DESCRIPTOR_HANDLE { |
| CD3DX12_GPU_DESCRIPTOR_HANDLE() {} |
| explicit CD3DX12_GPU_DESCRIPTOR_HANDLE(const D3D12_GPU_DESCRIPTOR_HANDLE& o) : D3D12_GPU_DESCRIPTOR_HANDLE(o) {} |
| CD3DX12_GPU_DESCRIPTOR_HANDLE(CD3DX12_DEFAULT) { ptr = 0; } |
| CD3DX12_GPU_DESCRIPTOR_HANDLE(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE& other, INT offsetScaledByIncrementSize) { |
| InitOffsetted(other, offsetScaledByIncrementSize); |
| } |
| CD3DX12_GPU_DESCRIPTOR_HANDLE(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE& other, INT offsetInDescriptors, |
| UINT descriptorIncrementSize) { |
| InitOffsetted(other, offsetInDescriptors, descriptorIncrementSize); |
| } |
| CD3DX12_GPU_DESCRIPTOR_HANDLE& Offset(INT offsetInDescriptors, UINT descriptorIncrementSize) { |
| ptr += offsetInDescriptors * descriptorIncrementSize; |
| return *this; |
| } |
| CD3DX12_GPU_DESCRIPTOR_HANDLE& Offset(INT offsetScaledByIncrementSize) { |
| ptr += offsetScaledByIncrementSize; |
| return *this; |
| } |
| inline bool operator==(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE& other) const { return (ptr == other.ptr); } |
| inline bool operator!=(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE& other) const { return (ptr != other.ptr); } |
| CD3DX12_GPU_DESCRIPTOR_HANDLE& operator=(const D3D12_GPU_DESCRIPTOR_HANDLE& other) { |
| ptr = other.ptr; |
| return *this; |
| } |
| |
| inline void InitOffsetted(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE& base, INT offsetScaledByIncrementSize) { |
| InitOffsetted(*this, base, offsetScaledByIncrementSize); |
| } |
| |
| inline void InitOffsetted(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE& base, INT offsetInDescriptors, |
| UINT descriptorIncrementSize) { |
| InitOffsetted(*this, base, offsetInDescriptors, descriptorIncrementSize); |
| } |
| |
| static inline void InitOffsetted(_Out_ D3D12_GPU_DESCRIPTOR_HANDLE& handle, |
| _In_ const D3D12_GPU_DESCRIPTOR_HANDLE& base, INT offsetScaledByIncrementSize) { |
| handle.ptr = base.ptr + offsetScaledByIncrementSize; |
| } |
| |
| static inline void InitOffsetted(_Out_ D3D12_GPU_DESCRIPTOR_HANDLE& handle, |
| _In_ const D3D12_GPU_DESCRIPTOR_HANDLE& base, INT offsetInDescriptors, |
| UINT descriptorIncrementSize) { |
| handle.ptr = base.ptr + offsetInDescriptors * descriptorIncrementSize; |
| } |
| }; |
| |
| //------------------------------------------------------------------------------------------------ |
| inline UINT D3D12CalcSubresource(UINT MipSlice, UINT ArraySlice, UINT PlaneSlice, UINT MipLevels, UINT ArraySize) { |
| return MipSlice + ArraySlice * MipLevels + PlaneSlice * MipLevels * ArraySize; |
| } |
| |
| //------------------------------------------------------------------------------------------------ |
| template <typename T, typename U, typename V> |
| inline void D3D12DecomposeSubresource(UINT Subresource, UINT MipLevels, UINT ArraySize, _Out_ T& MipSlice, |
| _Out_ U& ArraySlice, _Out_ V& PlaneSlice) { |
| MipSlice = static_cast<T>(Subresource % MipLevels); |
| ArraySlice = static_cast<U>((Subresource / MipLevels) % ArraySize); |
| PlaneSlice = static_cast<V>(Subresource / (MipLevels * ArraySize)); |
| } |
| |
| //------------------------------------------------------------------------------------------------ |
| inline UINT8 D3D12GetFormatPlaneCount(_In_ ID3D12Device* pDevice, DXGI_FORMAT Format) { |
| D3D12_FEATURE_DATA_FORMAT_INFO formatInfo = {Format}; |
| if (FAILED(pDevice->CheckFeatureSupport(D3D12_FEATURE_FORMAT_INFO, &formatInfo, sizeof(formatInfo)))) { |
| return 0; |
| } |
| return formatInfo.PlaneCount; |
| } |
| |
| //------------------------------------------------------------------------------------------------ |
| struct CD3DX12_RESOURCE_DESC : public D3D12_RESOURCE_DESC { |
| CD3DX12_RESOURCE_DESC() {} |
| explicit CD3DX12_RESOURCE_DESC(const D3D12_RESOURCE_DESC& o) : D3D12_RESOURCE_DESC(o) {} |
| CD3DX12_RESOURCE_DESC(D3D12_RESOURCE_DIMENSION dimension, UINT64 alignment, UINT64 width, UINT height, |
| UINT16 depthOrArraySize, UINT16 mipLevels, DXGI_FORMAT format, UINT sampleCount, |
| UINT sampleQuality, D3D12_TEXTURE_LAYOUT layout, D3D12_RESOURCE_FLAGS flags) { |
| Dimension = dimension; |
| Alignment = alignment; |
| Width = width; |
| Height = height; |
| DepthOrArraySize = depthOrArraySize; |
| MipLevels = mipLevels; |
| Format = format; |
| SampleDesc.Count = sampleCount; |
| SampleDesc.Quality = sampleQuality; |
| Layout = layout; |
| Flags = flags; |
| } |
| static inline CD3DX12_RESOURCE_DESC Buffer(const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo, |
| D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE) { |
| return CD3DX12_RESOURCE_DESC(D3D12_RESOURCE_DIMENSION_BUFFER, resAllocInfo.Alignment, resAllocInfo.SizeInBytes, 1, |
| 1, 1, DXGI_FORMAT_UNKNOWN, 1, 0, D3D12_TEXTURE_LAYOUT_ROW_MAJOR, flags); |
| } |
| static inline CD3DX12_RESOURCE_DESC Buffer(UINT64 width, D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE, |
| UINT64 alignment = 0) { |
| return CD3DX12_RESOURCE_DESC(D3D12_RESOURCE_DIMENSION_BUFFER, alignment, width, 1, 1, 1, DXGI_FORMAT_UNKNOWN, 1, 0, |
| D3D12_TEXTURE_LAYOUT_ROW_MAJOR, flags); |
| } |
| static inline CD3DX12_RESOURCE_DESC Tex1D(DXGI_FORMAT format, UINT64 width, UINT16 arraySize = 1, |
| UINT16 mipLevels = 0, D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE, |
| D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN, |
| UINT64 alignment = 0) { |
| return CD3DX12_RESOURCE_DESC(D3D12_RESOURCE_DIMENSION_TEXTURE1D, alignment, width, 1, arraySize, mipLevels, format, |
| 1, 0, layout, flags); |
| } |
| static inline CD3DX12_RESOURCE_DESC Tex2D(DXGI_FORMAT format, UINT64 width, UINT height, UINT16 arraySize = 1, |
| UINT16 mipLevels = 0, UINT sampleCount = 1, UINT sampleQuality = 0, |
| D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE, |
| D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN, |
| UINT64 alignment = 0) { |
| return CD3DX12_RESOURCE_DESC(D3D12_RESOURCE_DIMENSION_TEXTURE2D, alignment, width, height, arraySize, mipLevels, |
| format, sampleCount, sampleQuality, layout, flags); |
| } |
| static inline CD3DX12_RESOURCE_DESC Tex3D(DXGI_FORMAT format, UINT64 width, UINT height, UINT16 depth, |
| UINT16 mipLevels = 0, D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE, |
| D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN, |
| UINT64 alignment = 0) { |
| return CD3DX12_RESOURCE_DESC(D3D12_RESOURCE_DIMENSION_TEXTURE3D, alignment, width, height, depth, mipLevels, format, |
| 1, 0, layout, flags); |
| } |
| inline UINT16 Depth() const { return (Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1); } |
| inline UINT16 ArraySize() const { return (Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1); } |
| inline UINT8 PlaneCount(_In_ ID3D12Device* pDevice) const { return D3D12GetFormatPlaneCount(pDevice, Format); } |
| inline UINT Subresources(_In_ ID3D12Device* pDevice) const { return MipLevels * ArraySize() * PlaneCount(pDevice); } |
| inline UINT CalcSubresource(UINT MipSlice, UINT ArraySlice, UINT PlaneSlice) { |
| return D3D12CalcSubresource(MipSlice, ArraySlice, PlaneSlice, MipLevels, ArraySize()); |
| } |
| operator const D3D12_RESOURCE_DESC&() const { return *this; } |
| }; |
| inline bool operator==(const D3D12_RESOURCE_DESC& l, const D3D12_RESOURCE_DESC& r) { |
| return l.Dimension == r.Dimension && l.Alignment == r.Alignment && l.Width == r.Width && l.Height == r.Height && |
| l.DepthOrArraySize == r.DepthOrArraySize && l.MipLevels == r.MipLevels && l.Format == r.Format && |
| l.SampleDesc.Count == r.SampleDesc.Count && l.SampleDesc.Quality == r.SampleDesc.Quality && |
| l.Layout == r.Layout && l.Flags == r.Flags; |
| } |
| inline bool operator!=(const D3D12_RESOURCE_DESC& l, const D3D12_RESOURCE_DESC& r) { return !(l == r); } |
| |
| //------------------------------------------------------------------------------------------------ |
| // Row-by-row memcpy |
| inline void MemcpySubresource(_In_ const D3D12_MEMCPY_DEST* pDest, _In_ const D3D12_SUBRESOURCE_DATA* pSrc, |
| SIZE_T RowSizeInBytes, UINT NumRows, UINT NumSlices) { |
| for (UINT z = 0; z < NumSlices; ++z) { |
| BYTE* pDestSlice = reinterpret_cast<BYTE*>(pDest->pData) + pDest->SlicePitch * z; |
| const BYTE* pSrcSlice = reinterpret_cast<const BYTE*>(pSrc->pData) + pSrc->SlicePitch * z; |
| for (UINT y = 0; y < NumRows; ++y) { |
| memcpy(pDestSlice + pDest->RowPitch * y, pSrcSlice + pSrc->RowPitch * y, RowSizeInBytes); |
| } |
| } |
| } |
| |
| //------------------------------------------------------------------------------------------------ |
| // Returns required size of a buffer to be used for data upload |
| inline UINT64 GetRequiredIntermediateSize(_In_ ID3D12Resource* pDestinationResource, |
| _In_range_(0, D3D12_REQ_SUBRESOURCES) UINT FirstSubresource, |
| _In_range_(0, D3D12_REQ_SUBRESOURCES - FirstSubresource) |
| UINT NumSubresources) { |
| D3D12_RESOURCE_DESC Desc = pDestinationResource->GetDesc(); |
| UINT64 RequiredSize = 0; |
| |
| ID3D12Device* pDevice; |
| pDestinationResource->GetDevice(__uuidof(*pDevice), reinterpret_cast<void**>(&pDevice)); |
| pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, 0, nullptr, nullptr, nullptr, &RequiredSize); |
| pDevice->Release(); |
| |
| return RequiredSize; |
| } |
| |
| //------------------------------------------------------------------------------------------------ |
| // All arrays must be populated (e.g. by calling GetCopyableFootprints) |
| inline UINT64 UpdateSubresources(_In_ ID3D12GraphicsCommandList* pCmdList, _In_ ID3D12Resource* pDestinationResource, |
| _In_ ID3D12Resource* pIntermediate, |
| _In_range_(0, D3D12_REQ_SUBRESOURCES) UINT FirstSubresource, |
| _In_range_(0, D3D12_REQ_SUBRESOURCES - FirstSubresource) UINT NumSubresources, |
| UINT64 RequiredSize, |
| _In_reads_(NumSubresources) const D3D12_PLACED_SUBRESOURCE_FOOTPRINT* pLayouts, |
| _In_reads_(NumSubresources) const UINT* pNumRows, |
| _In_reads_(NumSubresources) const UINT64* pRowSizesInBytes, |
| _In_reads_(NumSubresources) const D3D12_SUBRESOURCE_DATA* pSrcData) { |
| // Minor validation |
| D3D12_RESOURCE_DESC IntermediateDesc = pIntermediate->GetDesc(); |
| D3D12_RESOURCE_DESC DestinationDesc = pDestinationResource->GetDesc(); |
| if (IntermediateDesc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER || |
| IntermediateDesc.Width < RequiredSize + pLayouts[0].Offset || RequiredSize > (SIZE_T)-1 || |
| (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER && |
| (FirstSubresource != 0 || NumSubresources != 1))) { |
| return 0; |
| } |
| |
| BYTE* pData; |
| HRESULT hr = pIntermediate->Map(0, NULL, reinterpret_cast<void**>(&pData)); |
| if (FAILED(hr)) { |
| return 0; |
| } |
| |
| for (UINT i = 0; i < NumSubresources; ++i) { |
| if (pRowSizesInBytes[i] > (SIZE_T)-1) return 0; |
| D3D12_MEMCPY_DEST DestData = {pData + pLayouts[i].Offset, pLayouts[i].Footprint.RowPitch, |
| pLayouts[i].Footprint.RowPitch * pNumRows[i]}; |
| MemcpySubresource(&DestData, &pSrcData[i], (SIZE_T)pRowSizesInBytes[i], pNumRows[i], pLayouts[i].Footprint.Depth); |
| } |
| pIntermediate->Unmap(0, NULL); |
| |
| if (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER) { |
| CD3DX12_BOX SrcBox(UINT(pLayouts[0].Offset), UINT(pLayouts[0].Offset + pLayouts[0].Footprint.Width)); |
| pCmdList->CopyBufferRegion(pDestinationResource, 0, pIntermediate, pLayouts[0].Offset, pLayouts[0].Footprint.Width); |
| } else { |
| for (UINT i = 0; i < NumSubresources; ++i) { |
| CD3DX12_TEXTURE_COPY_LOCATION Dst(pDestinationResource, i + FirstSubresource); |
| CD3DX12_TEXTURE_COPY_LOCATION Src(pIntermediate, pLayouts[i]); |
| pCmdList->CopyTextureRegion(&Dst, 0, 0, 0, &Src, nullptr); |
| } |
| } |
| return RequiredSize; |
| } |
| |
| //------------------------------------------------------------------------------------------------ |
| // Heap-allocating UpdateSubresources implementation |
| inline UINT64 UpdateSubresources(_In_ ID3D12GraphicsCommandList* pCmdList, _In_ ID3D12Resource* pDestinationResource, |
| _In_ ID3D12Resource* pIntermediate, UINT64 IntermediateOffset, |
| _In_range_(0, D3D12_REQ_SUBRESOURCES) UINT FirstSubresource, |
| _In_range_(0, D3D12_REQ_SUBRESOURCES - FirstSubresource) UINT NumSubresources, |
| _In_reads_(NumSubresources) D3D12_SUBRESOURCE_DATA* pSrcData) { |
| UINT64 RequiredSize = 0; |
| UINT64 MemToAlloc = |
| static_cast<UINT64>(sizeof(D3D12_PLACED_SUBRESOURCE_FOOTPRINT) + sizeof(UINT) + sizeof(UINT64)) * NumSubresources; |
| if (MemToAlloc > SIZE_MAX) { |
| return 0; |
| } |
| void* pMem = HeapAlloc(GetProcessHeap(), 0, static_cast<SIZE_T>(MemToAlloc)); |
| if (pMem == NULL) { |
| return 0; |
| } |
| D3D12_PLACED_SUBRESOURCE_FOOTPRINT* pLayouts = reinterpret_cast<D3D12_PLACED_SUBRESOURCE_FOOTPRINT*>(pMem); |
| UINT64* pRowSizesInBytes = reinterpret_cast<UINT64*>(pLayouts + NumSubresources); |
| UINT* pNumRows = reinterpret_cast<UINT*>(pRowSizesInBytes + NumSubresources); |
| |
| D3D12_RESOURCE_DESC Desc = pDestinationResource->GetDesc(); |
| ID3D12Device* pDevice; |
| pDestinationResource->GetDevice(__uuidof(*pDevice), reinterpret_cast<void**>(&pDevice)); |
| pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, IntermediateOffset, pLayouts, pNumRows, |
| pRowSizesInBytes, &RequiredSize); |
| pDevice->Release(); |
| |
| UINT64 Result = UpdateSubresources(pCmdList, pDestinationResource, pIntermediate, FirstSubresource, NumSubresources, |
| RequiredSize, pLayouts, pNumRows, pRowSizesInBytes, pSrcData); |
| HeapFree(GetProcessHeap(), 0, pMem); |
| return Result; |
| } |
| |
| //------------------------------------------------------------------------------------------------ |
| // Stack-allocating UpdateSubresources implementation |
| template <UINT MaxSubresources> |
| inline UINT64 UpdateSubresources(_In_ ID3D12GraphicsCommandList* pCmdList, _In_ ID3D12Resource* pDestinationResource, |
| _In_ ID3D12Resource* pIntermediate, UINT64 IntermediateOffset, |
| _In_range_(0, MaxSubresources) UINT FirstSubresource, |
| _In_range_(1, MaxSubresources - FirstSubresource) UINT NumSubresources, |
| _In_reads_(NumSubresources) D3D12_SUBRESOURCE_DATA* pSrcData) { |
| UINT64 RequiredSize = 0; |
| D3D12_PLACED_SUBRESOURCE_FOOTPRINT Layouts[MaxSubresources]; |
| UINT NumRows[MaxSubresources]; |
| UINT64 RowSizesInBytes[MaxSubresources]; |
| |
| D3D12_RESOURCE_DESC Desc = pDestinationResource->GetDesc(); |
| ID3D12Device* pDevice; |
| pDestinationResource->GetDevice(__uuidof(*pDevice), reinterpret_cast<void**>(&pDevice)); |
| pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, IntermediateOffset, Layouts, NumRows, |
| RowSizesInBytes, &RequiredSize); |
| pDevice->Release(); |
| |
| return UpdateSubresources(pCmdList, pDestinationResource, pIntermediate, FirstSubresource, NumSubresources, |
| RequiredSize, Layouts, NumRows, RowSizesInBytes, pSrcData); |
| } |
| |
| //------------------------------------------------------------------------------------------------ |
| inline bool D3D12IsLayoutOpaque(D3D12_TEXTURE_LAYOUT Layout) { |
| return Layout == D3D12_TEXTURE_LAYOUT_UNKNOWN || Layout == D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE; |
| } |
| |
| //------------------------------------------------------------------------------------------------ |
| inline ID3D12CommandList* const* CommandListCast(ID3D12GraphicsCommandList* const* pp) { |
| // This cast is useful for passing strongly typed command list pointers into |
| // ExecuteCommandLists. |
| // This cast is valid as long as the const-ness is respected. D3D12 APIs do |
| // respect the const-ness of their arguments. |
| return reinterpret_cast<ID3D12CommandList* const*>(pp); |
| } |
| |
| //------------------------------------------------------------------------------------------------ |
| // D3D12 exports a new method for serializing root signatures in the Windows 10 Anniversary Update. |
| // To help enable root signature 1.1 features when they are available and not require maintaining |
| // two code paths for building root signatures, this helper method reconstructs a 1.0 signature when |
| // 1.1 is not supported. |
| inline HRESULT D3DX12SerializeVersionedRootSignature(_In_ const D3D12_VERSIONED_ROOT_SIGNATURE_DESC* pRootSignatureDesc, |
| D3D_ROOT_SIGNATURE_VERSION MaxVersion, _Outptr_ ID3DBlob** ppBlob, |
| _Always_(_Outptr_opt_result_maybenull_) ID3DBlob** ppErrorBlob) { |
| if (ppErrorBlob != NULL) { |
| *ppErrorBlob = NULL; |
| } |
| |
| switch (MaxVersion) { |
| case D3D_ROOT_SIGNATURE_VERSION_1_0: |
| switch (pRootSignatureDesc->Version) { |
| case D3D_ROOT_SIGNATURE_VERSION_1_0: |
| return D3D12SerializeRootSignature(&pRootSignatureDesc->Desc_1_0, D3D_ROOT_SIGNATURE_VERSION_1, ppBlob, |
| ppErrorBlob); |
| |
| case D3D_ROOT_SIGNATURE_VERSION_1_1: { |
| HRESULT hr = S_OK; |
| const D3D12_ROOT_SIGNATURE_DESC1& desc_1_1 = pRootSignatureDesc->Desc_1_1; |
| |
| const SIZE_T ParametersSize = sizeof(D3D12_ROOT_PARAMETER) * desc_1_1.NumParameters; |
| void* pParameters = (ParametersSize > 0) ? HeapAlloc(GetProcessHeap(), 0, ParametersSize) : NULL; |
| if (ParametersSize > 0 && pParameters == NULL) { |
| hr = E_OUTOFMEMORY; |
| } |
| D3D12_ROOT_PARAMETER* pParameters_1_0 = reinterpret_cast<D3D12_ROOT_PARAMETER*>(pParameters); |
| |
| if (SUCCEEDED(hr)) { |
| for (UINT n = 0; n < desc_1_1.NumParameters; n++) { |
| __analysis_assume(ParametersSize == sizeof(D3D12_ROOT_PARAMETER) * desc_1_1.NumParameters); |
| pParameters_1_0[n].ParameterType = desc_1_1.pParameters[n].ParameterType; |
| pParameters_1_0[n].ShaderVisibility = desc_1_1.pParameters[n].ShaderVisibility; |
| |
| switch (desc_1_1.pParameters[n].ParameterType) { |
| case D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS: |
| pParameters_1_0[n].Constants.Num32BitValues = desc_1_1.pParameters[n].Constants.Num32BitValues; |
| pParameters_1_0[n].Constants.RegisterSpace = desc_1_1.pParameters[n].Constants.RegisterSpace; |
| pParameters_1_0[n].Constants.ShaderRegister = desc_1_1.pParameters[n].Constants.ShaderRegister; |
| break; |
| |
| case D3D12_ROOT_PARAMETER_TYPE_CBV: |
| case D3D12_ROOT_PARAMETER_TYPE_SRV: |
| case D3D12_ROOT_PARAMETER_TYPE_UAV: |
| pParameters_1_0[n].Descriptor.RegisterSpace = desc_1_1.pParameters[n].Descriptor.RegisterSpace; |
| pParameters_1_0[n].Descriptor.ShaderRegister = desc_1_1.pParameters[n].Descriptor.ShaderRegister; |
| break; |
| |
| case D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE: |
| const D3D12_ROOT_DESCRIPTOR_TABLE1& table_1_1 = desc_1_1.pParameters[n].DescriptorTable; |
| |
| const SIZE_T DescriptorRangesSize = sizeof(D3D12_DESCRIPTOR_RANGE) * table_1_1.NumDescriptorRanges; |
| void* pDescriptorRanges = (DescriptorRangesSize > 0 && SUCCEEDED(hr)) |
| ? HeapAlloc(GetProcessHeap(), 0, DescriptorRangesSize) |
| : NULL; |
| if (DescriptorRangesSize > 0 && pDescriptorRanges == NULL) { |
| hr = E_OUTOFMEMORY; |
| } |
| D3D12_DESCRIPTOR_RANGE* pDescriptorRanges_1_0 = |
| reinterpret_cast<D3D12_DESCRIPTOR_RANGE*>(pDescriptorRanges); |
| |
| if (SUCCEEDED(hr)) { |
| for (UINT x = 0; x < table_1_1.NumDescriptorRanges; x++) { |
| __analysis_assume(DescriptorRangesSize == |
| sizeof(D3D12_DESCRIPTOR_RANGE) * table_1_1.NumDescriptorRanges); |
| pDescriptorRanges_1_0[x].BaseShaderRegister = table_1_1.pDescriptorRanges[x].BaseShaderRegister; |
| pDescriptorRanges_1_0[x].NumDescriptors = table_1_1.pDescriptorRanges[x].NumDescriptors; |
| pDescriptorRanges_1_0[x].OffsetInDescriptorsFromTableStart = |
| table_1_1.pDescriptorRanges[x].OffsetInDescriptorsFromTableStart; |
| pDescriptorRanges_1_0[x].RangeType = table_1_1.pDescriptorRanges[x].RangeType; |
| pDescriptorRanges_1_0[x].RegisterSpace = table_1_1.pDescriptorRanges[x].RegisterSpace; |
| } |
| } |
| |
| D3D12_ROOT_DESCRIPTOR_TABLE& table_1_0 = pParameters_1_0[n].DescriptorTable; |
| table_1_0.NumDescriptorRanges = table_1_1.NumDescriptorRanges; |
| table_1_0.pDescriptorRanges = pDescriptorRanges_1_0; |
| } |
| } |
| } |
| |
| if (SUCCEEDED(hr)) { |
| 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); |
| hr = D3D12SerializeRootSignature(&desc_1_0, D3D_ROOT_SIGNATURE_VERSION_1, ppBlob, ppErrorBlob); |
| } |
| |
| if (pParameters) { |
| for (UINT n = 0; n < desc_1_1.NumParameters; n++) { |
| if (desc_1_1.pParameters[n].ParameterType == D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE) { |
| HeapFree(GetProcessHeap(), 0, |
| reinterpret_cast<void*>(const_cast<D3D12_DESCRIPTOR_RANGE*>( |
| pParameters_1_0[n].DescriptorTable.pDescriptorRanges))); |
| } |
| } |
| HeapFree(GetProcessHeap(), 0, pParameters); |
| } |
| return hr; |
| } |
| } |
| break; |
| |
| case D3D_ROOT_SIGNATURE_VERSION_1_1: |
| return D3D12SerializeVersionedRootSignature(pRootSignatureDesc, ppBlob, ppErrorBlob); |
| } |
| |
| return E_INVALIDARG; |
| } |
| |
| #endif // defined( __cplusplus ) |
| |
| #endif //__D3DX12_H__ |