venus: refactor out vn_feedback_event_cmd_record2
authorJuston Li <justonli@google.com>
Tue, 22 Nov 2022 19:37:11 +0000 (11:37 -0800)
committerMarge Bot <emma+marge@anholt.net>
Sat, 14 Jan 2023 00:51:55 +0000 (00:51 +0000)
Refactor out vn_feedback_event_cmd_record2 into a shared functon
that downgrades pipeline barrier commands for non synchronization2
commands.

Signed-off-by: Juston Li <justonli@google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20088>

src/virtio/vulkan/vn_command_buffer.c
src/virtio/vulkan/vn_feedback.c
src/virtio/vulkan/vn_feedback.h

index 2c212e5..3393ce6 100644 (file)
@@ -1454,8 +1454,8 @@ vn_CmdSetEvent(VkCommandBuffer commandBuffer,
 {
    VN_CMD_ENQUEUE(vkCmdSetEvent, commandBuffer, event, stageMask);
 
-   vn_feedback_event_cmd_record(commandBuffer, event, stageMask,
-                                VK_EVENT_SET);
+   vn_feedback_event_cmd_record(commandBuffer, event, stageMask, VK_EVENT_SET,
+                                false);
 }
 
 static VkPipelineStageFlags2
@@ -1491,8 +1491,8 @@ vn_CmdSetEvent2(VkCommandBuffer commandBuffer,
    VkPipelineStageFlags2 src_stage_mask =
       vn_dependency_info_collect_src_stage_mask(pDependencyInfo);
 
-   vn_feedback_event_cmd_record2(commandBuffer, event, src_stage_mask,
-                                 VK_EVENT_SET);
+   vn_feedback_event_cmd_record(commandBuffer, event, src_stage_mask,
+                                VK_EVENT_SET, true);
 }
 
 void
@@ -1503,7 +1503,7 @@ vn_CmdResetEvent(VkCommandBuffer commandBuffer,
    VN_CMD_ENQUEUE(vkCmdResetEvent, commandBuffer, event, stageMask);
 
    vn_feedback_event_cmd_record(commandBuffer, event, stageMask,
-                                VK_EVENT_RESET);
+                                VK_EVENT_RESET, false);
 }
 
 void
@@ -1512,8 +1512,8 @@ vn_CmdResetEvent2(VkCommandBuffer commandBuffer,
                   VkPipelineStageFlags2 stageMask)
 {
    VN_CMD_ENQUEUE(vkCmdResetEvent2, commandBuffer, event, stageMask);
-   vn_feedback_event_cmd_record2(commandBuffer, event, stageMask,
-                                 VK_EVENT_RESET);
+   vn_feedback_event_cmd_record(commandBuffer, event, stageMask,
+                                VK_EVENT_RESET, true);
 }
 
 void
index bc14d4b..284bf2f 100644 (file)
@@ -5,6 +5,7 @@
 
 #include "vn_feedback.h"
 
+#include "vn_command_buffer.h"
 #include "vn_device.h"
 #include "vn_physical_device.h"
 #include "vn_queue.h"
@@ -264,12 +265,74 @@ vn_feedback_pool_free(struct vn_feedback_pool *pool,
    simple_mtx_unlock(&pool->mutex);
 }
 
-/** See also vn_feedback_event_cmd_record2(). */
+static inline bool
+mask_is_32bit(uint64_t x)
+{
+   return (x & 0xffffffff00000000) == 0;
+}
+
+static void
+vn_build_buffer_memory_barrier(const VkDependencyInfo *dep_info,
+                               VkBufferMemoryBarrier *barrier1,
+                               VkPipelineStageFlags *src_stage_mask,
+                               VkPipelineStageFlags *dst_stage_mask)
+{
+
+   assert(dep_info->pNext == NULL);
+   assert(dep_info->memoryBarrierCount == 0);
+   assert(dep_info->bufferMemoryBarrierCount == 1);
+   assert(dep_info->imageMemoryBarrierCount == 0);
+
+   const VkBufferMemoryBarrier2 *barrier2 =
+      &dep_info->pBufferMemoryBarriers[0];
+   assert(barrier2->pNext == NULL);
+   assert(mask_is_32bit(barrier2->srcStageMask));
+   assert(mask_is_32bit(barrier2->srcAccessMask));
+   assert(mask_is_32bit(barrier2->dstStageMask));
+   assert(mask_is_32bit(barrier2->dstAccessMask));
+
+   *barrier1 = (VkBufferMemoryBarrier) {
+      .sType               = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
+      .pNext               = NULL,
+      .srcAccessMask       = barrier2->srcAccessMask,
+      .dstAccessMask       = barrier2->dstAccessMask,
+      .srcQueueFamilyIndex = barrier2->srcQueueFamilyIndex,
+      .dstQueueFamilyIndex = barrier2->dstQueueFamilyIndex,
+      .buffer              = barrier2->buffer,
+      .offset              = barrier2->offset,
+      .size                = barrier2->size,
+   };
+
+   *src_stage_mask = barrier2->srcStageMask;
+   *dst_stage_mask = barrier2->dstStageMask;
+}
+
+static void
+vn_cmd_buffer_memory_barrier(VkCommandBuffer cmd_handle,
+                             const VkDependencyInfo *dep_info,
+                             bool sync2)
+{
+   if (sync2)
+      vn_CmdPipelineBarrier2(cmd_handle, dep_info);
+   else {
+      VkBufferMemoryBarrier barrier1;
+      VkPipelineStageFlags src_stage_mask;
+      VkPipelineStageFlags dst_stage_mask;
+
+      vn_build_buffer_memory_barrier(dep_info, &barrier1, &src_stage_mask,
+                                     &dst_stage_mask);
+      vn_CmdPipelineBarrier(cmd_handle, src_stage_mask, dst_stage_mask,
+                            dep_info->dependencyFlags, 0, NULL, 1, &barrier1,
+                            0, NULL);
+   }
+}
+
 void
 vn_feedback_event_cmd_record(VkCommandBuffer cmd_handle,
                              VkEvent ev_handle,
-                             VkPipelineStageFlags stage_mask,
-                             VkResult status)
+                             VkPipelineStageFlags2 src_stage_mask,
+                             VkResult status,
+                             bool sync2)
 {
    /* For vkCmdSetEvent and vkCmdResetEvent feedback interception.
     *
@@ -288,56 +351,6 @@ vn_feedback_event_cmd_record(VkCommandBuffer cmd_handle,
 
    STATIC_ASSERT(sizeof(*slot->status) == 4);
 
-   const VkBufferMemoryBarrier buf_barrier_before = {
-      .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
-      .pNext = NULL,
-      .srcAccessMask =
-         VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
-      .dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
-      .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
-      .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
-      .buffer = slot->buffer,
-      .offset = slot->offset,
-      .size = 4,
-   };
-   vn_CmdPipelineBarrier(cmd_handle,
-                         stage_mask | VK_PIPELINE_STAGE_HOST_BIT |
-                            VK_PIPELINE_STAGE_TRANSFER_BIT,
-                         VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, NULL, 1,
-                         &buf_barrier_before, 0, NULL);
-   vn_CmdFillBuffer(cmd_handle, slot->buffer, slot->offset, 4, status);
-
-   const VkBufferMemoryBarrier buf_barrier_after = {
-      .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
-      .pNext = NULL,
-      .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
-      .dstAccessMask = VK_ACCESS_HOST_READ_BIT | VK_ACCESS_HOST_WRITE_BIT,
-      .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
-      .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
-      .buffer = slot->buffer,
-      .offset = slot->offset,
-      .size = 4,
-   };
-   vn_CmdPipelineBarrier(cmd_handle, VK_PIPELINE_STAGE_TRANSFER_BIT,
-                         VK_PIPELINE_STAGE_HOST_BIT, 0, 0, NULL, 1,
-                         &buf_barrier_after, 0, NULL);
-}
-
-/** See also vn_feedback_event_cmd_record(). */
-void
-vn_feedback_event_cmd_record2(VkCommandBuffer cmd_h,
-                              VkEvent event_h,
-                              VkPipelineStageFlags2 src_stage_mask,
-                              VkResult status)
-{
-   struct vn_event *event = vn_event_from_handle(event_h);
-   struct vn_feedback_slot *slot = event->feedback_slot;
-
-   if (!slot)
-      return;
-
-   STATIC_ASSERT(sizeof(*slot->status) == 4);
-
    const VkDependencyInfo dep_before = {
       .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
       .dependencyFlags = 0,
@@ -360,6 +373,9 @@ vn_feedback_event_cmd_record2(VkCommandBuffer cmd_h,
             },
          },
    };
+   vn_cmd_buffer_memory_barrier(cmd_handle, &dep_before, sync2);
+
+   vn_CmdFillBuffer(cmd_handle, slot->buffer, slot->offset, 4, status);
 
    const VkDependencyInfo dep_after = {
       .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
@@ -382,10 +398,7 @@ vn_feedback_event_cmd_record2(VkCommandBuffer cmd_h,
             },
          },
    };
-
-   vn_CmdPipelineBarrier2(cmd_h, &dep_before);
-   vn_CmdFillBuffer(cmd_h, slot->buffer, slot->offset, 4, status);
-   vn_CmdPipelineBarrier2(cmd_h, &dep_after);
+   vn_cmd_buffer_memory_barrier(cmd_handle, &dep_after, sync2);
 }
 
 static VkResult
index 8e75e8a..4d69295 100644 (file)
@@ -110,14 +110,9 @@ vn_feedback_set_counter(struct vn_feedback_slot *slot, uint64_t counter)
 void
 vn_feedback_event_cmd_record(VkCommandBuffer cmd_handle,
                              VkEvent ev_handle,
-                             VkPipelineStageFlags stage_mask,
-                             VkResult status);
-
-void
-vn_feedback_event_cmd_record2(VkCommandBuffer cmd_handle,
-                              VkEvent event,
-                              VkPipelineStageFlags2 src_stage_mask,
-                              VkResult status);
+                             VkPipelineStageFlags2 src_stage_mask,
+                             VkResult status,
+                             bool sync2);
 
 VkResult
 vn_feedback_fence_cmd_alloc(VkDevice dev_handle,