Mesa (master): anv: Add an anv_queue_family struct

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jan 28 18:34:22 UTC 2021


Module: Mesa
Branch: master
Commit: 89ae9457309e9dea4c40cf313798315e4ff86892
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=89ae9457309e9dea4c40cf313798315e4ff86892

Author: Jason Ekstrand <jason.ekstrand at intel.com>
Date:   Tue Jan 26 01:13:36 2021 -0600

anv: Add an anv_queue_family struct

This is modeled on anv_memory_type and anv_memory_heap which we already
use for managing memory types.  Each anv_queue_family contains some data
which is returned by vkGetPhysicalDeviceQueueFamilyProperties() verbatim
as well as some internal book-keeping bits.  An array of queue families
along with a count is stored in the physical device.  Each anv_queue
then contains a pointer to the anv_queue_family to which it belongs.

Reviewed-by: Jordan Justen <jordan.l.justen at intel.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8667>

---

 src/intel/vulkan/anv_device.c  | 47 ++++++++++++++++++++++++++++++------------
 src/intel/vulkan/anv_private.h | 19 ++++++++++++++++-
 src/intel/vulkan/anv_queue.c   |  5 +++++
 3 files changed, 57 insertions(+), 14 deletions(-)

diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
index 4195ef9c49b..72147526461 100644
--- a/src/intel/vulkan/anv_device.c
+++ b/src/intel/vulkan/anv_device.c
@@ -296,6 +296,19 @@ anv_physical_device_free_disk_cache(struct anv_physical_device *device)
 #endif
 }
 
+static void
+anv_physical_device_init_queue_families(struct anv_physical_device *pdevice)
+{
+   pdevice->queue.family_count = 1;
+   pdevice->queue.families[0] = (struct anv_queue_family) {
+      .queueFlags = VK_QUEUE_GRAPHICS_BIT |
+                    VK_QUEUE_COMPUTE_BIT |
+                    VK_QUEUE_TRANSFER_BIT,
+      .queueCount = 1,
+      .engine_class = I915_ENGINE_CLASS_RENDER,
+   };
+}
+
 static VkResult
 anv_physical_device_try_create(struct anv_instance *instance,
                                drmDevicePtr drm_device,
@@ -550,6 +563,8 @@ anv_physical_device_try_create(struct anv_instance *instance,
    }
    device->master_fd = master_fd;
 
+   anv_physical_device_init_queue_families(device);
+
    result = anv_init_wsi(device);
    if (result != VK_SUCCESS)
       goto fail_disk_cache;
@@ -2193,13 +2208,8 @@ void anv_GetPhysicalDeviceProperties2(
 #undef CORE_PROPERTY
 }
 
-/* We support exactly one queue family. */
 static const VkQueueFamilyProperties
-anv_queue_family_properties = {
-   .queueFlags = VK_QUEUE_GRAPHICS_BIT |
-                 VK_QUEUE_COMPUTE_BIT |
-                 VK_QUEUE_TRANSFER_BIT,
-   .queueCount = 1,
+anv_queue_family_properties_template = {
    .timestampValidBits = 36, /* XXX: Real value here */
    .minImageTransferGranularity = { 1, 1, 1 },
 };
@@ -2209,10 +2219,16 @@ void anv_GetPhysicalDeviceQueueFamilyProperties(
     uint32_t*                                   pCount,
     VkQueueFamilyProperties*                    pQueueFamilyProperties)
 {
+   ANV_FROM_HANDLE(anv_physical_device, pdevice, physicalDevice);
    VK_OUTARRAY_MAKE(out, pQueueFamilyProperties, pCount);
 
-   vk_outarray_append(&out, p) {
-      *p = anv_queue_family_properties;
+   for (uint32_t i = 0; i < pdevice->queue.family_count; i++) {
+      struct anv_queue_family *queue_family = &pdevice->queue.families[i];
+      vk_outarray_append(&out, p) {
+         *p = anv_queue_family_properties_template;
+         p->queueFlags = queue_family->queueFlags;
+         p->queueCount = queue_family->queueCount;
+      }
    }
 }
 
@@ -2221,14 +2237,19 @@ void anv_GetPhysicalDeviceQueueFamilyProperties2(
     uint32_t*                                   pQueueFamilyPropertyCount,
     VkQueueFamilyProperties2*                   pQueueFamilyProperties)
 {
-
+   ANV_FROM_HANDLE(anv_physical_device, pdevice, physicalDevice);
    VK_OUTARRAY_MAKE(out, pQueueFamilyProperties, pQueueFamilyPropertyCount);
 
-   vk_outarray_append(&out, p) {
-      p->queueFamilyProperties = anv_queue_family_properties;
+   for (uint32_t i = 0; i < pdevice->queue.family_count; i++) {
+      struct anv_queue_family *queue_family = &pdevice->queue.families[i];
+      vk_outarray_append(&out, p) {
+         p->queueFamilyProperties = anv_queue_family_properties_template;
+         p->queueFamilyProperties.queueFlags = queue_family->queueFlags;
+         p->queueFamilyProperties.queueCount = queue_family->queueCount;
 
-      vk_foreach_struct(s, p->pNext) {
-         anv_debug_ignored_stype(s->sType);
+         vk_foreach_struct(s, p->pNext) {
+            anv_debug_ignored_stype(s->sType);
+         }
       }
    }
 }
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index ef7f9a36ccd..389c1d49661 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -1033,6 +1033,17 @@ struct anv_bo_cache {
 VkResult anv_bo_cache_init(struct anv_bo_cache *cache);
 void anv_bo_cache_finish(struct anv_bo_cache *cache);
 
+struct anv_queue_family {
+   /* Standard bits passed on to the client */
+   VkQueueFlags   queueFlags;
+   uint32_t       queueCount;
+
+   /* Driver internal information */
+   enum drm_i915_gem_engine_class engine_class;
+};
+
+#define ANV_MAX_QUEUE_FAMILIES 1
+
 struct anv_memory_type {
    /* Standard bits passed on to the client */
    VkMemoryPropertyFlags   propertyFlags;
@@ -1129,6 +1140,11 @@ struct anv_physical_device {
     uint32_t                                    eu_total;
     uint32_t                                    subslice_total;
 
+    struct {
+      uint32_t                                  family_count;
+      struct anv_queue_family                   families[ANV_MAX_QUEUE_FAMILIES];
+    } queue;
+
     struct {
       uint32_t                                  type_count;
       struct anv_memory_type                    types[VK_MAX_MEMORY_TYPES];
@@ -1240,11 +1256,12 @@ struct anv_queue_submit {
 };
 
 struct anv_queue {
-    struct vk_object_base                       base;
+   struct vk_object_base                     base;
 
    struct anv_device *                       device;
 
    VkDeviceQueueCreateFlags                  flags;
+   struct anv_queue_family *                 family;
 
    /* Set once from the device api calls. */
    bool                                      lost_signaled;
diff --git a/src/intel/vulkan/anv_queue.c b/src/intel/vulkan/anv_queue.c
index e95ebecc11f..6a7e57db230 100644
--- a/src/intel/vulkan/anv_queue.c
+++ b/src/intel/vulkan/anv_queue.c
@@ -488,10 +488,15 @@ VkResult
 anv_queue_init(struct anv_device *device, struct anv_queue *queue,
                const VkDeviceQueueCreateInfo *pCreateInfo)
 {
+   struct anv_physical_device *pdevice = device->physical;
    VkResult result;
 
    queue->device = device;
    queue->flags = pCreateInfo->flags;
+
+   assert(pCreateInfo->queueFamilyIndex < pdevice->queue.family_count);
+   queue->family = &pdevice->queue.families[pCreateInfo->queueFamilyIndex];
+
    queue->lost = false;
    queue->quit = false;
 



More information about the mesa-commit mailing list