mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-03-12 00:20:43 +01:00
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:
parent
d3557818d8
commit
4fae72e772
3 changed files with 62 additions and 1 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue