Mesa (main): anv: Fix VK_EXT_memory_budget to consider VRAM if available

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Aug 18 17:27:24 UTC 2021


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

Author: Sagar Ghuge <sagar.ghuge at intel.com>
Date:   Tue Aug 17 18:23:11 2021 -0700

anv: Fix VK_EXT_memory_budget to consider VRAM if available

Instead of calling the OS query, re-run anv_update_meminfo to get the
latest from either the kernel memory info API or the OS as appropriate.

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/5173
Signed-off-by: Sagar Ghuge <sagar.ghuge at intel.com>
Co-authored-by: Jason Ekstrand <jason at jlekstrand.net>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12433>

---

 src/intel/vulkan/anv_device.c | 60 +++++++++++++++++++++++++++++++++----------
 1 file changed, 46 insertions(+), 14 deletions(-)

diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
index 69a143cd345..ef02557c4f1 100644
--- a/src/intel/vulkan/anv_device.c
+++ b/src/intel/vulkan/anv_device.c
@@ -338,7 +338,7 @@ anv_compute_sys_heap_size(struct anv_physical_device *device,
 }
 
 static VkResult MUST_CHECK
-anv_init_meminfo(struct anv_physical_device *device, int fd)
+anv_gather_meminfo(struct anv_physical_device *device, int fd, bool update)
 {
    char sys_mem_regions[sizeof(struct drm_i915_query_memory_regions) +
 	                sizeof(struct drm_i915_memory_region_info)];
@@ -397,8 +397,14 @@ anv_init_meminfo(struct anv_physical_device *device, int fd)
 
       uint64_t available = MIN2(size, info->unallocated_size);
 
-      region->region = info->region;
-      region->size = size;
+      if (update) {
+         assert(region->region.memory_class == info->region.memory_class);
+         assert(region->region.memory_instance == info->region.memory_instance);
+         assert(region->size == size);
+      } else {
+         region->region = info->region;
+         region->size = size;
+      }
       region->available = available;
    }
 
@@ -408,6 +414,20 @@ anv_init_meminfo(struct anv_physical_device *device, int fd)
    return VK_SUCCESS;
 }
 
+static VkResult MUST_CHECK
+anv_init_meminfo(struct anv_physical_device *device, int fd)
+{
+   return anv_gather_meminfo(device, fd, false);
+}
+
+static void
+anv_update_meminfo(struct anv_physical_device *device, int fd)
+{
+   ASSERTED VkResult result = anv_gather_meminfo(device, fd, true);
+   assert(result == VK_SUCCESS);
+}
+
+
 static VkResult
 anv_physical_device_init_heaps(struct anv_physical_device *device, int fd)
 {
@@ -2786,28 +2806,40 @@ anv_get_memory_budget(VkPhysicalDevice physicalDevice,
                       VkPhysicalDeviceMemoryBudgetPropertiesEXT *memoryBudget)
 {
    ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice);
-   uint64_t sys_available;
-   ASSERTED bool has_available_memory =
-      os_get_available_system_memory(&sys_available);
-   assert(has_available_memory);
 
-   VkDeviceSize total_heaps_size = 0;
-   for (size_t i = 0; i < device->memory.heap_count; i++)
-         total_heaps_size += device->memory.heaps[i].size;
+   anv_update_meminfo(device, device->local_fd);
+
+   VkDeviceSize total_sys_heaps_size = 0, total_vram_heaps_size = 0;
+   for (size_t i = 0; i < device->memory.heap_count; i++) {
+      if (device->memory.heaps[i].is_local_mem) {
+         total_vram_heaps_size += device->memory.heaps[i].size;
+      } else {
+         total_sys_heaps_size += device->memory.heaps[i].size;
+      }
+   }
 
    for (size_t i = 0; i < device->memory.heap_count; i++) {
       VkDeviceSize heap_size = device->memory.heaps[i].size;
       VkDeviceSize heap_used = device->memory.heaps[i].used;
-      VkDeviceSize heap_budget;
+      VkDeviceSize heap_budget, total_heaps_size;
+      uint64_t mem_available = 0;
+
+      if (device->memory.heaps[i].is_local_mem) {
+         total_heaps_size = total_vram_heaps_size;
+         mem_available = device->vram.available;
+      } else {
+         total_heaps_size = total_sys_heaps_size;
+         mem_available = device->sys.available;
+      }
 
       double heap_proportion = (double) heap_size / total_heaps_size;
-      VkDeviceSize sys_available_prop = sys_available * heap_proportion;
+      VkDeviceSize available_prop = mem_available * heap_proportion;
 
       /*
        * Let's not incite the app to starve the system: report at most 90% of
-       * available system memory.
+       * the available heap memory.
        */
-      uint64_t heap_available = sys_available_prop * 9 / 10;
+      uint64_t heap_available = available_prop * 9 / 10;
       heap_budget = MIN2(heap_size, heap_used + heap_available);
 
       /*



More information about the mesa-commit mailing list