A simple Vulkan extension that allows apps to query size and
usage of all exposed memory heaps.

The different usage values are not really accurate because
they are per drm-fd, but they should be close enough.

Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com>
---
 src/amd/vulkan/radv_device.c      | 44 +++++++++++++++++++++++++++++++
 src/amd/vulkan/radv_extensions.py |  1 +
 2 files changed, 45 insertions(+)

diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index cef3a430555..32eaeb3b226 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -1352,12 +1352,56 @@ void radv_GetPhysicalDeviceMemoryProperties(
        *pMemoryProperties = physical_device->memory_properties;
 }
 
+static void
+radv_get_memory_budget_properties(VkPhysicalDevice physicalDevice,
+                                 VkPhysicalDeviceMemoryBudgetPropertiesEXT 
*memoryBudget)
+{
+       RADV_FROM_HANDLE(radv_physical_device, device, physicalDevice);
+       VkPhysicalDeviceMemoryProperties *memory_properties = 
&device->memory_properties;
+       uint64_t visible_vram_size = radv_get_visible_vram_size(device);
+       uint64_t vram_size = radv_get_vram_size(device);
+       uint64_t gtt_size = device->rad_info.gart_size;
+
+       if (vram_size) {
+               memoryBudget->heapBudget[RADV_MEM_HEAP_VRAM] = vram_size;
+               memoryBudget->heapUsage[RADV_MEM_HEAP_VRAM] =
+                       device->ws->query_value(device->ws, RADEON_VRAM_USAGE);
+       }
+
+       if (visible_vram_size) {
+               memoryBudget->heapBudget[RADV_MEM_HEAP_VRAM_CPU_ACCESS] = 
visible_vram_size;
+               memoryBudget->heapUsage[RADV_MEM_HEAP_VRAM_CPU_ACCESS] =
+                       device->ws->query_value(device->ws, 
RADEON_VRAM_VIS_USAGE);
+       }
+
+       if (gtt_size) {
+               memoryBudget->heapBudget[RADV_MEM_HEAP_GTT] = gtt_size;
+               memoryBudget->heapUsage[RADV_MEM_HEAP_GTT] =
+                       device->ws->query_value(device->ws, RADEON_GTT_USAGE);
+       }
+
+       /* The heapBudget and heapUsage values must be zero for array elements
+        * greater than or equal to
+        * VkPhysicalDeviceMemoryProperties::memoryHeapCount.
+        */
+       for (uint32_t i = memory_properties->memoryHeapCount; i < 
VK_MAX_MEMORY_HEAPS; i++) {
+               memoryBudget->heapBudget[i] = 0;
+               memoryBudget->heapUsage[i] = 0;
+       }
+}
+
 void radv_GetPhysicalDeviceMemoryProperties2(
        VkPhysicalDevice                            physicalDevice,
        VkPhysicalDeviceMemoryProperties2KHR       *pMemoryProperties)
 {
        radv_GetPhysicalDeviceMemoryProperties(physicalDevice,
                                               
&pMemoryProperties->memoryProperties);
+
+       VkPhysicalDeviceMemoryBudgetPropertiesEXT *memory_budget =
+               vk_find_struct(pMemoryProperties->pNext,
+                              PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT);
+       if (memory_budget)
+               radv_get_memory_budget_properties(physicalDevice, 
memory_budget);
 }
 
 VkResult radv_GetMemoryHostPointerPropertiesEXT(
diff --git a/src/amd/vulkan/radv_extensions.py 
b/src/amd/vulkan/radv_extensions.py
index 9952bb9c1c6..491ed9d94c3 100644
--- a/src/amd/vulkan/radv_extensions.py
+++ b/src/amd/vulkan/radv_extensions.py
@@ -105,6 +105,7 @@ EXTENSIONS = [
     Extension('VK_EXT_external_memory_dma_buf',           1, True),
     Extension('VK_EXT_external_memory_host',              1, 
'device->rad_info.has_userptr'),
     Extension('VK_EXT_global_priority',                   1, 
'device->rad_info.has_ctx_priority'),
+    Extension('VK_EXT_memory_budget',                     1, True),
     Extension('VK_EXT_pci_bus_info',                      2, True),
     Extension('VK_EXT_sampler_filter_minmax',             1, 
'device->rad_info.chip_class >= CIK'),
     Extension('VK_EXT_scalar_block_layout',               1, 
'device->rad_info.chip_class >= CIK'),
-- 
2.20.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to