From 904a3c4dd780cc5a4c718027f019812e18afc42a Mon Sep 17 00:00:00 2001 From: Karmjit Mahil Date: Wed, 16 Nov 2022 16:38:18 +0000 Subject: [PATCH] pvr: Handle PVR_SUB_COMMAND_FLAG_TRANSFER_SERIALIZE_WITH_FRAG. The flag was previously named PVR_SUB_COMMAND_FLAG_WAIT_ON_PREVIOUS_FRAG. Since the next fragment job is also made to wait for the transfer job to complete, the previous name might have been a bit misleading. Signed-off-by: Karmjit Mahil Reviewed-by: Frank Binns Part-of: --- src/imagination/vulkan/pvr_cmd_buffer.c | 2 +- src/imagination/vulkan/pvr_private.h | 2 +- src/imagination/vulkan/pvr_queue.c | 54 +++++++++++++++++++++++-- 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/src/imagination/vulkan/pvr_cmd_buffer.c b/src/imagination/vulkan/pvr_cmd_buffer.c index f89c8de4d7c..0adcff92c6f 100644 --- a/src/imagination/vulkan/pvr_cmd_buffer.c +++ b/src/imagination/vulkan/pvr_cmd_buffer.c @@ -5604,7 +5604,7 @@ pvr_resolve_unemitted_resolve_attachments(struct pvr_cmd_buffer *cmd_buffer, dst_view->vk.image->format = dst_format; state->current_sub_cmd->flags |= - PVR_SUB_COMMAND_FLAG_WAIT_ON_PREVIOUS_FRAG; + PVR_SUB_COMMAND_FLAG_TRANSFER_SERIALIZE_WITH_FRAG; if (result != VK_SUCCESS) return result; diff --git a/src/imagination/vulkan/pvr_private.h b/src/imagination/vulkan/pvr_private.h index 21c6a1f31ce..71470d94bfb 100644 --- a/src/imagination/vulkan/pvr_private.h +++ b/src/imagination/vulkan/pvr_private.h @@ -118,7 +118,7 @@ enum pvr_event_type { }; enum pvr_sub_command_flags { - PVR_SUB_COMMAND_FLAG_WAIT_ON_PREVIOUS_FRAG = BITFIELD_BIT(0), + PVR_SUB_COMMAND_FLAG_TRANSFER_SERIALIZE_WITH_FRAG = BITFIELD_BIT(0), PVR_SUB_COMMAND_FLAG_OCCLUSION_QUERY = BITFIELD_BIT(1), }; diff --git a/src/imagination/vulkan/pvr_queue.c b/src/imagination/vulkan/pvr_queue.c index b22d1d21bee..884bb0b1210 100644 --- a/src/imagination/vulkan/pvr_queue.c +++ b/src/imagination/vulkan/pvr_queue.c @@ -429,6 +429,8 @@ static VkResult pvr_process_event_cmd_barrier( uint32_t src_syncobj_count = 0; VkResult result; + assert(sub_cmd->type == PVR_EVENT_TYPE_BARRIER); + assert(!(src_mask & ~PVR_PIPELINE_STAGE_ALL_BITS)); assert(!(dst_mask & ~PVR_PIPELINE_STAGE_ALL_BITS)); @@ -726,9 +728,7 @@ static VkResult pvr_process_cmd_buffer( sub_cmd, &cmd_buffer->sub_cmds, link) { - /* TODO: Process PVR_SUB_COMMAND_FLAG_WAIT_ON_PREVIOUS_FRAG and - * PVR_SUB_COMMAND_FLAG_OCCLUSION_QUERY flags. - */ + /* TODO: Process PVR_SUB_COMMAND_FLAG_OCCLUSION_QUERY flag. */ switch (sub_cmd->type) { case PVR_SUB_CMD_TYPE_GRAPHICS: @@ -755,7 +755,30 @@ static VkResult pvr_process_cmd_buffer( per_cmd_buffer_syncobjs); break; - case PVR_SUB_CMD_TYPE_TRANSFER: + case PVR_SUB_CMD_TYPE_TRANSFER: { + const bool serialize_with_frag = + sub_cmd->flags & PVR_SUB_COMMAND_FLAG_TRANSFER_SERIALIZE_WITH_FRAG; + + if (serialize_with_frag) { + struct pvr_sub_cmd_event frag_to_transfer_barrier = { + .type = PVR_EVENT_TYPE_BARRIER, + .barrier = { + .wait_for_stage_mask = PVR_PIPELINE_STAGE_FRAG_BIT, + .wait_at_stage_mask = PVR_PIPELINE_STAGE_TRANSFER_BIT, + }, + }; + + result = pvr_process_event_cmd_barrier(device, + &frag_to_transfer_barrier, + barriers, + per_cmd_buffer_syncobjs, + per_submit_syncobjs, + queue_syncobjs, + previous_queue_syncobjs); + if (result != VK_SUCCESS) + break; + } + result = pvr_process_transfer_cmds(device, queue, &sub_cmd->transfer, @@ -764,7 +787,30 @@ static VkResult pvr_process_cmd_buffer( wait_count, stage_flags, per_cmd_buffer_syncobjs); + + if (serialize_with_frag) { + struct pvr_sub_cmd_event transfer_to_frag_barrier = { + .type = PVR_EVENT_TYPE_BARRIER, + .barrier = { + .wait_for_stage_mask = PVR_PIPELINE_STAGE_TRANSFER_BIT, + .wait_at_stage_mask = PVR_PIPELINE_STAGE_FRAG_BIT, + }, + }; + + if (result != VK_SUCCESS) + break; + + result = pvr_process_event_cmd_barrier(device, + &transfer_to_frag_barrier, + barriers, + per_cmd_buffer_syncobjs, + per_submit_syncobjs, + queue_syncobjs, + previous_queue_syncobjs); + } + break; + } case PVR_SUB_CMD_TYPE_OCCLUSION_QUERY: result = pvr_process_occlusion_query_cmd(