From 4fae72e77240654255faaee2c147e0a74695ca4e Mon Sep 17 00:00:00 2001 From: David Headrick Date: Sun, 25 Jan 2026 22:43:35 -0800 Subject: [PATCH] dozen: Add support for VK_EXT_memory_budget VK_EXT_memory_budget was included in Vulkan 1.1. This change implements VK_EXT_memory_budget using DirectX's IDXCoreAdapter::QueryState method https://learn.microsoft.com/en-us/windows/win32/dxcore/dxcore_interface/nf-dxcore_interface-idxcoreadapter-querystate This implementation mimics `dxcore_get_memory_info` in src/gallium/drivers/d3d12/d3d12_dxcore_screen.cpp Part-of: --- src/microsoft/vulkan/dzn_device.c | 27 ++++++++++++++++++- src/microsoft/vulkan/dzn_dxcore.cpp | 24 +++++++++++++++++ .../vulkan/dzn_physical_device_enum.h | 12 +++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/src/microsoft/vulkan/dzn_device.c b/src/microsoft/vulkan/dzn_device.c index 476d075eef1..59416c01bf6 100644 --- a/src/microsoft/vulkan/dzn_device.c +++ b/src/microsoft/vulkan/dzn_device.c @@ -156,6 +156,7 @@ dzn_physical_device_get_extensions(struct dzn_physical_device *pdev) .EXT_shader_subgroup_vote = true, .EXT_subgroup_size_control = true, .EXT_vertex_attribute_divisor = true, + .EXT_memory_budget = true, .MSFT_layered_driver = true, }; } @@ -1936,7 +1937,31 @@ dzn_GetPhysicalDeviceMemoryProperties2(VkPhysicalDevice physicalDevice, &pMemoryProperties->memoryProperties); vk_foreach_struct(ext, pMemoryProperties->pNext) { - vk_debug_ignored_stype(ext->sType); + if(ext->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT){ + + VkPhysicalDeviceMemoryBudgetPropertiesEXT* vk_physical_memory_budget_properties = (VkPhysicalDeviceMemoryBudgetPropertiesEXT*)ext; + VK_FROM_HANDLE(dzn_physical_device, pdev, physicalDevice); + + struct d3d12_memory_info memory_info; + + dzn_query_memory_info(pdev->adapter, &memory_info); + + memset(vk_physical_memory_budget_properties->heapBudget, 0, sizeof(VkDeviceSize) * VK_MAX_MEMORY_HEAPS); + memset(vk_physical_memory_budget_properties->heapUsage, 0, sizeof(VkDeviceSize) * VK_MAX_MEMORY_HEAPS); + + for(int i = 0; i < pMemoryProperties->memoryProperties.memoryHeapCount; i++){ + if(pMemoryProperties->memoryProperties.memoryHeaps[i].flags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT){ + vk_physical_memory_budget_properties->heapBudget[i] = memory_info.budget_local; + vk_physical_memory_budget_properties->heapUsage[i] = memory_info.usage_local; + } else { + vk_physical_memory_budget_properties->heapBudget[i] = memory_info.budget_nonlocal; + vk_physical_memory_budget_properties->heapUsage[i] = memory_info.usage_nonlocal; + } + } + } + else { + vk_debug_ignored_stype(ext->sType); + } } } diff --git a/src/microsoft/vulkan/dzn_dxcore.cpp b/src/microsoft/vulkan/dzn_dxcore.cpp index 7089a132769..759ea607fd0 100644 --- a/src/microsoft/vulkan/dzn_dxcore.cpp +++ b/src/microsoft/vulkan/dzn_dxcore.cpp @@ -93,3 +93,27 @@ dzn_enumerate_physical_devices_dxcore(struct vk_instance *instance) return result; } +void +dzn_query_memory_info(IUnknown* unk, d3d12_memory_info* output){ + IDXCoreAdapter* adapter = NULL; + HRESULT hr = unk->QueryInterface( + __uuidof(IDXCoreAdapter), + reinterpret_cast(&adapter)); + + if(SUCCEEDED(hr)){ + + DXCoreAdapterMemoryBudget local_info, nonlocal_info; + DXCoreAdapterMemoryBudgetNodeSegmentGroup local_node_segment = { 0, DXCoreSegmentGroup::Local }; + DXCoreAdapterMemoryBudgetNodeSegmentGroup nonlocal_node_segment = { 0, DXCoreSegmentGroup::NonLocal }; + adapter->QueryState(DXCoreAdapterState::AdapterMemoryBudget, &local_node_segment, &local_info); + adapter->QueryState(DXCoreAdapterState::AdapterMemoryBudget, &nonlocal_node_segment, &nonlocal_info); + + output->budget_local = local_info.budget; + output->budget_nonlocal = nonlocal_info.budget; + output->budget = local_info.budget + nonlocal_info.budget; + output->usage_local = local_info.currentUsage; + output->usage_nonlocal = nonlocal_info.currentUsage; + output->usage = local_info.currentUsage + nonlocal_info.currentUsage; + return; + } +} \ No newline at end of file diff --git a/src/microsoft/vulkan/dzn_physical_device_enum.h b/src/microsoft/vulkan/dzn_physical_device_enum.h index 4aec1c2b7c1..298dcd8977a 100644 --- a/src/microsoft/vulkan/dzn_physical_device_enum.h +++ b/src/microsoft/vulkan/dzn_physical_device_enum.h @@ -49,12 +49,24 @@ struct dzn_physical_device_desc { char description[128]; }; +struct d3d12_memory_info { + uint64_t usage_local; + uint64_t budget_local; + uint64_t usage_nonlocal; + uint64_t budget_nonlocal; + uint64_t usage; // local + nonlocal + uint64_t budget; // local + nonlocal +}; + VkResult dzn_enumerate_physical_devices_dxgi(struct vk_instance *instance); VkResult dzn_enumerate_physical_devices_dxcore(struct vk_instance *instance); +void +dzn_query_memory_info(IUnknown* unk, struct d3d12_memory_info* memory_info); + VkResult dzn_instance_add_physical_device(struct vk_instance *instance, IUnknown *adapter,