diff --git a/src/KDGpu/vulkan/vulkan_resource_manager.cpp b/src/KDGpu/vulkan/vulkan_resource_manager.cpp index 535d7ea0..19d8ea41 100644 --- a/src/KDGpu/vulkan/vulkan_resource_manager.cpp +++ b/src/KDGpu/vulkan/vulkan_resource_manager.cpp @@ -1037,6 +1037,20 @@ void VulkanResourceManager::deleteTextureView(const Handle &handl { VulkanTextureView *vulkanTextureView = m_textureViews.get(handle); VulkanDevice *vulkanDevice = m_devices.get(vulkanTextureView->deviceHandle); + + for(const auto &vulkanFramebufferKey : vulkanTextureView->associatedFrameBuffers) { + auto itFramebuffer = vulkanDevice->framebuffers.find(vulkanFramebufferKey); + if (itFramebuffer == vulkanDevice->framebuffers.end()) { + // This framebuffer has already been destroyed, just ignore + continue; + } + + auto *framebuffer = m_framebuffers.get(itFramebuffer->second); + vkDestroyFramebuffer(vulkanDevice->device, framebuffer->framebuffer, nullptr); + vulkanDevice->framebuffers.erase(itFramebuffer); + m_framebuffers.remove(itFramebuffer->second); + } + vkDestroyImageView(vulkanDevice->device, vulkanTextureView->imageView, nullptr); m_textureViews.remove(handle); @@ -2918,6 +2932,9 @@ Handle VulkanResourceManager::createFramebuffer(const HandleassociatedFrameBuffers.push_back(frameBufferKey); + const auto vulkanFramebufferHandle = m_framebuffers.emplace(VulkanFramebuffer(vkFramebuffer)); return vulkanFramebufferHandle; } diff --git a/src/KDGpu/vulkan/vulkan_texture_view.h b/src/KDGpu/vulkan/vulkan_texture_view.h index e6a6943d..d4249f34 100644 --- a/src/KDGpu/vulkan/vulkan_texture_view.h +++ b/src/KDGpu/vulkan/vulkan_texture_view.h @@ -15,6 +15,8 @@ #include +#include "vulkan_framebuffer.h" + namespace KDGpu { struct Texture_t; @@ -33,6 +35,7 @@ struct KDGPU_EXPORT VulkanTextureView { VkImageView imageView{ VK_NULL_HANDLE }; Handle textureHandle; Handle deviceHandle; + std::vector associatedFrameBuffers; }; } // namespace KDGpu