From c0705c8f7dbcb6150ee2d4eb92d482a89c9d9734 Mon Sep 17 00:00:00 2001 From: Antarctic Coder Date: Tue, 20 Jun 2023 10:19:29 -0400 Subject: [PATCH] Made some fixes for Deferred Operations The changes are as follows: * Moved the code around to fit with the ordering system * Added a function to get available cpu cores * Renamed variables with _ in front of them * Added mutexes and lock guards for the getters and setters of the max concurrency and result variables * Made max concurrency dynamic by returning 0 when the operation is finished --- Common/MVKOSExtensions.h | 6 +++++ Common/MVKOSExtensions.mm | 7 ++++++ MoltenVK/MoltenVK/GPUObjects/MVKDevice.h | 2 +- MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm | 10 ++++---- MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm | 10 ++++---- MoltenVK/MoltenVK/GPUObjects/MVKSync.h | 27 +++++++++++++++------ MoltenVK/MoltenVK/GPUObjects/MVKSync.mm | 24 +++++++++++++----- MoltenVK/MoltenVK/Vulkan/vulkan.mm | 12 ++++----- 8 files changed, 67 insertions(+), 31 deletions(-) diff --git a/Common/MVKOSExtensions.h b/Common/MVKOSExtensions.h index fde73c5c..23708325 100644 --- a/Common/MVKOSExtensions.h +++ b/Common/MVKOSExtensions.h @@ -164,3 +164,9 @@ uint64_t mvkGetUsedMemorySize(); /** Returns the size of a page of host memory on this platform. */ uint64_t mvkGetHostMemoryPageSize(); + +#pragma mark - +#pragma mark Threading + +/** Returns the amount of avaliable CPU cores. */ +uint32_t mvkGetAvaliableCPUCores(); diff --git a/Common/MVKOSExtensions.mm b/Common/MVKOSExtensions.mm index 6c023086..ef98f0b5 100644 --- a/Common/MVKOSExtensions.mm +++ b/Common/MVKOSExtensions.mm @@ -138,3 +138,10 @@ uint64_t mvkGetUsedMemorySize() { uint64_t mvkGetHostMemoryPageSize() { return sysconf(_SC_PAGESIZE); } +#pragma mark - +#pragma mark Threading + +/** Returns the amount of avaliable CPU cores. */ +uint32_t mvkGetAvaliableCPUCores() { + return (uint32_t)[[NSProcessInfo processInfo] activeProcessorCount]; +} diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h index f4b4660a..d136d7d5 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h @@ -50,8 +50,8 @@ class MVKSwapchain; class MVKDeviceMemory; class MVKFence; class MVKSemaphore; -class MVKDeferredOperation; class MVKTimelineSemaphore; +class MVKDeferredOperation; class MVKEvent; class MVKSemaphoreImpl; class MVKQueryPool; diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm index 49efde1a..23109a22 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm @@ -3699,6 +3699,11 @@ MVKSemaphore* MVKDevice::createSemaphore(const VkSemaphoreCreateInfo* pCreateInf } } +void MVKDevice::destroySemaphore(MVKSemaphore* mvkSem4, + const VkAllocationCallbacks* pAllocator) { + if (mvkSem4) { mvkSem4->destroy(); } +} + MVKDeferredOperation* MVKDevice::createDeferredOperation(const VkAllocationCallbacks* pAllocator) { return new MVKDeferredOperation(this); } @@ -3708,11 +3713,6 @@ void MVKDevice::destroyDeferredOperation(MVKDeferredOperation* mvkDeferredOperat if(mvkDeferredOperation) { mvkDeferredOperation->destroy(); } } -void MVKDevice::destroySemaphore(MVKSemaphore* mvkSem4, - const VkAllocationCallbacks* pAllocator) { - if (mvkSem4) { mvkSem4->destroy(); } -} - MVKEvent* MVKDevice::createEvent(const VkEventCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator) { const VkExportMetalObjectCreateInfoEXT* pExportInfo = nullptr; diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm index 902f767a..240e1cfe 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm @@ -718,6 +718,11 @@ void MVKInstance::initProcAddrs() { ADD_DVC_1_3_PROMOTED_ENTRY_POINT(vkSetPrivateData, EXT, EXT_PRIVATE_DATA); // Device extension functions. + ADD_DVC_EXT_ENTRY_POINT(vkCreateDeferredOperationKHR, KHR_DEFERRED_HOST_OPERATIONS); + ADD_DVC_EXT_ENTRY_POINT(vkDeferredOperationJoinKHR, KHR_DEFERRED_HOST_OPERATIONS); + ADD_DVC_EXT_ENTRY_POINT(vkDestroyDeferredOperationKHR, KHR_DEFERRED_HOST_OPERATIONS); + ADD_DVC_EXT_ENTRY_POINT(vkGetDeferredOperationMaxConcurrencyKHR, KHR_DEFERRED_HOST_OPERATIONS); + ADD_DVC_EXT_ENTRY_POINT(vkGetDeferredOperationResultKHR, KHR_DEFERRED_HOST_OPERATIONS); ADD_DVC_EXT_ENTRY_POINT(vkMapMemory2KHR, KHR_MAP_MEMORY_2); ADD_DVC_EXT_ENTRY_POINT(vkUnmapMemory2KHR, KHR_MAP_MEMORY_2); ADD_DVC_EXT_ENTRY_POINT(vkCmdPushDescriptorSetKHR, KHR_PUSH_DESCRIPTOR); @@ -731,11 +736,6 @@ void MVKInstance::initProcAddrs() { ADD_DVC_EXT2_ENTRY_POINT(vkGetDeviceGroupSurfacePresentModesKHR, KHR_SWAPCHAIN, KHR_DEVICE_GROUP); ADD_DVC_EXT2_ENTRY_POINT(vkGetPhysicalDevicePresentRectanglesKHR, KHR_SWAPCHAIN, KHR_DEVICE_GROUP); ADD_DVC_EXT2_ENTRY_POINT(vkAcquireNextImage2KHR, KHR_SWAPCHAIN, KHR_DEVICE_GROUP); - ADD_DVC_EXT_ENTRY_POINT(vkCreateDeferredOperationKHR, KHR_DEFERRED_HOST_OPERATIONS); - ADD_DVC_EXT_ENTRY_POINT(vkDeferredOperationJoinKHR, KHR_DEFERRED_HOST_OPERATIONS); - ADD_DVC_EXT_ENTRY_POINT(vkDestroyDeferredOperationKHR, KHR_DEFERRED_HOST_OPERATIONS); - ADD_DVC_EXT_ENTRY_POINT(vkGetDeferredOperationMaxConcurrencyKHR, KHR_DEFERRED_HOST_OPERATIONS); - ADD_DVC_EXT_ENTRY_POINT(vkGetDeferredOperationResultKHR, KHR_DEFERRED_HOST_OPERATIONS); ADD_DVC_EXT_ENTRY_POINT(vkDebugMarkerSetObjectTagEXT, EXT_DEBUG_MARKER); ADD_DVC_EXT_ENTRY_POINT(vkDebugMarkerSetObjectNameEXT, EXT_DEBUG_MARKER); ADD_DVC_EXT_ENTRY_POINT(vkCmdDebugMarkerBeginEXT, EXT_DEBUG_MARKER); diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKSync.h b/MoltenVK/MoltenVK/GPUObjects/MVKSync.h index 10735d03..646fed89 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKSync.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKSync.h @@ -665,27 +665,40 @@ public: VkResult join(); /** Gets the max number of threads that can execute the deferred operation concurrently*/ - uint32_t getMaxConcurrency() { return 1; } // Perhaps the number of CPU cores + uint32_t getMaxConcurrency() { + std::lock_guard lock(_maxConcurrencyLock); + return _maxConcurrency; + } /** Gets the result of the execution of the deferred operation */ - VkResult getResult() { return operationResult; } + VkResult getResult() { + std::lock_guard lock(_resultLock); + return _operationResult; + } /** Sets all the variables needed for a deferred operation, however should never be called manually and only from other functions that take deferred operations*/ - void deferOperation(MVKDeferredOperationFunctionPointer pointer, MVKDeferredOperationFunctionType type, std::vector parameters); + void deferOperation(MVKDeferredOperationFunctionPointer pointer, MVKDeferredOperationFunctionType type, std::vector&& parameters); #pragma mark Construction MVKDeferredOperation(MVKDevice* device) : MVKVulkanAPIDeviceObject(device) {} protected: /** Stores the result of the operation*/ - VkResult operationResult = VK_SUCCESS; + VkResult _operationResult = VK_SUCCESS; + /** The mutex for the operation result being used to ensure thread safety. */ + std::mutex _resultLock; /** Stores a pointer to the function*/ - MVKDeferredOperationFunctionPointer functionPointer; + MVKDeferredOperationFunctionPointer _functionPointer; /** Stores what functions is being deferred*/ - MVKDeferredOperationFunctionType functionType; + MVKDeferredOperationFunctionType _functionType; /** The parameters in the operation being deferred*/ - std::vector functionParameters = {}; + std::vector _functionParameters = {}; + + /** Stores the max amount of threads that should be used.. */ + uint32_t _maxConcurrency = 0; + /** The mutex for the max concurrency being used to ensure thread safety. */ + std::mutex _maxConcurrencyLock; void propagateDebugName() override {} }; diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKSync.mm b/MoltenVK/MoltenVK/GPUObjects/MVKSync.mm index 98eaae84..4ab8375b 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKSync.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKSync.mm @@ -625,18 +625,30 @@ MVKMetalCompiler::~MVKMetalCompiler() { VkResult MVKDeferredOperation::join() { VkResult opResult; - switch(functionType) + switch(_functionType) { // Set operation result here by calling operation default: return VK_THREAD_DONE_KHR; }; - operationResult = opResult; + + _resultLock.lock(); + _operationResult = opResult; + _resultLock.unlock(); + + _maxConcurrencyLock.lock(); + _maxConcurrency = 0; + _maxConcurrencyLock.unlock(); + return VK_SUCCESS; } -void MVKDeferredOperation::deferOperation(MVKDeferredOperationFunctionPointer pointer, MVKDeferredOperationFunctionType type, std::vector parameters) +void MVKDeferredOperation::deferOperation(MVKDeferredOperationFunctionPointer pointer, MVKDeferredOperationFunctionType type, std::vector&& parameters) { - functionPointer = pointer; - functionType = type; - functionParameters = parameters; + _functionPointer = pointer; + _functionType = type; + _functionParameters = parameters; + + _maxConcurrencyLock.lock(); + _maxConcurrency = mvkGetAvaliableCPUCores(); + _maxConcurrencyLock.unlock(); } diff --git a/MoltenVK/MoltenVK/Vulkan/vulkan.mm b/MoltenVK/MoltenVK/Vulkan/vulkan.mm index 5fe0958f..39f8b02e 100644 --- a/MoltenVK/MoltenVK/Vulkan/vulkan.mm +++ b/MoltenVK/MoltenVK/Vulkan/vulkan.mm @@ -2715,13 +2715,6 @@ MVK_PUBLIC_VULKAN_SYMBOL void vkDestroyDeferredOperationKHR( MVKTraceVulkanCallEnd(); } -#pragma mark - -#pragma mark VK_KHR_dynamic_rendering extension - -MVK_PUBLIC_VULKAN_CORE_ALIAS(vkCmdBeginRendering, KHR); -MVK_PUBLIC_VULKAN_CORE_ALIAS(vkCmdEndRendering, KHR); - - #pragma mark - #pragma mark VK_KHR_descriptor_update_template extension @@ -2750,6 +2743,11 @@ MVK_PUBLIC_VULKAN_CORE_ALIAS(vkEnumeratePhysicalDeviceGroups, KHR); MVK_PUBLIC_VULKAN_CORE_ALIAS(vkCmdDrawIndexedIndirectCount, KHR); MVK_PUBLIC_VULKAN_CORE_ALIAS(vkCmdDrawIndirectCount, KHR); +#pragma mark - +#pragma mark VK_KHR_dynamic_rendering extension + +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkCmdBeginRendering, KHR); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkCmdEndRendering, KHR); #pragma mark - #pragma mark VK_KHR_external_fence_capabilities extension