v3dv: vkCmdWaitEvents2 takes an array of VkDependencyInfo
authorIago Toral Quiroga <itoral@igalia.com>
Fri, 4 Nov 2022 08:01:01 +0000 (09:01 +0100)
committerEric Engestrom <eric@engestrom.ch>
Wed, 9 Nov 2022 21:22:05 +0000 (21:22 +0000)
We have been incorrectly assuming there was just one for all the
events, apparently CTS never uses more than one event.

Fixes: e6884df088 ('v3dv: fix event synchronization')
Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19518>
(cherry picked from commit 36ef75b6eb924cf5ebfb09834067d2519d080ca8)

.pick_status.json
src/broadcom/vulkan/v3dv_event.c

index 9b50768..6c1acaa 100644 (file)
         "description": "v3dv: vkCmdWaitEvents2 takes an array of VkDependencyInfo",
         "nominated": true,
         "nomination_type": 1,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": "e6884df088a1e172cd87956fe9afdac63069eb2c"
     },
index 8d57849..628f757 100644 (file)
@@ -685,47 +685,51 @@ v3dv_CmdWaitEvents2(VkCommandBuffer commandBuffer,
    /* We need to add the compute stage to the srcStageMask of all dependencies,
     * so let's go ahead and patch the dependency info we receive.
     */
-   uint32_t memory_barrier_count = pDependencyInfo->memoryBarrierCount;
-   VkMemoryBarrier2 *memory_barriers = memory_barrier_count ?
-         malloc(memory_barrier_count * sizeof(memory_barriers[0])): NULL;
-   for (int i = 0; i < memory_barrier_count; i++) {
-      memory_barriers[i] = pDependencyInfo->pMemoryBarriers[i];
-      memory_barriers[i].srcStageMask |= VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT;
-   }
+   for (int e = 0; e < eventCount; e++) {
+      const VkDependencyInfo *info = &pDependencyInfo[e];
+
+      uint32_t memory_barrier_count = info->memoryBarrierCount;
+      VkMemoryBarrier2 *memory_barriers = memory_barrier_count ?
+            malloc(memory_barrier_count * sizeof(memory_barriers[0])): NULL;
+      for (int i = 0; i < memory_barrier_count; i++) {
+         memory_barriers[i] = info->pMemoryBarriers[i];
+         memory_barriers[i].srcStageMask |= VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT;
+      }
+
+      uint32_t buffer_barrier_count = info->bufferMemoryBarrierCount;
+      VkBufferMemoryBarrier2 *buffer_barriers = buffer_barrier_count ?
+            malloc(buffer_barrier_count * sizeof(buffer_barriers[0])): NULL;
+      for (int i = 0; i < buffer_barrier_count; i++) {
+         buffer_barriers[i] = info->pBufferMemoryBarriers[i];
+         buffer_barriers[i].srcStageMask |= VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT;
+      }
+
+      uint32_t image_barrier_count = info->imageMemoryBarrierCount;
+      VkImageMemoryBarrier2 *image_barriers = image_barrier_count ?
+            malloc(image_barrier_count * sizeof(image_barriers[0])): NULL;
+      for (int i = 0; i < image_barrier_count; i++) {
+         image_barriers[i] = info->pImageMemoryBarriers[i];
+         image_barriers[i].srcStageMask |= VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT;
+      }
+
+      VkDependencyInfo new_info = {
+         .sType = info->sType,
+         .dependencyFlags = info->dependencyFlags,
+         .memoryBarrierCount = memory_barrier_count,
+         .pMemoryBarriers = memory_barriers,
+         .bufferMemoryBarrierCount = buffer_barrier_count,
+         .pBufferMemoryBarriers = buffer_barriers,
+         .imageMemoryBarrierCount = image_barrier_count,
+         .pImageMemoryBarriers = image_barriers,
+      };
 
-   uint32_t buffer_barrier_count = pDependencyInfo->bufferMemoryBarrierCount;
-   VkBufferMemoryBarrier2 *buffer_barriers = buffer_barrier_count ?
-         malloc(buffer_barrier_count * sizeof(buffer_barriers[0])): NULL;
-   for (int i = 0; i < buffer_barrier_count; i++) {
-      buffer_barriers[i] = pDependencyInfo->pBufferMemoryBarriers[i];
-      buffer_barriers[i].srcStageMask |= VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT;
-   }
+      v3dv_cmd_buffer_emit_pipeline_barrier(cmd_buffer, &new_info);
 
-   uint32_t image_barrier_count = pDependencyInfo->imageMemoryBarrierCount;
-   VkImageMemoryBarrier2 *image_barriers = image_barrier_count ?
-         malloc(image_barrier_count * sizeof(image_barriers[0])): NULL;
-   for (int i = 0; i < image_barrier_count; i++) {
-      image_barriers[i] = pDependencyInfo->pImageMemoryBarriers[i];
-      image_barriers[i].srcStageMask |= VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT;
+      if (memory_barriers)
+         free(memory_barriers);
+      if (buffer_barriers)
+         free(buffer_barriers);
+      if (image_barriers)
+         free(image_barriers);
    }
-
-   VkDependencyInfo info = {
-      .sType = pDependencyInfo->sType,
-      .dependencyFlags = pDependencyInfo->dependencyFlags,
-      .memoryBarrierCount = memory_barrier_count,
-      .pMemoryBarriers = memory_barriers,
-      .bufferMemoryBarrierCount = buffer_barrier_count,
-      .pBufferMemoryBarriers = buffer_barriers,
-      .imageMemoryBarrierCount = image_barrier_count,
-      .pImageMemoryBarriers = image_barriers,
-   };
-
-   v3dv_cmd_buffer_emit_pipeline_barrier(cmd_buffer, &info);
-
-   if (memory_barriers)
-      free(memory_barriers);
-   if (buffer_barriers)
-      free(buffer_barriers);
-   if (image_barriers)
-      free(image_barriers);
 }