Add explicit GPU resource transitions, memory and compute barriers
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
#include "RenderToolsVulkan.h"
|
||||
#include "Engine/Core/Types/StringBuilder.h"
|
||||
#include "Engine/Core/Log.h"
|
||||
#include "Engine/Graphics/GPUResourceAccess.h"
|
||||
|
||||
// @formatter:off
|
||||
|
||||
@@ -258,6 +259,80 @@ void RenderToolsVulkan::LogVkResult(VkResult result, const char* file, uint32 li
|
||||
#endif
|
||||
}
|
||||
|
||||
VkAccessFlags RenderToolsVulkan::GetAccess(GPUResourceAccess access)
|
||||
{
|
||||
switch (access)
|
||||
{
|
||||
case GPUResourceAccess::None:
|
||||
return VK_ACCESS_NONE;
|
||||
case GPUResourceAccess::CopyRead:
|
||||
return VK_ACCESS_TRANSFER_READ_BIT;
|
||||
case GPUResourceAccess::CopyWrite:
|
||||
return VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||
case GPUResourceAccess::CpuRead:
|
||||
return VK_ACCESS_HOST_READ_BIT;
|
||||
case GPUResourceAccess::CpuWrite:
|
||||
return VK_ACCESS_HOST_WRITE_BIT;
|
||||
case GPUResourceAccess::DepthRead:
|
||||
return VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
|
||||
case GPUResourceAccess::DepthWrite:
|
||||
return VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
|
||||
case GPUResourceAccess::DepthBuffer:
|
||||
return VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
|
||||
case GPUResourceAccess::RenderTarget:
|
||||
return VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||
case GPUResourceAccess::UnorderedAccess:
|
||||
return VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT;
|
||||
case GPUResourceAccess::IndirectArgs:
|
||||
return VK_ACCESS_INDIRECT_COMMAND_READ_BIT;
|
||||
case GPUResourceAccess::ShaderReadCompute:
|
||||
case GPUResourceAccess::ShaderReadPixel:
|
||||
case GPUResourceAccess::ShaderReadNonPixel:
|
||||
case GPUResourceAccess::ShaderReadGraphics:
|
||||
return VK_ACCESS_SHADER_READ_BIT;
|
||||
#if !BUILD_RELEASE
|
||||
default:
|
||||
LOG(Error, "Unsupported GPU Resource Access: {}", (uint32)access);
|
||||
#endif
|
||||
}
|
||||
return VK_ACCESS_NONE;
|
||||
}
|
||||
|
||||
VkImageLayout RenderToolsVulkan::GetImageLayout(GPUResourceAccess access)
|
||||
{
|
||||
switch (access)
|
||||
{
|
||||
case GPUResourceAccess::None:
|
||||
return VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
case GPUResourceAccess::CopyRead:
|
||||
return VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
|
||||
case GPUResourceAccess::CopyWrite:
|
||||
return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
|
||||
case GPUResourceAccess::CpuRead:
|
||||
case GPUResourceAccess::CpuWrite:
|
||||
return VK_IMAGE_LAYOUT_GENERAL;
|
||||
case GPUResourceAccess::DepthRead:
|
||||
return VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL;
|
||||
case GPUResourceAccess::DepthWrite:
|
||||
case GPUResourceAccess::DepthBuffer:
|
||||
return VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
|
||||
return VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
|
||||
case GPUResourceAccess::RenderTarget:
|
||||
return VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL;
|
||||
case GPUResourceAccess::UnorderedAccess:
|
||||
case GPUResourceAccess::ShaderReadCompute:
|
||||
case GPUResourceAccess::ShaderReadPixel:
|
||||
case GPUResourceAccess::ShaderReadNonPixel:
|
||||
case GPUResourceAccess::ShaderReadGraphics:
|
||||
return VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
||||
#if !BUILD_RELEASE
|
||||
default:
|
||||
LOG(Error, "Unsupported GPU Resource Access: {}", (uint32)access);
|
||||
#endif
|
||||
}
|
||||
return VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
}
|
||||
|
||||
bool RenderToolsVulkan::HasExtension(const Array<const char*>& extensions, const char* name)
|
||||
{
|
||||
for (int32 i = 0; i < extensions.Count(); i++)
|
||||
|
||||
Reference in New Issue
Block a user