mirror of
https://github.com/elwrcl/intel-hard-graphics.git
synced 2026-11-01 03:18:02 +03:00
246 lines
10 KiB
C++
246 lines
10 KiB
C++
/*
|
||
* Copyright © Microsoft Corporation
|
||
*
|
||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||
* copy of this software and associated documentation files (the "Software"),
|
||
* to deal in the Software without restriction, including without limitation
|
||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||
* and/or sell copies of the Software, and to permit persons to whom the
|
||
* Software is furnished to do so, subject to the following conditions:
|
||
*
|
||
* The above copyright notice and this permission notice (including the next
|
||
* paragraph) shall be included in all copies or substantial portions of the
|
||
* Software.
|
||
*
|
||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||
* IN THE SOFTWARE.
|
||
*/
|
||
|
||
#ifndef D3D12_UTIL_H
|
||
#define D3D12_UTIL_H
|
||
|
||
//------------------------------------------------------------------------------------------------
|
||
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 ) noexcept
|
||
{
|
||
MipSlice = static_cast<T>(Subresource % MipLevels);
|
||
ArraySlice = static_cast<U>((Subresource / MipLevels) % ArraySize);
|
||
PlaneSlice = static_cast<V>(Subresource / (MipLevels * ArraySize));
|
||
}
|
||
|
||
//------------------------------------------------------------------------------------------------
|
||
constexpr UINT D3D12CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT PlaneSlice, UINT MipLevels, UINT ArraySize ) noexcept
|
||
{
|
||
return MipSlice + ArraySlice * MipLevels + PlaneSlice * MipLevels * ArraySize;
|
||
}
|
||
|
||
//------------------------------------------------------------------------------------------------
|
||
struct CD3DX12_RESOURCE_BARRIER : public D3D12_RESOURCE_BARRIER
|
||
{
|
||
CD3DX12_RESOURCE_BARRIER() = default;
|
||
explicit CD3DX12_RESOURCE_BARRIER(const D3D12_RESOURCE_BARRIER &o) noexcept :
|
||
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) noexcept
|
||
{
|
||
CD3DX12_RESOURCE_BARRIER 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) noexcept
|
||
{
|
||
CD3DX12_RESOURCE_BARRIER 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) noexcept
|
||
{
|
||
CD3DX12_RESOURCE_BARRIER result = {};
|
||
D3D12_RESOURCE_BARRIER &barrier = result;
|
||
result.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV;
|
||
barrier.UAV.pResource = pResource;
|
||
return result;
|
||
}
|
||
};
|
||
|
||
//------------------------------------------------------------------------------------------------
|
||
struct CD3DX12_RESOURCE_DESC : public D3D12_RESOURCE_DESC
|
||
{
|
||
CD3DX12_RESOURCE_DESC() = default;
|
||
explicit CD3DX12_RESOURCE_DESC( const D3D12_RESOURCE_DESC& o ) noexcept :
|
||
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 ) noexcept
|
||
{
|
||
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 ) noexcept
|
||
{
|
||
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 ) noexcept
|
||
{
|
||
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 ) noexcept
|
||
{
|
||
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 ) noexcept
|
||
{
|
||
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 ) noexcept
|
||
{
|
||
return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_TEXTURE3D, alignment, width, height, depth,
|
||
mipLevels, format, 1, 0, layout, flags );
|
||
}
|
||
inline UINT16 Depth() const noexcept
|
||
{ return (Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1u); }
|
||
inline UINT16 ArraySize() const noexcept
|
||
{ return (Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1u); }
|
||
inline UINT CalcSubresource(UINT MipSlice, UINT ArraySlice, UINT PlaneSlice) noexcept
|
||
{ return D3D12CalcSubresource(MipSlice, ArraySlice, PlaneSlice, MipLevels, ArraySize()); }
|
||
};
|
||
inline bool operator==( const D3D12_RESOURCE_DESC& l, const D3D12_RESOURCE_DESC& r ) noexcept
|
||
{
|
||
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 ) noexcept
|
||
{ return !( l == r ); }
|
||
|
||
|
||
//------------------------------------------------------------------------------------------------
|
||
struct CD3DX12_HEAP_PROPERTIES : public D3D12_HEAP_PROPERTIES
|
||
{
|
||
CD3DX12_HEAP_PROPERTIES() = default;
|
||
explicit CD3DX12_HEAP_PROPERTIES(const D3D12_HEAP_PROPERTIES &o) noexcept :
|
||
D3D12_HEAP_PROPERTIES(o)
|
||
{}
|
||
CD3DX12_HEAP_PROPERTIES(
|
||
D3D12_CPU_PAGE_PROPERTY cpuPageProperty,
|
||
D3D12_MEMORY_POOL memoryPoolPreference,
|
||
UINT creationNodeMask = 1,
|
||
UINT nodeMask = 1 ) noexcept
|
||
{
|
||
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 ) noexcept
|
||
{
|
||
Type = type;
|
||
CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
|
||
MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
|
||
CreationNodeMask = creationNodeMask;
|
||
VisibleNodeMask = nodeMask;
|
||
}
|
||
bool IsCPUAccessible() const noexcept
|
||
{
|
||
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 ) noexcept
|
||
{
|
||
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 ) noexcept
|
||
{ return !( l == r ); }
|
||
|
||
#endif |