Module: Mesa Branch: main Commit: 04dc963cd639f37250908a788f2166d4163bc9f6 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=04dc963cd639f37250908a788f2166d4163bc9f6
Author: Rajnesh Kanwal <[email protected]> Date: Fri Sep 9 10:29:10 2022 +0100 pvr: Implement vkCmdWaitEvents2 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 | 64 ++++++++++++++++++++++++++++++--- src/imagination/vulkan/pvr_private.h | 8 +++++ 2 files changed, 67 insertions(+), 5 deletions(-) diff --git a/src/imagination/vulkan/pvr_cmd_buffer.c b/src/imagination/vulkan/pvr_cmd_buffer.c index 39fb03bca54..0c60e9dd16b 100644 --- a/src/imagination/vulkan/pvr_cmd_buffer.c +++ b/src/imagination/vulkan/pvr_cmd_buffer.c @@ -105,6 +105,9 @@ static void pvr_cmd_buffer_free_sub_cmd(struct pvr_cmd_buffer *cmd_buffer, break; case PVR_SUB_CMD_TYPE_EVENT: + if (sub_cmd->event.type == PVR_EVENT_TYPE_WAIT) + vk_free(&cmd_buffer->vk.pool->alloc, sub_cmd->event.wait.events); + break; default: @@ -5761,12 +5764,63 @@ void pvr_CmdSetEvent2(VkCommandBuffer commandBuffer, pvr_cmd_buffer_end_sub_cmd(cmd_buffer); } -void pvr_CmdWaitEvents2KHR(VkCommandBuffer commandBuffer, - uint32_t eventCount, - const VkEvent *pEvents, - const VkDependencyInfo *pDependencyInfos) +void pvr_CmdWaitEvents2(VkCommandBuffer commandBuffer, + uint32_t eventCount, + const VkEvent *pEvents, + const VkDependencyInfo *pDependencyInfos) { - assert(!"Unimplemented"); + PVR_FROM_HANDLE(pvr_cmd_buffer, cmd_buffer, commandBuffer); + struct pvr_sub_cmd_event *sub_cmd; + struct pvr_event **events_array; + uint32_t *stage_masks; + VkResult result; + + PVR_CHECK_COMMAND_BUFFER_BUILDING_STATE(cmd_buffer); + + VK_MULTIALLOC(ma); + vk_multialloc_add(&ma, &events_array, __typeof__(*events_array), eventCount); + vk_multialloc_add(&ma, &stage_masks, __typeof__(*stage_masks), eventCount); + + if (!vk_multialloc_alloc(&ma, + &cmd_buffer->vk.pool->alloc, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT)) { + cmd_buffer->state.status = + vk_error(cmd_buffer, VK_ERROR_OUT_OF_HOST_MEMORY); + return; + } + + result = pvr_cmd_buffer_start_sub_cmd(cmd_buffer, PVR_SUB_CMD_TYPE_EVENT); + if (result != VK_SUCCESS) { + vk_free(&cmd_buffer->vk.pool->alloc, events_array); + return; + } + + memcpy(events_array, pEvents, sizeof(*events_array) * eventCount); + + for (uint32_t i = 0; i < eventCount; i++) { + const VkDependencyInfo *info = &pDependencyInfos[i]; + VkPipelineStageFlags2 mask = 0; + + for (uint32_t j = 0; j < info->memoryBarrierCount; j++) + mask |= info->pMemoryBarriers[j].dstStageMask; + + for (uint32_t j = 0; j < info->bufferMemoryBarrierCount; j++) + mask |= info->pBufferMemoryBarriers[j].dstStageMask; + + for (uint32_t j = 0; j < info->imageMemoryBarrierCount; j++) + mask |= info->pImageMemoryBarriers[j].dstStageMask; + + stage_masks[i] = pvr_stage_mask_dst(mask); + } + + sub_cmd = &cmd_buffer->state.current_sub_cmd->event; + + sub_cmd->type = PVR_EVENT_TYPE_WAIT; + sub_cmd->wait.count = eventCount; + sub_cmd->wait.events = events_array; + sub_cmd->wait.wait_at_stage_masks = stage_masks; + + pvr_cmd_buffer_end_sub_cmd(cmd_buffer); } void pvr_CmdWriteTimestamp2KHR(VkCommandBuffer commandBuffer, diff --git a/src/imagination/vulkan/pvr_private.h b/src/imagination/vulkan/pvr_private.h index b96deea49c3..2351d40dd46 100644 --- a/src/imagination/vulkan/pvr_private.h +++ b/src/imagination/vulkan/pvr_private.h @@ -747,6 +747,14 @@ struct pvr_sub_cmd_event { /* Stages to wait for until the event is reset. */ uint32_t wait_for_stage_mask; } reset; + + struct { + uint32_t count; + /* Events to wait for before resuming. */ + struct pvr_event **events; + /* Stages to wait at. */ + uint32_t *wait_at_stage_masks; + } wait; }; };
