vk_stream_buffer: Cleanup flush barrier

This commit is contained in:
GPUCode
2022-10-30 09:34:08 +02:00
parent 182bebf272
commit fb10d05f97

View File

@ -14,30 +14,40 @@
namespace Vulkan { namespace Vulkan {
inline auto ToVkAccessStageFlags(vk::BufferUsageFlagBits usage) { [[nodiscard]] vk::AccessFlags MakeAccessFlags(vk::BufferUsageFlagBits usage) {
std::pair<vk::AccessFlags, vk::PipelineStageFlags> result{};
switch (usage) { switch (usage) {
case vk::BufferUsageFlagBits::eVertexBuffer: case vk::BufferUsageFlagBits::eVertexBuffer:
result = std::make_pair(vk::AccessFlagBits::eVertexAttributeRead, return vk::AccessFlagBits::eVertexAttributeRead;
vk::PipelineStageFlagBits::eVertexInput);
break;
case vk::BufferUsageFlagBits::eIndexBuffer: case vk::BufferUsageFlagBits::eIndexBuffer:
result = return vk::AccessFlagBits::eIndexRead;
std::make_pair(vk::AccessFlagBits::eIndexRead, vk::PipelineStageFlagBits::eVertexInput);
case vk::BufferUsageFlagBits::eUniformBuffer: case vk::BufferUsageFlagBits::eUniformBuffer:
result = std::make_pair(vk::AccessFlagBits::eUniformRead, return vk::AccessFlagBits::eUniformRead;
vk::PipelineStageFlagBits::eVertexShader |
vk::PipelineStageFlagBits::eGeometryShader |
vk::PipelineStageFlagBits::eFragmentShader);
case vk::BufferUsageFlagBits::eUniformTexelBuffer: case vk::BufferUsageFlagBits::eUniformTexelBuffer:
result = std::make_pair(vk::AccessFlagBits::eShaderRead, return vk::AccessFlagBits::eShaderRead;
vk::PipelineStageFlagBits::eFragmentShader);
break;
default: default:
LOG_CRITICAL(Render_Vulkan, "Unknown usage flag {}", usage); 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) StagingBuffer::StagingBuffer(const Instance& instance, u32 size, bool readback)
@ -154,7 +164,6 @@ void StreamBuffer::Commit(u32 size) {
void StreamBuffer::Flush() { void StreamBuffer::Flush() {
if (readback) { if (readback) {
LOG_WARNING(Render_Vulkan, "Cannot flush read only buffer");
return; return;
} }
@ -172,17 +181,17 @@ void StreamBuffer::Flush() {
upload_cmdbuf.copyBuffer(staging.buffer, gpu_buffer, copy_region); upload_cmdbuf.copyBuffer(staging.buffer, gpu_buffer, copy_region);
auto [access_mask, stage_mask] = ToVkAccessStageFlags(usage);
const vk::BufferMemoryBarrier buffer_barrier = { const vk::BufferMemoryBarrier buffer_barrier = {
.srcAccessMask = vk::AccessFlagBits::eTransferWrite, .srcAccessMask = vk::AccessFlagBits::eTransferWrite,
.dstAccessMask = access_mask, .dstAccessMask = MakeAccessFlags(usage),
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.buffer = gpu_buffer, .buffer = gpu_buffer,
.offset = flush_offset, .offset = flush_offset,
.size = flush_size}; .size = flush_size};
upload_cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, stage_mask, upload_cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer,
MakePipelineStage(usage),
vk::DependencyFlagBits::eByRegion, {}, buffer_barrier, vk::DependencyFlagBits::eByRegion, {}, buffer_barrier,
{}); {});
}); });