Module: Mesa
Branch: main
Commit: 040063c156c57d8e60b9b02ee5744578a2e81160
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=040063c156c57d8e60b9b02ee5744578a2e81160

Author: Paulo Zanoni <[email protected]>
Date:   Tue Oct 24 11:51:27 2023 -0700

anv/sparse: move waiting/signaling syncobjs to the backends

Move waiting/signaling to the backends so we can fix each backend
separately.

As I write this patch the vm_bind backend is back to using synchronous
vm_binds so we can't pass syncobjs to the synchronous vm_bind ioctl
anymore. We'll need more discussions and possibly some rework before
we go back to asynchronous vm_binds. This commit should allow us to
fix the TR-TT backend in the next commit and leave vm_bind for later.

Reviewed-by: Lionel Landwerlin <[email protected]>
Signed-off-by: Paulo Zanoni <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25512>

---

 src/intel/vulkan/anv_batch_chain.c | 21 ---------------
 src/intel/vulkan/anv_sparse.c      | 53 +++++++++++++++++++++++++++++++++++++-
 2 files changed, 52 insertions(+), 22 deletions(-)

diff --git a/src/intel/vulkan/anv_batch_chain.c 
b/src/intel/vulkan/anv_batch_chain.c
index 98a6661e4cc..911ad23fe21 100644
--- a/src/intel/vulkan/anv_batch_chain.c
+++ b/src/intel/vulkan/anv_batch_chain.c
@@ -1444,16 +1444,6 @@ anv_queue_submit_sparse_bind_locked(struct anv_queue 
*queue,
       .signals = submit->signals,
    };
 
-   /* TODO: make both the syncs and signals be passed as part of the vm_bind
-    * ioctl so they can be waited asynchronously. For now this doesn't matter
-    * as we're doing synchronous vm_bind, but later when we make it async this
-    * will make a difference.
-    */
-   result = vk_sync_wait_many(&device->vk, submit->wait_count, submit->waits,
-                              VK_SYNC_WAIT_COMPLETE, INT64_MAX);
-   if (result != VK_SUCCESS)
-      return vk_queue_set_lost(&queue->vk, "vk_sync_wait failed");
-
    for (uint32_t i = 0; i < submit->buffer_bind_count; i++) {
       VkSparseBufferMemoryBindInfo *bind_info = &submit->buffer_binds[i];
       ANV_FROM_HANDLE(anv_buffer, buffer, bind_info->buffer);
@@ -1506,17 +1496,6 @@ anv_queue_submit_sparse_bind_locked(struct anv_queue 
*queue,
    }
 
    result = anv_sparse_bind(device, &sparse_submit);
-   if (result != VK_SUCCESS)
-      goto out_free_submit;
-
-   for (uint32_t i = 0; i < submit->signal_count; i++) {
-      struct vk_sync_signal *s = &submit->signals[i];
-      result = vk_sync_signal(&device->vk, s->sync, s->signal_value);
-      if (result != VK_SUCCESS) {
-         result = vk_queue_set_lost(&queue->vk, "vk_sync_signal failed");
-         goto out_free_submit;
-      }
-   }
 
 out_free_submit:
    vk_free(&device->vk.alloc, sparse_submit.binds);
diff --git a/src/intel/vulkan/anv_sparse.c b/src/intel/vulkan/anv_sparse.c
index 5e20cabc625..60012b3efc9 100644
--- a/src/intel/vulkan/anv_sparse.c
+++ b/src/intel/vulkan/anv_sparse.c
@@ -581,8 +581,35 @@ anv_sparse_bind_trtt(struct anv_device *device,
                 sparse_submit->binds_len, trtt_submit.l3l2_binds_len,
                 trtt_submit.l1_binds_len);
 
-   if (trtt_submit.l3l2_binds_len || trtt_submit.l1_binds_len)
+   /* TODO: make both the syncs and signals be passed as part of the vm_bind
+    * ioctl so they can be waited asynchronously. For now this doesn't matter
+    * as we're doing synchronous vm_bind, but later when we make it async this
+    * will make a difference.
+    */
+   result = vk_sync_wait_many(&device->vk, sparse_submit->wait_count,
+                              sparse_submit->waits, VK_SYNC_WAIT_COMPLETE,
+                              INT64_MAX);
+   if (result != VK_SUCCESS) {
+      result = vk_queue_set_lost(&sparse_submit->queue->vk,
+                                 "vk_sync_wait failed");
+      goto out;
+   }
+
+   if (trtt_submit.l3l2_binds_len || trtt_submit.l1_binds_len) {
       result = anv_genX(device->info, write_trtt_entries)(&trtt_submit);
+      if (result != VK_SUCCESS)
+         goto out;
+   }
+
+   for (uint32_t i = 0; i < sparse_submit->signal_count; i++) {
+      struct vk_sync_signal *s = &sparse_submit->signals[i];
+      result = vk_sync_signal(&device->vk, s->sync, s->signal_value);
+      if (result != VK_SUCCESS) {
+         result = vk_queue_set_lost(&sparse_submit->queue->vk,
+                                    "vk_sync_signal failed");
+         goto out;
+      }
+   }
 
 out:
    pthread_mutex_unlock(&trtt->mutex);
@@ -595,6 +622,22 @@ static VkResult
 anv_sparse_bind_vm_bind(struct anv_device *device,
                         struct anv_sparse_submission *submit)
 {
+   struct anv_queue *queue = submit->queue;
+   VkResult result;
+
+   if (!queue)
+      assert(submit->wait_count == 0 && submit->signal_count == 0);
+
+   /* TODO: make both the syncs and signals be passed as part of the vm_bind
+    * ioctl so they can be waited asynchronously. For now this doesn't matter
+    * as we're doing synchronous vm_bind, but later when we make it async this
+    * will make a difference.
+    */
+   result = vk_sync_wait_many(&device->vk, submit->wait_count, submit->waits,
+                              VK_SYNC_WAIT_COMPLETE, INT64_MAX);
+   if (result != VK_SUCCESS)
+      return vk_queue_set_lost(&queue->vk, "vk_sync_wait failed");
+
    /* FIXME: here we were supposed to issue a single vm_bind ioctl by calling
     * vm_bind(device, num_binds, binds), but for an unknown reason some
     * shader-related tests fail when we do that, so work around it for now.
@@ -613,6 +656,14 @@ anv_sparse_bind_vm_bind(struct anv_device *device,
       if (rc)
          return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
    }
+
+   for (uint32_t i = 0; i < submit->signal_count; i++) {
+      struct vk_sync_signal *s = &submit->signals[i];
+      result = vk_sync_signal(&device->vk, s->sync, s->signal_value);
+      if (result != VK_SUCCESS)
+         return vk_queue_set_lost(&queue->vk, "vk_sync_signal failed");
+   }
+
    return VK_SUCCESS;
 }
 

Reply via email to