From 8ad03bf0d5af5d199314bc8f98469e6e55ac26da Mon Sep 17 00:00:00 2001 From: Bill Hollings Date: Wed, 18 Dec 2019 16:44:35 -0500 Subject: [PATCH] Fix crash when app does not use queue family zero. Add MVKDevice::getAnyQueue() to safely find the first available queue. Update MoltenVK version to 1.0.40. --- Docs/Whats_New.md | 9 +++++++++ MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h | 2 +- MoltenVK/MoltenVK/GPUObjects/MVKDevice.h | 7 +++++-- MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm | 9 +++++++++ MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.mm | 2 +- MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm | 2 +- 6 files changed, 26 insertions(+), 5 deletions(-) diff --git a/Docs/Whats_New.md b/Docs/Whats_New.md index ff4f221a..e514f4e8 100644 --- a/Docs/Whats_New.md +++ b/Docs/Whats_New.md @@ -14,6 +14,15 @@ For best results, use a Markdown reader.* +MoltenVK 1.0.40 +--------------- + +Released TBD + +- Fix crash when app does not use queue family zero. + + + MoltenVK 1.0.39 --------------- diff --git a/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h b/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h index 45bdfa80..8f77144a 100644 --- a/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h +++ b/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h @@ -50,7 +50,7 @@ typedef unsigned long MTLLanguageVersion; */ #define MVK_VERSION_MAJOR 1 #define MVK_VERSION_MINOR 0 -#define MVK_VERSION_PATCH 39 +#define MVK_VERSION_PATCH 40 #define MVK_MAKE_VERSION(major, minor, patch) (((major) * 10000) + ((minor) * 100) + (patch)) #define MVK_VERSION MVK_MAKE_VERSION(MVK_VERSION_MAJOR, MVK_VERSION_MINOR, MVK_VERSION_PATCH) diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h index 845368b5..6e21d044 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h @@ -402,8 +402,11 @@ public: /** Returns the function pointer corresponding to the specified named entry point. */ PFN_vkVoidFunction getProcAddr(const char* pName); - /** Retrieves a queue at the specified index within the specified family. */ - MVKQueue* getQueue(uint32_t queueFamilyIndex = 0, uint32_t queueIndex = 0); + /** Returns the queue at the specified index within the specified family. */ + MVKQueue* getQueue(uint32_t queueFamilyIndex, uint32_t queueIndex); + + /** Retrieves the queue at the lowest queue and queue family indices used by the app. */ + MVKQueue* getAnyQueue(); /** Block the current thread until all queues in this device are idle. */ VkResult waitIdle(); diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm index 58a2e259..169ab106 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm @@ -2030,6 +2030,15 @@ MVKQueue* MVKDevice::getQueue(uint32_t queueFamilyIndex, uint32_t queueIndex) { return _queuesByQueueFamilyIndex[queueFamilyIndex][queueIndex]; } +MVKQueue* MVKDevice::getAnyQueue() { + for (auto& queues : _queuesByQueueFamilyIndex) { + for (MVKQueue* q : queues) { + if (q) { return q; }; + } + } + return nullptr; +} + VkResult MVKDevice::waitIdle() { for (auto& queues : _queuesByQueueFamilyIndex) { for (MVKQueue* q : queues) { diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.mm index 9aa3e65d..692fb272 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDeviceMemory.mm @@ -110,7 +110,7 @@ VkResult MVKDeviceMemory::pullFromDevice(VkDeviceSize offset, #if MVK_MACOS if (pBlitEnc && _mtlBuffer && _mtlStorageMode == MTLStorageModeManaged) { - if ( !pBlitEnc->mtlCmdBuffer) { pBlitEnc->mtlCmdBuffer = [_device->getQueue()->getMTLCommandQueue() commandBufferWithUnretainedReferences]; } + if ( !pBlitEnc->mtlCmdBuffer) { pBlitEnc->mtlCmdBuffer = [_device->getAnyQueue()->getMTLCommandQueue() commandBufferWithUnretainedReferences]; } if ( !pBlitEnc->mtlBlitEncoder) { pBlitEnc->mtlBlitEncoder = [pBlitEnc->mtlCmdBuffer blitCommandEncoder]; } [pBlitEnc->mtlBlitEncoder synchronizeResource: _mtlBuffer]; } diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm b/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm index 0c396e3f..3d146fdf 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm @@ -172,7 +172,7 @@ void MVKSwapchain::signalWhenAvailable(uint32_t imageIndex, MVKSemaphore* semaph @autoreleasepool { MVKSemaphore* mvkSem = signaler.first; id mtlCmdBuff = (mvkSem && mvkSem->isUsingCommandEncoding() - ? [_device->getQueue()->getMTLCommandQueue() commandBufferWithUnretainedReferences] + ? [_device->getAnyQueue()->getMTLCommandQueue() commandBufferWithUnretainedReferences] : nil); signal(signaler, mtlCmdBuff); [mtlCmdBuff commit];