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