From 2c31d436e62b83d970666fc93fbc5b6ed0dcd824 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Tue, 30 Apr 2019 17:47:11 +0300 Subject: [PATCH] - postponed destruction of Vulkan resources Provided uniform way to handle lifetime of some of Vulkan resources This helps to avoid issues like descriptor set that outlives its pool https://forum.zdoom.org/viewtopic.php?t=64341 --- .../vulkan/renderer/vk_renderpass.cpp | 9 +++++ .../vulkan/system/vk_framebuffer.cpp | 1 + src/rendering/vulkan/system/vk_framebuffer.h | 1 + .../vulkan/textures/vk_hwtexture.cpp | 34 ++++++++++--------- 4 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/rendering/vulkan/renderer/vk_renderpass.cpp b/src/rendering/vulkan/renderer/vk_renderpass.cpp index 0c6adbc614..7972cf0f50 100644 --- a/src/rendering/vulkan/renderer/vk_renderpass.cpp +++ b/src/rendering/vulkan/renderer/vk_renderpass.cpp @@ -33,6 +33,15 @@ void VkRenderPassManager::RenderBuffersReset() void VkRenderPassManager::TextureSetPoolReset() { + if (auto fb = GetVulkanFrameBuffer()) + { + auto &deleteList = fb->FrameDeleteList; + + for (auto &desc : TextureDescriptorPools) + { + deleteList.DescriptorPools.push_back(std::move(desc)); + } + } TextureDescriptorPools.clear(); TextureDescriptorSetsLeft = 0; TextureDescriptorsLeft = 0; diff --git a/src/rendering/vulkan/system/vk_framebuffer.cpp b/src/rendering/vulkan/system/vk_framebuffer.cpp index e24a6e654a..2c765bc463 100644 --- a/src/rendering/vulkan/system/vk_framebuffer.cpp +++ b/src/rendering/vulkan/system/vk_framebuffer.cpp @@ -188,6 +188,7 @@ void VulkanFrameBuffer::DeleteFrameObjects() FrameDeleteList.ImageViews.clear(); FrameDeleteList.Buffers.clear(); FrameDeleteList.Descriptors.clear(); + FrameDeleteList.DescriptorPools.clear(); FrameDeleteList.CommandBuffers.clear(); } diff --git a/src/rendering/vulkan/system/vk_framebuffer.h b/src/rendering/vulkan/system/vk_framebuffer.h index 0051abbaae..2a239c3d30 100644 --- a/src/rendering/vulkan/system/vk_framebuffer.h +++ b/src/rendering/vulkan/system/vk_framebuffer.h @@ -59,6 +59,7 @@ public: std::vector> ImageViews; std::vector> Buffers; std::vector> Descriptors; + std::vector> DescriptorPools; std::vector> CommandBuffers; } FrameDeleteList; diff --git a/src/rendering/vulkan/textures/vk_hwtexture.cpp b/src/rendering/vulkan/textures/vk_hwtexture.cpp index 13148eca12..8c0af229dc 100644 --- a/src/rendering/vulkan/textures/vk_hwtexture.cpp +++ b/src/rendering/vulkan/textures/vk_hwtexture.cpp @@ -53,32 +53,34 @@ VkHardwareTexture::~VkHardwareTexture() if (Prev) Prev->Next = Next; else First = Next; - auto fb = GetVulkanFrameBuffer(); - if (fb) + Reset(); +} + +void VkHardwareTexture::Reset() +{ + if (auto fb = GetVulkanFrameBuffer()) { + ResetDescriptors(); + auto &deleteList = fb->FrameDeleteList; - for (auto &it : mDescriptorSets) - { - deleteList.Descriptors.push_back(std::move(it.descriptor)); - it.descriptor = nullptr; - } - mDescriptorSets.clear(); if (mImage) deleteList.Images.push_back(std::move(mImage)); if (mImageView) deleteList.ImageViews.push_back(std::move(mImageView)); if (mStagingBuffer) deleteList.Buffers.push_back(std::move(mStagingBuffer)); } } -void VkHardwareTexture::Reset() -{ - mDescriptorSets.clear(); - mImage.reset(); - mImageView.reset(); - mStagingBuffer.reset(); -} - void VkHardwareTexture::ResetDescriptors() { + if (auto fb = GetVulkanFrameBuffer()) + { + auto &deleteList = fb->FrameDeleteList; + + for (auto &it : mDescriptorSets) + { + deleteList.Descriptors.push_back(std::move(it.descriptor)); + } + } + mDescriptorSets.clear(); }