Mesa (main): anv: Query memory region info

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jun 24 16:52:04 UTC 2021


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

Author: Sagar Ghuge <sagar.ghuge at intel.com>
Date:   Tue Mar 31 18:23:25 2020 -0700

anv: Query memory region info

Create additional memory type with DEVICE_LOCAL_BIT if we have local
memory region aviable.

v2 (Jason Ekstrand):
 - Don't leak mem_regions if the second ioctl fails

Signed-off-by: Sagar Ghuge <sagar.ghuge at intel.com>
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5599>

---

 src/intel/vulkan/anv_device.c  | 52 ++++++++++++++++++++++++++++++++++++++++++
 src/intel/vulkan/anv_private.h |  1 +
 2 files changed, 53 insertions(+)

diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
index 5597b065467..c101fedd0a6 100644
--- a/src/intel/vulkan/anv_device.c
+++ b/src/intel/vulkan/anv_device.c
@@ -325,9 +325,61 @@ get_device_extensions(const struct anv_physical_device *device,
    };
 }
 
+static void
+anv_track_meminfo(struct anv_physical_device *device,
+                  const struct drm_i915_query_memory_regions *mem_regions)
+{
+   for(int i = 0; i < mem_regions->num_regions; i++) {
+      switch(mem_regions->regions[i].region.memory_class) {
+         case I915_MEMORY_CLASS_SYSTEM:
+         device->sys.region = mem_regions->regions[i].region;
+         device->sys.size = mem_regions->regions[i].probed_size;
+         break;
+      case I915_MEMORY_CLASS_DEVICE:
+         device->vram.region = mem_regions->regions[i].region;
+         device->vram.size = mem_regions->regions[i].probed_size;
+         break;
+      default:
+         break;
+      }
+   }
+}
+
+static bool
+anv_get_query_meminfo(struct anv_physical_device *device, int fd)
+{
+   struct drm_i915_query_item item = {
+      .query_id = DRM_I915_QUERY_MEMORY_REGIONS
+   };
+
+   struct drm_i915_query query = {
+      .num_items = 1,
+      .items_ptr = (uintptr_t) &item,
+   };
+
+   if (drmIoctl(fd, DRM_IOCTL_I915_QUERY, &query))
+      return false;
+
+   struct drm_i915_query_memory_regions *mem_regions = calloc(1, item.length);
+   item.data_ptr = (uintptr_t) mem_regions;
+
+   if (drmIoctl(fd, DRM_IOCTL_I915_QUERY, &query) || item.length <= 0) {
+      free(mem_regions);
+      return false;
+   }
+
+   anv_track_meminfo(device, mem_regions);
+
+   free(mem_regions);
+   return true;
+}
+
 static void
 anv_init_meminfo(struct anv_physical_device *device, int fd)
 {
+   if (anv_get_query_meminfo(device, fd))
+      return;
+
    uint64_t heap_size = anv_compute_heap_size(fd, device->gtt_size);
 
    if (heap_size > (2ull << 30) && !device->supports_48bit_addresses) {
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index 4172b07439e..0e7e3962c6e 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -875,6 +875,7 @@ struct anv_memory_heap {
 };
 
 struct anv_memregion {
+   struct drm_i915_gem_memory_class_instance region;
    uint64_t size;
 };
 



More information about the mesa-commit mailing list