diff --git a/Docs/Whats_New.md b/Docs/Whats_New.md index ccb915218..11799dcad 100644 --- a/Docs/Whats_New.md +++ b/Docs/Whats_New.md @@ -27,6 +27,7 @@ Released TBD end of a descriptor binding count, including inline uniform block descriptors. - Update `VkFormat` capabilities based on latest Metal docs. - Fix rendering issue with render pass that immediately follows a kernel dispatch. +- Fix race condition when `VkImage` destroyed while used by descriptor. - Ensure all MoltenVK config info set by `VK_EXT_layer_settings` is used. - Move primitive-restart-disabled warning from renderpass to pipeline creation, to reduce voluminous log noise. - iOS: Support storage images in _Metal_ argument buffers. diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm b/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm index de928666a..1ae9f9fbf 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm @@ -2194,6 +2194,8 @@ static void signalAndUntrack(const MVKSwapchainSignaler& signaler) { MVKImageView::MVKImageView(MVKDevice* device, const VkImageViewCreateInfo* pCreateInfo) : MVKVulkanAPIDeviceObject(device) { _image = (MVKImage*)pCreateInfo->image; + _image->retain(); // Ensure image sticks around while this image view is in flight. + _mtlTextureType = mvkMTLTextureTypeFromVkImageViewType(pCreateInfo->viewType, _image->getSampleCount() != VK_SAMPLE_COUNT_1_BIT); @@ -2306,6 +2308,7 @@ static void signalAndUntrack(const MVKSwapchainSignaler& signaler) { // Memory detached in destructor too, as a fail-safe. MVKImageView::~MVKImageView() { detachMemory(); + _image->release(); } // Overridden to detach from the resource memory when the app destroys this object.