vk: Fix custom event signals

This commit is contained in:
kd-11 2021-01-14 23:07:39 +03:00 committed by kd-11
parent 7de0ff337b
commit f7fdfe52bc
5 changed files with 14 additions and 8 deletions

View File

@ -138,7 +138,7 @@ namespace vk
// Create event object for this transfer and queue signal op
dma_fence = std::make_unique<vk::event>(*m_device);
dma_fence->signal(cmd, VK_PIPELINE_STAGE_TRANSFER_BIT);
dma_fence->signal(cmd, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT);
// Set cb flag for queued dma operations
cmd.set_flag(vk::command_buffer::cb_has_dma_transfer);

View File

@ -53,14 +53,18 @@ namespace vk
vkCmdPipelineBarrier(cmd, src_stage, dst_stage, 0, 0, nullptr, 1, &barrier, 0, nullptr);
}
void insert_execution_barrier(VkCommandBuffer cmd, VkPipelineStageFlags src_stage, VkPipelineStageFlags dst_stage)
void insert_global_memory_barrier(VkCommandBuffer cmd, VkPipelineStageFlags src_stage, VkPipelineStageFlags dst_stage, VkAccessFlags src_access, VkAccessFlags dst_access)
{
if (vk::is_renderpass_open(cmd))
{
vk::end_renderpass(cmd);
}
vkCmdPipelineBarrier(cmd, src_stage, dst_stage, 0, 0, nullptr, 0, nullptr, 0, nullptr);
VkMemoryBarrier barrier = {};
barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
barrier.srcAccessMask = src_access;
barrier.dstAccessMask = dst_access;
vkCmdPipelineBarrier(cmd, src_stage, dst_stage, 0, 1, &barrier, 0, nullptr, 0, nullptr);
}
void insert_texture_barrier(VkCommandBuffer cmd, VkImage image, VkImageLayout current_layout, VkImageLayout new_layout, VkImageSubresourceRange range)

View File

@ -17,7 +17,9 @@ namespace vk
VkPipelineStageFlags src_stage, VkPipelineStageFlags dst_stage, VkAccessFlags src_mask, VkAccessFlags dst_mask,
const VkImageSubresourceRange& range);
void insert_execution_barrier(VkCommandBuffer cmd,
void insert_global_memory_barrier(VkCommandBuffer cmd,
VkPipelineStageFlags src_stage = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
VkPipelineStageFlags dst_stage = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
VkPipelineStageFlags dst_stage = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
VkAccessFlags src_access = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT,
VkAccessFlags dst_access = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT);
}

View File

@ -103,7 +103,7 @@ namespace vk
}
}
void event::signal(const command_buffer& cmd, VkPipelineStageFlags stages)
void event::signal(const command_buffer& cmd, VkPipelineStageFlags stages, VkAccessFlags access)
{
if (m_vk_event) [[likely]]
{
@ -111,7 +111,7 @@ namespace vk
}
else
{
insert_execution_barrier(cmd, stages, VK_PIPELINE_STAGE_TRANSFER_BIT);
insert_global_memory_barrier(cmd, stages, VK_PIPELINE_STAGE_TRANSFER_BIT, access, VK_ACCESS_TRANSFER_WRITE_BIT);
vkCmdFillBuffer(cmd, m_buffer->value, 0, 4, 0xDEADBEEF);
}
}

View File

@ -37,7 +37,7 @@ namespace vk
public:
event(const render_device& dev);
~event();
void signal(const command_buffer& cmd, VkPipelineStageFlags stages);
void signal(const command_buffer& cmd, VkPipelineStageFlags stages, VkAccessFlags access);
VkResult status() const;
};