diff --git a/src/imagination/vulkan/pvr_private.h b/src/imagination/vulkan/pvr_private.h index e588c195caa..584838cb565 100644 --- a/src/imagination/vulkan/pvr_private.h +++ b/src/imagination/vulkan/pvr_private.h @@ -497,6 +497,8 @@ struct pvr_sub_cmd_gfx { bool frag_uses_texture_rw; bool has_occlusion_query; + + bool wait_on_previous_transfer; }; struct pvr_sub_cmd_compute { diff --git a/src/imagination/vulkan/pvr_queue.c b/src/imagination/vulkan/pvr_queue.c index c27a76f31a5..23580515bb8 100644 --- a/src/imagination/vulkan/pvr_queue.c +++ b/src/imagination/vulkan/pvr_queue.c @@ -712,6 +712,19 @@ static VkResult pvr_process_cmd_buffer(struct pvr_device *device, break; } + if (sub_cmd->gfx.wait_on_previous_transfer) { + struct pvr_sub_cmd_event_barrier transfer_to_frag_barrier = { + .wait_for_stage_mask = PVR_PIPELINE_STAGE_TRANSFER_BIT, + .wait_at_stage_mask = PVR_PIPELINE_STAGE_FRAG_BIT, + }; + + result = pvr_process_event_cmd_barrier(device, + queue, + &transfer_to_frag_barrier); + if (result != VK_SUCCESS) + break; + } + result = pvr_process_graphics_cmd(device, queue, cmd_buffer, &sub_cmd->gfx); break;