[Mesa-dev] [PATCH 3/3] radv: add support for VK_EXT_memory_budget
Samuel Pitoiset
samuel.pitoiset at gmail.com
Mon Jan 7 17:22:48 UTC 2019
On 1/7/19 6:06 PM, Alex Smith wrote:
> Hi Samuel,
>
> Thanks for implementing this - I've been wanting this extension for a
> while so it's good it's finally available.
>
> This is just reporting the total heap sizes as the budget, which is
> the same info we already get from the basic heap properties. The way
> I'd expected budget to work (and what the spec is saying as far as I
> can see) is that it's an estimate of how much is available for the
> calling app to use in that heap at the time of the call, so should
> account for current system-wide usage of the heap by other apps.
> Shouldn't this be something like (heap size - system wide usage of the
> heap + current app usage of the heap)? (+ app usage since the spec
> says budget includes currently allocated device memory)
Hi Alex,
Yes, I was also wondering about that. We can add per-process counters
for VRAM and GTT heaps, but I don't see how we can be accurate for the
visible VRAM heap.
As said in the commit description, that implementation is really
inacurate. Though if you need something better I can improve.
Note that I agree with you about the spec.
>
> Alex
>
> On Mon, 7 Jan 2019 at 16:35, Samuel Pitoiset
> <samuel.pitoiset at gmail.com <mailto:samuel.pitoiset at gmail.com>> wrote:
>
> 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.pitoiset at gmail.com
> <mailto:samuel.pitoiset at 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 at lists.freedesktop.org <mailto:mesa-dev at lists.freedesktop.org>
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20190107/296c88de/attachment-0001.html>
More information about the mesa-dev
mailing list