From 60a99fd3d30a377b7089876dd5a0c7de12cfa2c8 Mon Sep 17 00:00:00 2001 From: elwrcl Date: Tue, 21 Jul 2026 14:20:50 +0300 Subject: [PATCH] hasvk: fix heap size calculation to use real system RAM instead of GTT --- src/intel/vulkan_hasvk/anv_device.c | 52 +++++++++++++---------------- 1 file changed, 23 insertions(+), 29 deletions(-) diff --git a/src/intel/vulkan_hasvk/anv_device.c b/src/intel/vulkan_hasvk/anv_device.c index b91a1d9..7e04a8e 100644 --- a/src/intel/vulkan_hasvk/anv_device.c +++ b/src/intel/vulkan_hasvk/anv_device.c @@ -1292,38 +1292,27 @@ get_properties(const struct anv_physical_device *pdevice, } } -static uint64_t -anv_compute_sys_heap_size(struct anv_physical_device *device, - uint64_t available_ram) -{ - /* We want to leave some padding for things we allocate in the driver, - * so don't go over 3/4 of the GTT either. - */ - available_ram = MIN2(available_ram, device->gtt_size * 3 / 4); - - if (available_ram > (2ull << 30) && !device->supports_48bit_addresses) { - /* When running with an overridden PCI ID, we may get a GTT size from - * the kernel that is greater than 2 GiB but the execbuf check for 48bit - * address support can still fail. Just clamp the address space size to - * 2 GiB if we don't have 48-bit support. - */ - mesa_logw("%s:%d: The kernel reported a GTT size larger than 2 GiB but " - "not support for 48-bit addresses", - __FILE__, __LINE__); - available_ram = 2ull << 30; - } - - return available_ram; -} - static VkResult MUST_CHECK anv_init_meminfo(struct anv_physical_device *device, int fd) { const struct intel_device_info *devinfo = &device->info; - device->sys.size = - anv_compute_sys_heap_size(device, devinfo->mem.sram.mappable.size); - device->sys.available = devinfo->mem.sram.mappable.free; + float percent = OS_GPU_HEAP_SIZE_HEURISTIC; + uint64_t heap_size = os_get_gpu_heap_size(percent, &percent); + if (heap_size == 0) { + mesa_logw("Failed to query total physical memory! " + "Falling back to GTT size."); + heap_size = devinfo->mem.sram.mappable.size; + } + + device->sys.size = heap_size; + + uint64_t available_system_ram; + if (os_get_available_system_memory(&available_system_ram)) { + device->sys.available = available_system_ram; + } else { + device->sys.available = devinfo->mem.sram.mappable.free; + } return VK_SUCCESS; } @@ -1334,8 +1323,13 @@ anv_update_meminfo(struct anv_physical_device *device, int fd) if (!intel_device_info_update_memory_info(&device->info, fd)) return; - const struct intel_device_info *devinfo = &device->info; - device->sys.available = devinfo->mem.sram.mappable.free; + uint64_t available_system_ram; + if (os_get_available_system_memory(&available_system_ram)) { + device->sys.available = available_system_ram; + } else { + const struct intel_device_info *devinfo = &device->info; + device->sys.available = devinfo->mem.sram.mappable.free; + } } static VkResult