From ea3cbbc5965a6eb1010245f95f5293d4d9871028 Mon Sep 17 00:00:00 2001 From: Stephen Saunders Date: Fri, 15 Dec 2023 18:09:39 -0500 Subject: [PATCH 1/4] Fix VkPhysicalDeviceMemoryBudgetPropertiesEXT heapUsage query for non-unified memory devices --- Common/MVKOSExtensions.mm | 4 ++++ MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Common/MVKOSExtensions.mm b/Common/MVKOSExtensions.mm index 8d33f3d4..0a45aad9 100644 --- a/Common/MVKOSExtensions.mm +++ b/Common/MVKOSExtensions.mm @@ -134,7 +134,11 @@ uint64_t mvkGetUsedMemorySize() { task_vm_info_data_t task_vm_info; mach_msg_type_number_t task_size = TASK_VM_INFO_COUNT; if (task_info(mach_task_self(), TASK_VM_INFO, (task_info_t)&task_vm_info, &task_size) == KERN_SUCCESS) { +#ifdef TASK_VM_INFO_REV3_COUNT // check for rev3 version of task_vm_info + return task_vm_info.ledger_tag_graphics_footprint; +#else return task_vm_info.phys_footprint; +#endif } return 0; } diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm index af016e51..be729b17 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm @@ -1650,12 +1650,12 @@ VkResult MVKPhysicalDevice::getMemoryProperties(VkPhysicalDeviceMemoryProperties auto* budgetProps = (VkPhysicalDeviceMemoryBudgetPropertiesEXT*)next; mvkClear(budgetProps->heapBudget, VK_MAX_MEMORY_HEAPS); mvkClear(budgetProps->heapUsage, VK_MAX_MEMORY_HEAPS); - budgetProps->heapBudget[0] = (VkDeviceSize)getRecommendedMaxWorkingSetSize(); - budgetProps->heapUsage[0] = (VkDeviceSize)getCurrentAllocatedSize(); if (!getHasUnifiedMemory()) { budgetProps->heapBudget[1] = (VkDeviceSize)mvkGetAvailableMemorySize(); budgetProps->heapUsage[1] = (VkDeviceSize)mvkGetUsedMemorySize(); } + budgetProps->heapBudget[0] = (VkDeviceSize)getRecommendedMaxWorkingSetSize(); + budgetProps->heapUsage[0] = (VkDeviceSize)getCurrentAllocatedSize() - budgetProps->heapUsage[1]; break; } default: From ef0ac40cff8b7a6b517319a9dacfe8c70e6853d3 Mon Sep 17 00:00:00 2001 From: Stephen Saunders Date: Fri, 15 Dec 2023 21:04:12 -0500 Subject: [PATCH 2/4] Add a defensive guard to ensure heapUsage[0] calculation is always sane --- MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm index be729b17..f42987bf 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm @@ -1655,7 +1655,12 @@ VkResult MVKPhysicalDevice::getMemoryProperties(VkPhysicalDeviceMemoryProperties budgetProps->heapUsage[1] = (VkDeviceSize)mvkGetUsedMemorySize(); } budgetProps->heapBudget[0] = (VkDeviceSize)getRecommendedMaxWorkingSetSize(); - budgetProps->heapUsage[0] = (VkDeviceSize)getCurrentAllocatedSize() - budgetProps->heapUsage[1]; + uint64_t currentAllocatedSize = (VkDeviceSize)getCurrentAllocatedSize(); + if (budgetProps->heapUsage[1] > currentAllocatedSize) { + // mapped memory can't be larger than total memory, so ignore and zero-out + budgetProps->heapUsage[1] = 0; + } + budgetProps->heapUsage[0] = currentAllocatedSize - budgetProps->heapUsage[1]; break; } default: From 28be920b2f0d8989182990b2b5a0e566852ef294 Mon Sep 17 00:00:00 2001 From: Stephen Saunders Date: Fri, 15 Dec 2023 22:15:53 -0500 Subject: [PATCH 3/4] Check for Rev3 task info / ledger_tag_graphics_footprint availability at runtime --- Common/MVKOSExtensions.mm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Common/MVKOSExtensions.mm b/Common/MVKOSExtensions.mm index 0a45aad9..c1af7544 100644 --- a/Common/MVKOSExtensions.mm +++ b/Common/MVKOSExtensions.mm @@ -135,10 +135,12 @@ uint64_t mvkGetUsedMemorySize() { mach_msg_type_number_t task_size = TASK_VM_INFO_COUNT; if (task_info(mach_task_self(), TASK_VM_INFO, (task_info_t)&task_vm_info, &task_size) == KERN_SUCCESS) { #ifdef TASK_VM_INFO_REV3_COUNT // check for rev3 version of task_vm_info - return task_vm_info.ledger_tag_graphics_footprint; -#else - return task_vm_info.phys_footprint; + if (task_size >= TASK_VM_INFO_REV3_COUNT) { + return task_vm_info.ledger_tag_graphics_footprint; + } + else #endif + return task_vm_info.phys_footprint; } return 0; } From 99123bf1dcdacee04c751f59866a28be38933644 Mon Sep 17 00:00:00 2001 From: Chip Davis Date: Sat, 16 Dec 2023 14:55:04 -0700 Subject: [PATCH 4/4] Use `auto` instead of an explicit type. --- MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm index f42987bf..47ca882e 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm @@ -1655,7 +1655,7 @@ VkResult MVKPhysicalDevice::getMemoryProperties(VkPhysicalDeviceMemoryProperties budgetProps->heapUsage[1] = (VkDeviceSize)mvkGetUsedMemorySize(); } budgetProps->heapBudget[0] = (VkDeviceSize)getRecommendedMaxWorkingSetSize(); - uint64_t currentAllocatedSize = (VkDeviceSize)getCurrentAllocatedSize(); + auto currentAllocatedSize = (VkDeviceSize)getCurrentAllocatedSize(); if (budgetProps->heapUsage[1] > currentAllocatedSize) { // mapped memory can't be larger than total memory, so ignore and zero-out budgetProps->heapUsage[1] = 0;