From 2c334acc7998f4cdbe52d47e1aab3aedd83313bb Mon Sep 17 00:00:00 2001 From: Bill Hollings Date: Sun, 29 Sep 2024 21:24:38 -0400 Subject: [PATCH] Fix crash when VkDescriptorSetLayout is destroyed while descriptor set is in use. Vulkan permits VkDescriptorSetLayout to be destroyed while descriptor set is in use, as long as vkUpdateDescriptorSets() is not called. - MVKDescriptorSet retain() layout on allocation, and release() it on free. --- MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h | 2 ++ MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h index 00ed01307..b197b1cc6 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h @@ -204,6 +204,8 @@ class MVKDescriptorSet : public MVKVulkanAPIDeviceObject { MVKDescriptorSet(MVKDescriptorPool* pool); + ~MVKDescriptorSet() override; + protected: friend class MVKDescriptorSetLayoutBinding; friend class MVKDescriptorPool; diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm index 8474559af..54ba414a6 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm @@ -538,6 +538,7 @@ static void populateAuxBuffer(mvk::SPIRVToMSLConversionConfiguration& shaderConf NSUInteger mtlArgBufferOffset, id mtlArgEnc) { _layout = layout; + _layout->retain(); _variableDescriptorCount = variableDescriptorCount; _argumentBuffer.setArgumentBuffer(_pool->_metalArgumentBuffer, mtlArgBufferOffset, mtlArgEnc); @@ -574,6 +575,7 @@ static void populateAuxBuffer(mvk::SPIRVToMSLConversionConfiguration& shaderConf } void MVKDescriptorSet::free(bool isPoolReset) { + if(_layout) { _layout->release(); } _layout = nullptr; _dynamicOffsetDescriptorCount = 0; _variableDescriptorCount = 0; @@ -613,6 +615,10 @@ static void populateAuxBuffer(mvk::SPIRVToMSLConversionConfiguration& shaderConf free(true); } +MVKDescriptorSet::~MVKDescriptorSet() { + if(_layout) { _layout->release(); } +} + #pragma mark - #pragma mark MVKDescriptorTypePool