Renderer: Add release queue to fix deletion while use

This commit is contained in:
Jérôme Leclercq
2021-05-14 02:04:47 +02:00
parent 51ecff2912
commit f280cff0a2
13 changed files with 163 additions and 15 deletions

View File

@@ -45,7 +45,7 @@ namespace Nz
if (!regenerateCommandBuffer)
continue;
passData.commandBuffer.reset(); //< Release command buffer resources before reallocating it
renderFrame.PushForRelease(std::move(passData.commandBuffer));
passData.commandBuffer = m_commandPool->BuildCommandBuffer([&](CommandBufferBuilder& builder)
{
for (auto& textureTransition : passData.transitions)

View File

@@ -35,6 +35,7 @@ namespace Nz
{
m_owner.Present();
m_uploadPool.Reset();
FlushReleaseQueue();
}
void OpenGLRenderImage::SubmitCommandBuffer(CommandBuffer* commandBuffer, QueueTypeFlags /*queueTypeFlags*/)

View File

@@ -33,7 +33,7 @@ namespace Nz
m_size = size;
}
return RenderFrame(&m_renderImage[m_currentFrame], invalidateFramebuffer);
return RenderFrame(m_renderImage[m_currentFrame].get(), invalidateFramebuffer);
}
bool OpenGLRenderWindow::Create(RendererImpl* renderer, RenderSurface* surface, const RenderWindowParameters& parameters)
@@ -55,7 +55,7 @@ namespace Nz
m_renderImage.reserve(RenderImageCount);
for (std::size_t i = 0; i < RenderImageCount; ++i)
m_renderImage.emplace_back(*this);
m_renderImage.emplace_back(std::make_unique<OpenGLRenderImage>(*this));
return true;
}

View File

@@ -7,5 +7,10 @@
namespace Nz
{
RenderImage::~RenderImage() = default;
RenderImage::~RenderImage()
{
FlushReleaseQueue();
}
RenderImage::Releasable::~Releasable() = default;
}

View File

@@ -57,7 +57,7 @@ namespace Nz
invalidateFramebuffer = true;
}
VulkanRenderImage& currentFrame = m_concurrentImageData[m_currentFrame];
VulkanRenderImage& currentFrame = *m_concurrentImageData[m_currentFrame];
Vk::Fence& inFlightFence = currentFrame.GetInFlightFence();
// Wait until previous rendering to this image has been done
@@ -564,7 +564,7 @@ namespace Nz
m_concurrentImageData.reserve(imageCount);
for (std::size_t i = 0; i < imageCount; ++i)
m_concurrentImageData.emplace_back(*this);
m_concurrentImageData.emplace_back(std::make_unique<VulkanRenderImage>(*this));
}
return true;