vk_stream_buffer: Cleanup flush barrier
This commit is contained in:
@ -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,
|
||||||
{});
|
{});
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user