From 8c9217e4d8b7975bfb58b0a977e43ff9b041b297 Mon Sep 17 00:00:00 2001 From: Karmjit Mahil Date: Wed, 16 Nov 2022 17:00:38 +0000 Subject: [PATCH] pvr: Handle PVR_SUB_COMMAND_FLAG_OCCLUSION_QUERY. Signed-off-by: Karmjit Mahil Reviewed-by: Frank Binns Part-of: --- src/imagination/vulkan/pvr_queue.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/imagination/vulkan/pvr_queue.c b/src/imagination/vulkan/pvr_queue.c index 884bb0b1210..9849de53e2e 100644 --- a/src/imagination/vulkan/pvr_queue.c +++ b/src/imagination/vulkan/pvr_queue.c @@ -728,10 +728,33 @@ static VkResult pvr_process_cmd_buffer( sub_cmd, &cmd_buffer->sub_cmds, link) { - /* TODO: Process PVR_SUB_COMMAND_FLAG_OCCLUSION_QUERY flag. */ - switch (sub_cmd->type) { - case PVR_SUB_CMD_TYPE_GRAPHICS: + case PVR_SUB_CMD_TYPE_GRAPHICS: { + if (sub_cmd->flags & PVR_SUB_COMMAND_FLAG_OCCLUSION_QUERY) { + struct pvr_sub_cmd_event frag_to_transfer_barrier = { + .type = PVR_EVENT_TYPE_BARRIER, + .barrier = { + .wait_for_stage_mask = PVR_PIPELINE_STAGE_OCCLUSION_QUERY_BIT, + .wait_at_stage_mask = PVR_PIPELINE_STAGE_FRAG_BIT, + }, + }; + + /* If the fragment job utilizes occlusion queries, for data + * integrity it needs to wait for the occlusion query to be + * processed. + */ + + 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_graphics_cmd(device, queue, cmd_buffer, @@ -743,6 +766,7 @@ static VkResult pvr_process_cmd_buffer( stage_flags, per_cmd_buffer_syncobjs); break; + } case PVR_SUB_CMD_TYPE_COMPUTE: result = pvr_process_compute_cmd(device,