venus: clean up vn_get_intercepted_barriers

Add vn_cmd_{wait_events,pipeline_barrier}_fix_image_memory_barries to
replace vn_get_intercepted_barriers.  The two new functions are
identical currently, but that will change soon.

Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10709>
This commit is contained in:
Chia-I Wu 2021-05-06 09:57:57 -07:00 committed by Marge Bot
parent 7ec6cb61ad
commit 93abaf6fe8

View file

@ -50,6 +50,58 @@ vn_cmd_get_image_memory_barriers(struct vn_command_buffer *cmd,
return cmd->builder.image_barriers;
}
static void
vn_cmd_fix_image_memory_barrier(const struct vn_command_buffer *cmd,
const VkImageMemoryBarrier *src_barrier,
VkImageMemoryBarrier *out_barrier)
{
*out_barrier = *src_barrier;
/* XXX drop the #ifdef after fixing common wsi */
#ifdef ANDROID
for (uint32_t i = 0; i < count; i++) {
if (out_barrier->oldLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)
out_barrier->oldLayout = VK_IMAGE_LAYOUT_GENERAL;
if (out_barrier->newLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)
out_barrier->newLayout = VK_IMAGE_LAYOUT_GENERAL;
}
#endif
}
static const VkImageMemoryBarrier *
vn_cmd_wait_events_fix_image_memory_barriers(
struct vn_command_buffer *cmd,
const VkImageMemoryBarrier *src_barriers,
uint32_t count)
{
if (!vn_image_memory_barrier_has_present_src(src_barriers, count))
return src_barriers;
VkImageMemoryBarrier *img_barriers =
vn_cmd_get_image_memory_barriers(cmd, count);
if (!img_barriers) {
cmd->state = VN_COMMAND_BUFFER_STATE_INVALID;
return src_barriers;
}
for (uint32_t i = 0; i < count; i++) {
vn_cmd_fix_image_memory_barrier(cmd, &src_barriers[i],
&img_barriers[i]);
}
return img_barriers;
}
static const VkImageMemoryBarrier *
vn_cmd_pipeline_barrier_fix_image_memory_barriers(
struct vn_command_buffer *cmd,
const VkImageMemoryBarrier *src_barriers,
uint32_t count)
{
return vn_cmd_wait_events_fix_image_memory_barriers(cmd, src_barriers,
count);
}
static void
vn_cmd_begin_render_pass(struct vn_command_buffer *cmd,
const struct vn_render_pass *pass,
@ -1061,36 +1113,6 @@ vn_CmdResetEvent(VkCommandBuffer commandBuffer,
vn_encode_vkCmdResetEvent(&cmd->cs, 0, commandBuffer, event, stageMask);
}
static const VkImageMemoryBarrier *
vn_get_intercepted_barriers(struct vn_command_buffer *cmd,
const VkImageMemoryBarrier *img_barriers,
uint32_t count)
{
const bool has_present_src =
vn_image_memory_barrier_has_present_src(img_barriers, count);
if (!has_present_src)
return img_barriers;
VkImageMemoryBarrier *barriers =
vn_cmd_get_image_memory_barriers(cmd, count);
if (!barriers)
return img_barriers;
memcpy(barriers, img_barriers, sizeof(*img_barriers) * count);
/* XXX drop the #ifdef after fixing common wsi */
#ifdef ANDROID
for (uint32_t i = 0; i < count; i++) {
if (barriers[i].oldLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)
barriers[i].oldLayout = VK_IMAGE_LAYOUT_GENERAL;
if (barriers[i].newLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)
barriers[i].newLayout = VK_IMAGE_LAYOUT_GENERAL;
}
#endif
return barriers;
}
void
vn_CmdWaitEvents(VkCommandBuffer commandBuffer,
uint32_t eventCount,
@ -1108,6 +1130,9 @@ vn_CmdWaitEvents(VkCommandBuffer commandBuffer,
vn_command_buffer_from_handle(commandBuffer);
size_t cmd_size;
pImageMemoryBarriers = vn_cmd_wait_events_fix_image_memory_barriers(
cmd, pImageMemoryBarriers, imageMemoryBarrierCount);
cmd_size = vn_sizeof_vkCmdWaitEvents(
commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask,
memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
@ -1115,14 +1140,11 @@ vn_CmdWaitEvents(VkCommandBuffer commandBuffer,
if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))
return;
const VkImageMemoryBarrier *img_barriers = vn_get_intercepted_barriers(
cmd, pImageMemoryBarriers, imageMemoryBarrierCount);
vn_encode_vkCmdWaitEvents(&cmd->cs, 0, commandBuffer, eventCount, pEvents,
srcStageMask, dstStageMask, memoryBarrierCount,
pMemoryBarriers, bufferMemoryBarrierCount,
pBufferMemoryBarriers, imageMemoryBarrierCount,
img_barriers);
pImageMemoryBarriers);
}
void
@ -1141,6 +1163,9 @@ vn_CmdPipelineBarrier(VkCommandBuffer commandBuffer,
vn_command_buffer_from_handle(commandBuffer);
size_t cmd_size;
pImageMemoryBarriers = vn_cmd_pipeline_barrier_fix_image_memory_barriers(
cmd, pImageMemoryBarriers, imageMemoryBarrierCount);
cmd_size = vn_sizeof_vkCmdPipelineBarrier(
commandBuffer, srcStageMask, dstStageMask, dependencyFlags,
memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
@ -1148,13 +1173,10 @@ vn_CmdPipelineBarrier(VkCommandBuffer commandBuffer,
if (!vn_cs_encoder_reserve(&cmd->cs, cmd_size))
return;
const VkImageMemoryBarrier *img_barriers = vn_get_intercepted_barriers(
cmd, pImageMemoryBarriers, imageMemoryBarrierCount);
vn_encode_vkCmdPipelineBarrier(
&cmd->cs, 0, commandBuffer, srcStageMask, dstStageMask, dependencyFlags,
memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
pBufferMemoryBarriers, imageMemoryBarrierCount, img_barriers);
pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
}
void