Mesa (main): zink: detect sparse-only binding queue

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jun 16 02:17:41 UTC 2022


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Fri Jun 10 15:32:58 2022 -0400

zink: detect sparse-only binding queue

still prefer binding on the gfx queue when available, but store a separate
sparse binding queue if necessary

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17066>

---

 src/gallium/drivers/zink/zink_screen.c | 22 ++++++++++++++++++----
 src/gallium/drivers/zink/zink_screen.h |  2 ++
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c
index 941d81e12bc..53a1ba65db0 100644
--- a/src/gallium/drivers/zink/zink_screen.c
+++ b/src/gallium/drivers/zink/zink_screen.c
@@ -1371,14 +1371,22 @@ update_queue_props(struct zink_screen *screen)
    VkQueueFamilyProperties *props = malloc(sizeof(*props) * num_queues);
    VKSCR(GetPhysicalDeviceQueueFamilyProperties)(screen->pdev, &num_queues, props);
 
+   bool found_gfx = false;
+   uint32_t sparse_only = UINT32_MAX;
+   screen->sparse_queue = UINT32_MAX;
    for (uint32_t i = 0; i < num_queues; i++) {
-      if (props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
+      if (!found_gfx && (props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT)) {
          screen->gfx_queue = i;
          screen->max_queues = props[i].queueCount;
          screen->timestamp_valid_bits = props[i].timestampValidBits;
-         break;
-      }
-   }
+         found_gfx = true;
+         if (props[i].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)
+            screen->sparse_queue = i;
+      } else if (props[i].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)
+         sparse_only = i;
+   }
+   if (screen->sparse_queue == UINT32_MAX)
+      screen->sparse_queue = sparse_only;
    free(props);
 }
 
@@ -1387,6 +1395,12 @@ init_queue(struct zink_screen *screen)
 {
    simple_mtx_init(&screen->queue_lock, mtx_plain);
    VKSCR(GetDeviceQueue)(screen->dev, screen->gfx_queue, 0, &screen->queue);
+   if (screen->sparse_queue != UINT32_MAX) {
+      if (screen->sparse_queue != screen->gfx_queue)
+         VKSCR(GetDeviceQueue)(screen->dev, screen->sparse_queue, 0, &screen->queue_sparse);
+      else
+         screen->queue_sparse = screen->queue;
+   }
 }
 
 static void
diff --git a/src/gallium/drivers/zink/zink_screen.h b/src/gallium/drivers/zink/zink_screen.h
index e3350e0c17b..a40004e4200 100644
--- a/src/gallium/drivers/zink/zink_screen.h
+++ b/src/gallium/drivers/zink/zink_screen.h
@@ -156,10 +156,12 @@ struct zink_screen {
    bool faked_e5sparse; //drivers may not expose R9G9B9E5 but cts requires it
 
    uint32_t gfx_queue;
+   uint32_t sparse_queue;
    uint32_t max_queues;
    uint32_t timestamp_valid_bits;
    VkDevice dev;
    VkQueue queue; //gfx+compute
+   VkQueue queue_sparse;
    simple_mtx_t queue_lock;
    VkDebugUtilsMessengerEXT debugUtilsCallbackHandle;
 



More information about the mesa-commit mailing list