From 35515c79020743a6e9fd328fddf3478ebf843a96 Mon Sep 17 00:00:00 2001 From: Georg Hagen Date: Wed, 21 Aug 2024 15:45:46 +0200 Subject: [PATCH] Prevent crash when trying to release buffer from already destroyed memory pool --- openVulkanoCpp/Vulkan/Metal/MetalBackedTexture.mm | 2 -- openVulkanoCpp/Vulkan/Resources/ManagedBuffer.hpp | 2 +- openVulkanoCpp/Vulkan/Resources/MemoryPool.cpp | 2 ++ openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp | 1 + openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp | 3 +++ 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/openVulkanoCpp/Vulkan/Metal/MetalBackedTexture.mm b/openVulkanoCpp/Vulkan/Metal/MetalBackedTexture.mm index 10f23d3..db65281 100644 --- a/openVulkanoCpp/Vulkan/Metal/MetalBackedTexture.mm +++ b/openVulkanoCpp/Vulkan/Metal/MetalBackedTexture.mm @@ -56,8 +56,6 @@ namespace OpenVulkano::Vulkan m_vulkanTexture.m_sampler = resManager->CreateSampler(reinterpret_cast(Scene::SamplerConfig::DEFAULT)); m_vulkanTexture.SetDescriptorSet(resManager, resManager->GetDescriptorLayoutSet(binding), binding); - //m_vulkanTexture.UpdateAddress(this); - //UpdateRenderResource(GetOwnerResource()); GetRenderResource().renderObject = &m_vulkanTexture; m_vulkanTexture.UpdateAddress(this); diff --git a/openVulkanoCpp/Vulkan/Resources/ManagedBuffer.hpp b/openVulkanoCpp/Vulkan/Resources/ManagedBuffer.hpp index 7689741..4dedc18 100644 --- a/openVulkanoCpp/Vulkan/Resources/ManagedBuffer.hpp +++ b/openVulkanoCpp/Vulkan/Resources/ManagedBuffer.hpp @@ -33,7 +33,7 @@ namespace OpenVulkano::Vulkan ~ManagedBuffer() { - allocation->device.destroy(buffer); + if (allocation) [[likely]] allocation->device.destroy(buffer); } [[nodiscard]] bool IsLast() const diff --git a/openVulkanoCpp/Vulkan/Resources/MemoryPool.cpp b/openVulkanoCpp/Vulkan/Resources/MemoryPool.cpp index 4292dc3..2b9ac70 100644 --- a/openVulkanoCpp/Vulkan/Resources/MemoryPool.cpp +++ b/openVulkanoCpp/Vulkan/Resources/MemoryPool.cpp @@ -23,6 +23,8 @@ namespace OpenVulkano::Vulkan { if (memPool->FreeBuffer(buffer)) return; } + Logger::RENDER->error("Attempted to released buffer to pool, but owning pool no longer exists!"); + buffer->allocation = nullptr; // Allocation is no longer valid since owning pool is gone already delete buffer; } diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp index ff946c0..435542a 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp @@ -98,6 +98,7 @@ namespace OpenVulkano::Vulkan { transferQueue.waitIdle(); transferQueue = nullptr; + OnShutdown(this); // Notify all custom resources that it's time to die geometries.clear(); nodes.clear(); textures.clear(); diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp index b347f73..9274a32 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp @@ -14,6 +14,7 @@ #include "IShaderOwner.hpp" #include "MemoryPool.hpp" #include "Base/Wrapper.hpp" +#include "Base/Event.hpp" #include "Base/Render/IResourceManager.hpp" #include "Vulkan/Image.hpp" #include "Scene/Shader/DescriptorInputDescription.hpp" @@ -134,6 +135,8 @@ namespace OpenVulkano vk::DescriptorSetLayout* GetDescriptorLayoutSet(const DescriptorSetLayoutBinding& descriptorSetLayoutBinding); VulkanShader* CreateShader(Scene::Shader* shader); + + Event OnShutdown; }; } }