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

Author: Paulo Zanoni <[email protected]>
Date:   Tue Oct 17 11:53:55 2023 -0700

anv/sparse: process image binds before opaque image binds

When sparse images are being used, applications normally use
non-opaque binds and leave opaque binds just for the miptail part.

Since miptails are always at the end of the array layers, processing
the opaque binds after processing the non-opaque binds increases the
chance that anv_sparse_submission_add() will join the miptail bind
operation with the last non-opaque opreration, especially if the user
is trying to bind the last few non-miptail levels and the miptail in
the same vkQueueBindSparse opration.

In the real world this case does happen, so we're able to save a bind
operation every once in a while in Steam games.

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 | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/src/intel/vulkan/anv_batch_chain.c 
b/src/intel/vulkan/anv_batch_chain.c
index 911ad23fe21..35896db00bb 100644
--- a/src/intel/vulkan/anv_batch_chain.c
+++ b/src/intel/vulkan/anv_batch_chain.c
@@ -1460,36 +1460,36 @@ anv_queue_submit_sparse_bind_locked(struct anv_queue 
*queue,
       }
    }
 
-   for (uint32_t i = 0; i < submit->image_opaque_bind_count; i++) {
-      VkSparseImageOpaqueMemoryBindInfo *bind_info =
-         &submit->image_opaque_binds[i];
+   for (uint32_t i = 0; i < submit->image_bind_count; i++) {
+      VkSparseImageMemoryBindInfo *bind_info = &submit->image_binds[i];
       ANV_FROM_HANDLE(anv_image, image, bind_info->image);
 
       assert(anv_image_is_sparse(image));
-      assert(!image->disjoint);
-      struct anv_sparse_binding_data *sparse_data =
-         &image->bindings[ANV_IMAGE_MEMORY_BINDING_MAIN].sparse_data;
+      assert(image->vk.create_flags & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT);
 
       for (uint32_t j = 0; j < bind_info->bindCount; j++) {
-         result = anv_sparse_bind_resource_memory(device, sparse_data,
-                                                  &bind_info->pBinds[j],
-                                                  &sparse_submit);
+         result = anv_sparse_bind_image_memory(queue, image,
+                                               &bind_info->pBinds[j],
+                                               &sparse_submit);
          if (result != VK_SUCCESS)
             goto out_free_submit;
       }
    }
 
-   for (uint32_t i = 0; i < submit->image_bind_count; i++) {
-      VkSparseImageMemoryBindInfo *bind_info = &submit->image_binds[i];
+   for (uint32_t i = 0; i < submit->image_opaque_bind_count; i++) {
+      VkSparseImageOpaqueMemoryBindInfo *bind_info =
+         &submit->image_opaque_binds[i];
       ANV_FROM_HANDLE(anv_image, image, bind_info->image);
 
       assert(anv_image_is_sparse(image));
-      assert(image->vk.create_flags & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT);
+      assert(!image->disjoint);
+      struct anv_sparse_binding_data *sparse_data =
+         &image->bindings[ANV_IMAGE_MEMORY_BINDING_MAIN].sparse_data;
 
       for (uint32_t j = 0; j < bind_info->bindCount; j++) {
-         result = anv_sparse_bind_image_memory(queue, image,
-                                               &bind_info->pBinds[j],
-                                               &sparse_submit);
+         result = anv_sparse_bind_resource_memory(device, sparse_data,
+                                                  &bind_info->pBinds[j],
+                                                  &sparse_submit);
          if (result != VK_SUCCESS)
             goto out_free_submit;
       }

Reply via email to