From fb10d05f97276aa5eae34bde794c449978d363fb Mon Sep 17 00:00:00 2001 From: GPUCode Date: Sun, 30 Oct 2022 09:34:08 +0200 Subject: [PATCH] vk_stream_buffer: Cleanup flush barrier --- .../renderer_vulkan/vk_stream_buffer.cpp | 47 +++++++++++-------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_stream_buffer.cpp b/src/video_core/renderer_vulkan/vk_stream_buffer.cpp index 97488834d..7eaccc960 100644 --- a/src/video_core/renderer_vulkan/vk_stream_buffer.cpp +++ b/src/video_core/renderer_vulkan/vk_stream_buffer.cpp @@ -14,30 +14,40 @@ namespace Vulkan { -inline auto ToVkAccessStageFlags(vk::BufferUsageFlagBits usage) { - std::pair result{}; +[[nodiscard]] vk::AccessFlags MakeAccessFlags(vk::BufferUsageFlagBits usage) { switch (usage) { case vk::BufferUsageFlagBits::eVertexBuffer: - result = std::make_pair(vk::AccessFlagBits::eVertexAttributeRead, - vk::PipelineStageFlagBits::eVertexInput); - break; + return vk::AccessFlagBits::eVertexAttributeRead; case vk::BufferUsageFlagBits::eIndexBuffer: - result = - std::make_pair(vk::AccessFlagBits::eIndexRead, vk::PipelineStageFlagBits::eVertexInput); + return vk::AccessFlagBits::eIndexRead; case vk::BufferUsageFlagBits::eUniformBuffer: - result = std::make_pair(vk::AccessFlagBits::eUniformRead, - vk::PipelineStageFlagBits::eVertexShader | - vk::PipelineStageFlagBits::eGeometryShader | - vk::PipelineStageFlagBits::eFragmentShader); + return vk::AccessFlagBits::eUniformRead; case vk::BufferUsageFlagBits::eUniformTexelBuffer: - result = std::make_pair(vk::AccessFlagBits::eShaderRead, - vk::PipelineStageFlagBits::eFragmentShader); - break; + return vk::AccessFlagBits::eShaderRead; default: LOG_CRITICAL(Render_Vulkan, "Unknown usage flag {}", usage); + UNREACHABLE(); } + return vk::AccessFlagBits::eNone; +} - return result; +[[nodiscard]] vk::PipelineStageFlags MakePipelineStage(vk::BufferUsageFlagBits usage) { + switch (usage) { + case vk::BufferUsageFlagBits::eVertexBuffer: + return vk::PipelineStageFlagBits::eVertexInput; + case vk::BufferUsageFlagBits::eIndexBuffer: + return vk::PipelineStageFlagBits::eVertexInput; + case vk::BufferUsageFlagBits::eUniformBuffer: + return vk::PipelineStageFlagBits::eVertexShader | + vk::PipelineStageFlagBits::eGeometryShader | + vk::PipelineStageFlagBits::eFragmentShader; + case vk::BufferUsageFlagBits::eUniformTexelBuffer: + return vk::PipelineStageFlagBits::eFragmentShader; + default: + LOG_CRITICAL(Render_Vulkan, "Unknown usage flag {}", usage); + UNREACHABLE(); + } + return vk::PipelineStageFlagBits::eNone; } StagingBuffer::StagingBuffer(const Instance& instance, u32 size, bool readback) @@ -154,7 +164,6 @@ void StreamBuffer::Commit(u32 size) { void StreamBuffer::Flush() { if (readback) { - LOG_WARNING(Render_Vulkan, "Cannot flush read only buffer"); return; } @@ -172,17 +181,17 @@ void StreamBuffer::Flush() { upload_cmdbuf.copyBuffer(staging.buffer, gpu_buffer, copy_region); - auto [access_mask, stage_mask] = ToVkAccessStageFlags(usage); const vk::BufferMemoryBarrier buffer_barrier = { .srcAccessMask = vk::AccessFlagBits::eTransferWrite, - .dstAccessMask = access_mask, + .dstAccessMask = MakeAccessFlags(usage), .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .buffer = gpu_buffer, .offset = flush_offset, .size = flush_size}; - upload_cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, stage_mask, + upload_cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, + MakePipelineStage(usage), vk::DependencyFlagBits::eByRegion, {}, buffer_barrier, {}); });