Add explicit GPU resource transitions, memory and compute barriers

This commit is contained in:
Wojtek Figat
2025-08-09 23:57:43 +02:00
parent 3907bc4957
commit b5a431d2f5
12 changed files with 353 additions and 48 deletions

View File

@@ -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++)