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: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39855>
This commit is contained in:
David Headrick 2026-01-25 22:43:35 -08:00 committed by Marge Bot
parent d3557818d8
commit 4fae72e772
3 changed files with 62 additions and 1 deletions

View file

@ -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);
}
}
}

View file

@ -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<void**>(&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;
}
}

View file

@ -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,