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 {

Reply via email to