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:
@@ -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,
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
@@ -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);
|
||||
|
||||
/** \} */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user