Refactor enum flags with __underlying_type and new EnumHasAnyFlags/EnumHasAllFlags
Fixes #832 Closes #886
This commit is contained in:
@@ -76,21 +76,20 @@ bool GPUBufferDX11::OnInit()
|
||||
bufferDesc.CPUAccessFlags = RenderToolsDX::GetDX11CpuAccessFlagsFromUsage(_desc.Usage);
|
||||
bufferDesc.MiscFlags = 0;
|
||||
bufferDesc.StructureByteStride = 0;
|
||||
//
|
||||
if (_desc.Flags & GPUBufferFlags::VertexBuffer)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::VertexBuffer))
|
||||
bufferDesc.BindFlags |= D3D11_BIND_VERTEX_BUFFER;
|
||||
if (_desc.Flags & GPUBufferFlags::IndexBuffer)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::IndexBuffer))
|
||||
bufferDesc.BindFlags |= D3D11_BIND_INDEX_BUFFER;
|
||||
if (useSRV)
|
||||
bufferDesc.BindFlags |= D3D11_BIND_SHADER_RESOURCE;
|
||||
if (useUAV)
|
||||
bufferDesc.BindFlags |= D3D11_BIND_UNORDERED_ACCESS;
|
||||
//
|
||||
if (_desc.Flags & GPUBufferFlags::Argument)
|
||||
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::Argument))
|
||||
bufferDesc.MiscFlags |= D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS;
|
||||
if (_desc.Flags & GPUBufferFlags::RawBuffer)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::RawBuffer))
|
||||
bufferDesc.MiscFlags |= D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS;
|
||||
if (_desc.Flags & GPUBufferFlags::Structured)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::Structured))
|
||||
{
|
||||
bufferDesc.MiscFlags |= D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
|
||||
bufferDesc.StructureByteStride = _desc.Stride;
|
||||
@@ -115,7 +114,7 @@ bool GPUBufferDX11::OnInit()
|
||||
if (useSRV)
|
||||
{
|
||||
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
|
||||
if (_desc.Flags & GPUBufferFlags::RawBuffer)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::RawBuffer))
|
||||
{
|
||||
srvDesc.Format = DXGI_FORMAT_R32_TYPELESS;
|
||||
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFEREX;
|
||||
@@ -125,7 +124,7 @@ bool GPUBufferDX11::OnInit()
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_desc.Flags & GPUBufferFlags::Structured)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::Structured))
|
||||
srvDesc.Format = DXGI_FORMAT_UNKNOWN;
|
||||
else
|
||||
srvDesc.Format = RenderToolsDX::ToDxgiFormat(PixelFormatExtensions::FindShaderResourceFormat(_desc.Format, false));
|
||||
@@ -144,13 +143,13 @@ bool GPUBufferDX11::OnInit()
|
||||
uavDesc.Buffer.FirstElement = 0;
|
||||
uavDesc.Buffer.NumElements = numElements;
|
||||
uavDesc.Buffer.Flags = 0;
|
||||
if (_desc.Flags & GPUBufferFlags::RawBuffer)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::RawBuffer))
|
||||
uavDesc.Buffer.Flags |= D3D11_BUFFER_UAV_FLAG_RAW;
|
||||
if (_desc.Flags & GPUBufferFlags::Append)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::Append))
|
||||
uavDesc.Buffer.Flags |= D3D11_BUFFER_UAV_FLAG_APPEND;
|
||||
if (_desc.Flags & GPUBufferFlags::Counter)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::Counter))
|
||||
uavDesc.Buffer.Flags |= D3D11_BUFFER_UAV_FLAG_COUNTER;
|
||||
if (_desc.Flags & GPUBufferFlags::Structured)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::Structured))
|
||||
uavDesc.Format = DXGI_FORMAT_UNKNOWN;
|
||||
else
|
||||
uavDesc.Format = RenderToolsDX::ToDxgiFormat(PixelFormatExtensions::FindUnorderedAccessFormat(_desc.Format));
|
||||
|
||||
@@ -472,7 +472,7 @@ void GPUContextDX11::DrawIndexedInstanced(uint32 indicesCount, uint32 instanceCo
|
||||
|
||||
void GPUContextDX11::DrawInstancedIndirect(GPUBuffer* bufferForArgs, uint32 offsetForArgs)
|
||||
{
|
||||
ASSERT(bufferForArgs && bufferForArgs->GetFlags() & GPUBufferFlags::Argument);
|
||||
ASSERT(bufferForArgs && EnumHasAnyFlags(bufferForArgs->GetFlags(), GPUBufferFlags::Argument));
|
||||
|
||||
const auto bufferForArgsDX11 = static_cast<GPUBufferDX11*>(bufferForArgs);
|
||||
|
||||
@@ -483,7 +483,7 @@ void GPUContextDX11::DrawInstancedIndirect(GPUBuffer* bufferForArgs, uint32 offs
|
||||
|
||||
void GPUContextDX11::DrawIndexedInstancedIndirect(GPUBuffer* bufferForArgs, uint32 offsetForArgs)
|
||||
{
|
||||
ASSERT(bufferForArgs && bufferForArgs->GetFlags() & GPUBufferFlags::Argument);
|
||||
ASSERT(bufferForArgs && EnumHasAnyFlags(bufferForArgs->GetFlags(), GPUBufferFlags::Argument));
|
||||
|
||||
const auto bufferForArgsDX11 = static_cast<GPUBufferDX11*>(bufferForArgs);
|
||||
|
||||
|
||||
@@ -494,7 +494,7 @@ void GPUTextureDX11::initHandles()
|
||||
}
|
||||
|
||||
// Read-only depth-stencil
|
||||
if (_desc.Flags & GPUTextureFlags::ReadOnlyDepthView)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUTextureFlags::ReadOnlyDepthView))
|
||||
{
|
||||
CLEAR_VIEWS();
|
||||
|
||||
|
||||
@@ -172,7 +172,7 @@ bool GPUBufferDX12::OnInit()
|
||||
}
|
||||
|
||||
// Check if need to use a counter
|
||||
if (_desc.Flags & GPUBufferFlags::Counter || _desc.Flags & GPUBufferFlags::Append)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::Counter) || EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::Append))
|
||||
{
|
||||
#if GPU_ENABLE_RESOURCE_NAMING
|
||||
String name = String(GetName()) + TEXT(".Counter");
|
||||
@@ -192,7 +192,7 @@ bool GPUBufferDX12::OnInit()
|
||||
if (useSRV)
|
||||
{
|
||||
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc;
|
||||
if (_desc.Flags & GPUBufferFlags::RawBuffer)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::RawBuffer))
|
||||
srvDesc.Format = RenderToolsDX::ToDxgiFormat(_desc.Format);
|
||||
else
|
||||
srvDesc.Format = RenderToolsDX::ToDxgiFormat(PixelFormatExtensions::FindShaderResourceFormat(_desc.Format, false));
|
||||
@@ -201,7 +201,7 @@ bool GPUBufferDX12::OnInit()
|
||||
srvDesc.Buffer.FirstElement = 0;
|
||||
srvDesc.Buffer.NumElements = numElements;
|
||||
srvDesc.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_NONE;
|
||||
if (_desc.Flags & GPUBufferFlags::Structured)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::Structured))
|
||||
{
|
||||
srvDesc.Buffer.StructureByteStride = _desc.Stride;
|
||||
srvDesc.Format = DXGI_FORMAT_UNKNOWN;
|
||||
@@ -210,7 +210,7 @@ bool GPUBufferDX12::OnInit()
|
||||
{
|
||||
srvDesc.Buffer.StructureByteStride = 0;
|
||||
}
|
||||
if (_desc.Flags & GPUBufferFlags::RawBuffer)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::RawBuffer))
|
||||
srvDesc.Buffer.Flags |= D3D12_BUFFER_SRV_FLAG_RAW;
|
||||
_view.SetSRV(srvDesc);
|
||||
}
|
||||
@@ -223,11 +223,11 @@ bool GPUBufferDX12::OnInit()
|
||||
uavDesc.Buffer.CounterOffsetInBytes = 0;
|
||||
uavDesc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_NONE;
|
||||
uavDesc.Buffer.NumElements = numElements;
|
||||
if (_desc.Flags & GPUBufferFlags::Structured)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::Structured))
|
||||
uavDesc.Buffer.StructureByteStride = _desc.Stride;
|
||||
if (_desc.Flags & GPUBufferFlags::RawBuffer)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::RawBuffer))
|
||||
uavDesc.Buffer.Flags |= D3D12_BUFFER_UAV_FLAG_RAW;
|
||||
if (_desc.Flags & GPUBufferFlags::Structured)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::Structured))
|
||||
uavDesc.Format = DXGI_FORMAT_UNKNOWN;
|
||||
else
|
||||
uavDesc.Format = RenderToolsDX::ToDxgiFormat(PixelFormatExtensions::FindUnorderedAccessFormat(_desc.Format));
|
||||
|
||||
@@ -1100,7 +1100,7 @@ void GPUContextDX12::DrawIndexedInstanced(uint32 indicesCount, uint32 instanceCo
|
||||
|
||||
void GPUContextDX12::DrawInstancedIndirect(GPUBuffer* bufferForArgs, uint32 offsetForArgs)
|
||||
{
|
||||
ASSERT(bufferForArgs && bufferForArgs->GetFlags() & GPUBufferFlags::Argument);
|
||||
ASSERT(bufferForArgs && EnumHasAnyFlags(bufferForArgs->GetFlags(), GPUBufferFlags::Argument));
|
||||
|
||||
auto bufferForArgsDX12 = (GPUBufferDX12*)bufferForArgs;
|
||||
auto signature = _device->DrawIndirectCommandSignature->GetSignature();
|
||||
@@ -1113,7 +1113,7 @@ void GPUContextDX12::DrawInstancedIndirect(GPUBuffer* bufferForArgs, uint32 offs
|
||||
|
||||
void GPUContextDX12::DrawIndexedInstancedIndirect(GPUBuffer* bufferForArgs, uint32 offsetForArgs)
|
||||
{
|
||||
ASSERT(bufferForArgs && bufferForArgs->GetFlags() & GPUBufferFlags::Argument);
|
||||
ASSERT(bufferForArgs && EnumHasAnyFlags(bufferForArgs->GetFlags(), GPUBufferFlags::Argument));
|
||||
|
||||
auto bufferForArgsDX12 = (GPUBufferDX12*)bufferForArgs;
|
||||
auto signature = _device->DrawIndexedIndirectCommandSignature->GetSignature();
|
||||
|
||||
@@ -691,7 +691,7 @@ void GPUTextureDX12::initHandles()
|
||||
}
|
||||
|
||||
// Read-only depth-stencil
|
||||
if (_desc.Flags & GPUTextureFlags::ReadOnlyDepthView)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUTextureFlags::ReadOnlyDepthView))
|
||||
{
|
||||
_handleReadOnlyDepth.Init(this, _device, this, format, msaa);
|
||||
_handleReadOnlyDepth.ReadOnlyDepthView = true;
|
||||
|
||||
@@ -197,7 +197,7 @@ public:
|
||||
// [IShaderResourceDX12]
|
||||
bool IsDepthStencilResource() const override
|
||||
{
|
||||
return (_desc.Flags & GPUTextureFlags::DepthStencil) != 0;
|
||||
return (_desc.Flags & GPUTextureFlags::DepthStencil) != GPUTextureFlags::None;
|
||||
}
|
||||
D3D12_CPU_DESCRIPTOR_HANDLE SRV() const override
|
||||
{
|
||||
|
||||
@@ -100,19 +100,19 @@ bool GPUBufferVulkan::OnInit()
|
||||
bufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
|
||||
if (useSRV && !(_desc.Flags & GPUBufferFlags::Structured))
|
||||
bufferInfo.usage |= VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
|
||||
if (useUAV || _desc.Flags & GPUBufferFlags::RawBuffer || _desc.Flags & GPUBufferFlags::Structured)
|
||||
if (useUAV || EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::RawBuffer | GPUBufferFlags::Structured))
|
||||
bufferInfo.usage |= VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
|
||||
if (useUAV && useSRV)
|
||||
bufferInfo.usage |= VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
|
||||
if (_desc.Flags & GPUBufferFlags::Argument)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::Argument))
|
||||
bufferInfo.usage |= VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
|
||||
if (_desc.Flags & GPUBufferFlags::Argument && useUAV)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::Argument) && useUAV)
|
||||
bufferInfo.usage |= VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT; // For some reason, glslang marks indirect uav buffers (UpdateProbesInitArgs, IndirectArgsBuffer) as Storage Texel Buffers
|
||||
if (_desc.Flags & GPUBufferFlags::VertexBuffer)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::VertexBuffer))
|
||||
bufferInfo.usage |= VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
|
||||
if (_desc.Flags & GPUBufferFlags::IndexBuffer)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::IndexBuffer))
|
||||
bufferInfo.usage |= VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
|
||||
if (IsStaging() || _desc.Flags & GPUBufferFlags::UnorderedAccess)
|
||||
if (IsStaging() || EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::UnorderedAccess))
|
||||
bufferInfo.usage |= VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
|
||||
|
||||
// Create buffer
|
||||
@@ -162,7 +162,7 @@ bool GPUBufferVulkan::OnInit()
|
||||
}
|
||||
|
||||
// Check if need to use a counter
|
||||
if (_desc.Flags & GPUBufferFlags::Counter || _desc.Flags & GPUBufferFlags::Append)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::Counter | GPUBufferFlags::Append))
|
||||
{
|
||||
#if GPU_ENABLE_RESOURCE_NAMING
|
||||
String name = String(GetName()) + TEXT(".Counter");
|
||||
|
||||
@@ -1215,7 +1215,7 @@ void GPUContextVulkan::DrawIndexedInstanced(uint32 indicesCount, uint32 instance
|
||||
|
||||
void GPUContextVulkan::DrawInstancedIndirect(GPUBuffer* bufferForArgs, uint32 offsetForArgs)
|
||||
{
|
||||
ASSERT(bufferForArgs && bufferForArgs->GetFlags() & GPUBufferFlags::Argument);
|
||||
ASSERT(bufferForArgs && EnumHasAnyFlags(bufferForArgs->GetFlags(), GPUBufferFlags::Argument));
|
||||
|
||||
auto bufferForArgsVK = (GPUBufferVulkan*)bufferForArgs;
|
||||
const auto cmdBuffer = _cmdBufferManager->GetCmdBuffer();
|
||||
@@ -1226,7 +1226,7 @@ void GPUContextVulkan::DrawInstancedIndirect(GPUBuffer* bufferForArgs, uint32 of
|
||||
|
||||
void GPUContextVulkan::DrawIndexedInstancedIndirect(GPUBuffer* bufferForArgs, uint32 offsetForArgs)
|
||||
{
|
||||
ASSERT(bufferForArgs && bufferForArgs->GetFlags() & GPUBufferFlags::Argument);
|
||||
ASSERT(bufferForArgs && EnumHasAnyFlags(bufferForArgs->GetFlags(), GPUBufferFlags::Argument));
|
||||
|
||||
auto bufferForArgsVK = (GPUBufferVulkan*)bufferForArgs;
|
||||
const auto cmdBuffer = _cmdBufferManager->GetCmdBuffer();
|
||||
|
||||
@@ -1322,19 +1322,19 @@ PixelFormat GPUDeviceVulkan::GetClosestSupportedPixelFormat(PixelFormat format,
|
||||
{
|
||||
// Collect features to use
|
||||
VkFormatFeatureFlags wantedFeatureFlags = 0;
|
||||
if (flags & GPUTextureFlags::ShaderResource)
|
||||
if (EnumHasAnyFlags(flags, GPUTextureFlags::ShaderResource))
|
||||
wantedFeatureFlags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT;
|
||||
if (flags & GPUTextureFlags::RenderTarget)
|
||||
if (EnumHasAnyFlags(flags, GPUTextureFlags::RenderTarget))
|
||||
wantedFeatureFlags |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
|
||||
if (flags & GPUTextureFlags::DepthStencil)
|
||||
if (EnumHasAnyFlags(flags, GPUTextureFlags::DepthStencil))
|
||||
wantedFeatureFlags |= VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;
|
||||
if (flags & GPUTextureFlags::UnorderedAccess)
|
||||
if (EnumHasAnyFlags(flags, GPUTextureFlags::UnorderedAccess))
|
||||
wantedFeatureFlags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
|
||||
|
||||
if (!IsVkFormatSupported(RenderToolsVulkan::ToVulkanFormat(format), wantedFeatureFlags, optimalTiling))
|
||||
{
|
||||
// Special case for depth-stencil formats
|
||||
if (flags & GPUTextureFlags::DepthStencil)
|
||||
if (EnumHasAnyFlags(flags, GPUTextureFlags::DepthStencil))
|
||||
{
|
||||
const bool hasStencil = PixelFormatExtensions::HasStencil(format);
|
||||
|
||||
@@ -1749,7 +1749,7 @@ bool GPUDeviceVulkan::Init()
|
||||
//VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT
|
||||
|
||||
// Multi-sampling support
|
||||
if (support & FormatSupport::Texture2D)
|
||||
if (EnumHasAnyFlags(support, FormatSupport::Texture2D))
|
||||
msaa = maxMsaa;
|
||||
}
|
||||
|
||||
|
||||
@@ -216,7 +216,7 @@ bool GPUSwapChainVulkan::CreateSwapChain(int32 width, int32 height)
|
||||
if (resultFormat != PixelFormat::Unknown)
|
||||
{
|
||||
bool found = false;
|
||||
if (FORMAT_FEATURES_ARE_SUPPORTED(_device->FeaturesPerFormat[(int32)resultFormat].Support, FormatSupport::RenderTarget))
|
||||
if (EnumHasAllFlags(_device->FeaturesPerFormat[(int32)resultFormat].Support, FormatSupport::RenderTarget))
|
||||
{
|
||||
const VkFormat requested = RenderToolsVulkan::ToVulkanFormat(resultFormat);
|
||||
for (int32 i = 0; i < surfaceFormats.Count(); i++)
|
||||
|
||||
@@ -420,7 +420,7 @@ void GPUTextureVulkan::initHandles()
|
||||
}
|
||||
|
||||
// Read-only depth-stencil
|
||||
if (_desc.Flags & GPUTextureFlags::ReadOnlyDepthView)
|
||||
if (EnumHasAnyFlags(_desc.Flags, GPUTextureFlags::ReadOnlyDepthView))
|
||||
{
|
||||
_handleReadOnlyDepth.Init(_device, this, _image, mipLevels, format, msaa, extent, VK_IMAGE_VIEW_TYPE_2D, mipLevels, 0, 1, 0, true);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user