Vulkan: Specify Pipeline Stages When Adding Barriers

This PR adds support to specify pipeline stages when adding barriers.
This would make it possible more carefully specify barriers.

Pull Request: https://projects.blender.org/blender/blender/pulls/114457
This commit is contained in:
Jeroen Bakker
2023-11-03 14:24:39 +01:00
parent d6e1a6d616
commit e2215fea35
4 changed files with 33 additions and 32 deletions

View File

@@ -462,30 +462,14 @@ void VKCommandBuffers::blit(VKTexture &dst_texture,
command_buffer.command_recorded();
}
void VKCommandBuffers::pipeline_barrier(VkPipelineStageFlags source_stages,
VkPipelineStageFlags destination_stages)
{
/* TODO: Command isn't used.*/
VKCommandBuffer &command_buffer = command_buffer_get(Type::DataTransfer);
vkCmdPipelineBarrier(command_buffer.vk_command_buffer(),
source_stages,
destination_stages,
0,
0,
nullptr,
0,
nullptr,
0,
nullptr);
command_buffer.command_recorded();
}
void VKCommandBuffers::pipeline_barrier(Span<VkImageMemoryBarrier> image_memory_barriers)
void VKCommandBuffers::pipeline_barrier(const VkPipelineStageFlags src_stages,
const VkPipelineStageFlags dst_stages,
Span<VkImageMemoryBarrier> image_memory_barriers)
{
VKCommandBuffer &command_buffer = command_buffer_get(Type::DataTransfer);
vkCmdPipelineBarrier(command_buffer.vk_command_buffer(),
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
src_stages,
dst_stages,
VK_DEPENDENCY_BY_REGION_BIT,
0,
nullptr,

View File

@@ -103,8 +103,8 @@ class VKCommandBuffers : public NonCopyable, NonMovable {
VkImageLayout src_layout,
Span<VkImageBlit> regions);
void pipeline_barrier(VkPipelineStageFlags source_stages,
VkPipelineStageFlags destination_stages);
void pipeline_barrier(Span<VkImageMemoryBarrier> image_memory_barriers);
VkPipelineStageFlags destination_stages,
Span<VkImageMemoryBarrier> image_memory_barriers);
/**
* Clear color image resource.

View File

@@ -54,7 +54,9 @@ void VKTexture::generate_mipmap()
layout_ensure(context,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
VK_ACCESS_MEMORY_WRITE_BIT,
VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_READ_BIT);
for (int src_mipmap : IndexRange(mipmaps_ - 1)) {
@@ -81,7 +83,9 @@ void VKTexture::generate_mipmap()
IndexRange(src_mipmap, 1),
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT,
VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_READ_BIT);
VkImageBlit image_blit = {};
@@ -111,7 +115,9 @@ void VKTexture::generate_mipmap()
IndexRange(mipmaps_ - 1, 1),
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT,
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
VK_ACCESS_MEMORY_READ_BIT);
current_layout_set(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
}
@@ -536,8 +542,10 @@ void VKTexture::current_layout_set(const VkImageLayout new_layout)
void VKTexture::layout_ensure(VKContext &context,
const VkImageLayout requested_layout,
const VkAccessFlagBits src_access,
const VkAccessFlagBits dst_access)
const VkPipelineStageFlags src_stage,
const VkAccessFlags src_access,
const VkPipelineStageFlags dst_stage,
const VkAccessFlags dst_access)
{
if (is_texture_view()) {
source_texture_->layout_ensure(context, requested_layout);
@@ -551,7 +559,9 @@ void VKTexture::layout_ensure(VKContext &context,
IndexRange(0, VK_REMAINING_MIP_LEVELS),
current_layout,
requested_layout,
src_stage,
src_access,
dst_stage,
dst_access);
current_layout_set(requested_layout);
}
@@ -560,8 +570,10 @@ void VKTexture::layout_ensure(VKContext &context,
const IndexRange mipmap_range,
const VkImageLayout current_layout,
const VkImageLayout requested_layout,
const VkAccessFlagBits src_access,
const VkAccessFlagBits dst_access)
const VkPipelineStageFlags src_stages,
const VkAccessFlags src_access,
const VkPipelineStageFlags dst_stages,
const VkAccessFlags dst_access)
{
BLI_assert(vk_image_ != VK_NULL_HANDLE);
VkImageMemoryBarrier barrier{};
@@ -576,7 +588,8 @@ void VKTexture::layout_ensure(VKContext &context,
barrier.subresourceRange.levelCount = uint32_t(mipmap_range.size());
barrier.subresourceRange.baseArrayLayer = 0;
barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
context.command_buffers_get().pipeline_barrier(Span<VkImageMemoryBarrier>(&barrier, 1));
context.command_buffers_get().pipeline_barrier(
src_stages, dst_stages, Span<VkImageMemoryBarrier>(&barrier, 1));
}
/** \} */

View File

@@ -143,8 +143,10 @@ class VKTexture : public Texture, public VKBindableResource {
*/
void layout_ensure(VKContext &context,
VkImageLayout requested_layout,
VkAccessFlagBits src_access = VK_ACCESS_MEMORY_WRITE_BIT,
VkAccessFlagBits dst_access = VK_ACCESS_MEMORY_READ_BIT);
VkPipelineStageFlags src_stage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
VkAccessFlags src_access = VK_ACCESS_MEMORY_WRITE_BIT,
VkPipelineStageFlags dst_stage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
VkAccessFlags dst_access = VK_ACCESS_MEMORY_READ_BIT);
private:
/**
@@ -156,8 +158,10 @@ class VKTexture : public Texture, public VKBindableResource {
IndexRange mipmap_range,
VkImageLayout current_layout,
VkImageLayout requested_layout,
VkAccessFlagBits src_access,
VkAccessFlagBits dst_access);
VkPipelineStageFlags src_stage,
VkAccessFlags src_access,
VkPipelineStageFlags dst_stage,
VkAccessFlags dst_access);
/** \} */