mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-01 03:48:06 +02:00
anv: Use memory info from devinfo
Rework: * Jordan: Drop regions.valid (Lionel implemented a fallback) Signed-off-by: Jordan Justen <jordan.l.justen@intel.com> Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17075>
This commit is contained in:
parent
4289c9ec13
commit
1505f94397
1 changed files with 21 additions and 78 deletions
|
|
@ -366,92 +366,35 @@ anv_compute_sys_heap_size(struct anv_physical_device *device,
|
|||
return available_ram;
|
||||
}
|
||||
|
||||
static VkResult MUST_CHECK
|
||||
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)];
|
||||
|
||||
struct drm_i915_query_memory_regions *mem_regions =
|
||||
intel_i915_query_alloc(fd, DRM_I915_QUERY_MEMORY_REGIONS, NULL);
|
||||
if (mem_regions == NULL) {
|
||||
if (device->info.has_local_mem) {
|
||||
return vk_errorf(device, VK_ERROR_INCOMPATIBLE_DRIVER,
|
||||
"failed to memory regions: %m");
|
||||
}
|
||||
|
||||
uint64_t total_phys;
|
||||
if (!os_get_total_physical_memory(&total_phys)) {
|
||||
return vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED,
|
||||
"failed to get total physical memory: %m");
|
||||
}
|
||||
|
||||
uint64_t available;
|
||||
if (!os_get_available_system_memory(&available))
|
||||
available = 0; /* Silently disable VK_EXT_memory_budget */
|
||||
|
||||
/* The kernel query failed. Fake it using OS memory queries. This
|
||||
* should be roughly the same for integrated GPUs.
|
||||
*/
|
||||
mem_regions = (void *)sys_mem_regions;
|
||||
mem_regions->num_regions = 1;
|
||||
mem_regions->regions[0] = (struct drm_i915_memory_region_info) {
|
||||
.region.memory_class = I915_MEMORY_CLASS_SYSTEM,
|
||||
.probed_size = total_phys,
|
||||
.unallocated_size = available,
|
||||
};
|
||||
}
|
||||
|
||||
for(int i = 0; i < mem_regions->num_regions; i++) {
|
||||
struct drm_i915_memory_region_info *info = &mem_regions->regions[i];
|
||||
|
||||
struct anv_memregion *region;
|
||||
switch (info->region.memory_class) {
|
||||
case I915_MEMORY_CLASS_SYSTEM:
|
||||
region = &device->sys;
|
||||
break;
|
||||
case I915_MEMORY_CLASS_DEVICE:
|
||||
region = &device->vram;
|
||||
break;
|
||||
default:
|
||||
/* We don't know what kind of memory this is */
|
||||
continue;
|
||||
}
|
||||
|
||||
uint64_t size = info->probed_size;
|
||||
if (info->region.memory_class == I915_MEMORY_CLASS_SYSTEM)
|
||||
size = anv_compute_sys_heap_size(device, size);
|
||||
|
||||
uint64_t available = MIN2(size, info->unallocated_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;
|
||||
}
|
||||
|
||||
if (mem_regions != (void *)sys_mem_regions)
|
||||
free(mem_regions);
|
||||
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
static VkResult MUST_CHECK
|
||||
anv_init_meminfo(struct anv_physical_device *device, int fd)
|
||||
{
|
||||
return anv_gather_meminfo(device, fd, false);
|
||||
const struct intel_device_info *devinfo = &device->info;
|
||||
|
||||
device->sys.region.memory_class = devinfo->mem.sram.mem_class;
|
||||
device->sys.region.memory_instance = devinfo->mem.sram.mem_instance;
|
||||
device->sys.size =
|
||||
anv_compute_sys_heap_size(device, devinfo->mem.sram.mappable.size);
|
||||
device->sys.available = devinfo->mem.sram.mappable.free;
|
||||
|
||||
device->vram.region.memory_class = devinfo->mem.vram.mem_class;
|
||||
device->vram.region.memory_instance =
|
||||
devinfo->mem.vram.mem_instance;
|
||||
device->vram.size = devinfo->mem.vram.mappable.size;
|
||||
device->vram.available = devinfo->mem.vram.mappable.free;
|
||||
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
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);
|
||||
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;
|
||||
device->vram.available = devinfo->mem.vram.mappable.free;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue