Module: Mesa Branch: main Commit: de1da8fa76fabab6a3708811b0b60821f1626f36 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=de1da8fa76fabab6a3708811b0b60821f1626f36
Author: Rajnesh Kanwal <[email protected]> Date: Thu Sep 8 15:36:14 2022 +0100 pvr: Implement vkCmdSetEvent2 API. Signed-off-by: Rajnesh Kanwal <[email protected]> Reviewed-by: Karmjit Mahil <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18612> --- src/imagination/vulkan/pvr_cmd_buffer.c | 35 +++++++++++++++++++++++++++++---- src/imagination/vulkan/pvr_private.h | 8 ++++++++ 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/imagination/vulkan/pvr_cmd_buffer.c b/src/imagination/vulkan/pvr_cmd_buffer.c index 7efba1b57b4..f1fc1cb27e4 100644 --- a/src/imagination/vulkan/pvr_cmd_buffer.c +++ b/src/imagination/vulkan/pvr_cmd_buffer.c @@ -5710,11 +5710,38 @@ void pvr_CmdResetEvent2KHR(VkCommandBuffer commandBuffer, assert(!"Unimplemented"); } -void pvr_CmdSetEvent2KHR(VkCommandBuffer commandBuffer, - VkEvent _event, - const VkDependencyInfo *pDependencyInfo) +void pvr_CmdSetEvent2(VkCommandBuffer commandBuffer, + VkEvent _event, + const VkDependencyInfo *pDependencyInfo) { - assert(!"Unimplemented"); + PVR_FROM_HANDLE(pvr_cmd_buffer, cmd_buffer, commandBuffer); + PVR_FROM_HANDLE(pvr_event, event, _event); + VkPipelineStageFlags2 stage_mask = 0; + struct pvr_sub_cmd_event *sub_cmd; + VkResult result; + + PVR_CHECK_COMMAND_BUFFER_BUILDING_STATE(cmd_buffer); + + result = pvr_cmd_buffer_start_sub_cmd(cmd_buffer, PVR_SUB_CMD_TYPE_EVENT); + if (result != VK_SUCCESS) + return; + + for (uint32_t i = 0; i < pDependencyInfo->memoryBarrierCount; i++) + stage_mask |= pDependencyInfo->pMemoryBarriers[i].srcStageMask; + + for (uint32_t i = 0; i < pDependencyInfo->bufferMemoryBarrierCount; i++) + stage_mask |= pDependencyInfo->pBufferMemoryBarriers[i].srcStageMask; + + for (uint32_t i = 0; i < pDependencyInfo->imageMemoryBarrierCount; i++) + stage_mask |= pDependencyInfo->pImageMemoryBarriers[i].srcStageMask; + + sub_cmd = &cmd_buffer->state.current_sub_cmd->event; + + sub_cmd->type = PVR_EVENT_TYPE_SET; + sub_cmd->set.event = event; + sub_cmd->set.wait_for_stage_mask = pvr_stage_mask_dst(stage_mask); + + pvr_cmd_buffer_end_sub_cmd(cmd_buffer); } void pvr_CmdWaitEvents2KHR(VkCommandBuffer commandBuffer, diff --git a/src/imagination/vulkan/pvr_private.h b/src/imagination/vulkan/pvr_private.h index b57584eaf25..bcc4ca9e895 100644 --- a/src/imagination/vulkan/pvr_private.h +++ b/src/imagination/vulkan/pvr_private.h @@ -734,6 +734,14 @@ struct pvr_sub_cmd_transfer { struct pvr_sub_cmd_event { enum pvr_event_type type; + + union { + struct { + struct pvr_event *event; + /* Stages to wait for until the event is set. */ + uint32_t wait_for_stage_mask; + } set; + }; }; struct pvr_sub_cmd {
