Renderer: Add release queue to fix deletion while use
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -35,6 +35,7 @@ namespace Nz
|
||||
{
|
||||
m_owner.Present();
|
||||
m_uploadPool.Reset();
|
||||
FlushReleaseQueue();
|
||||
}
|
||||
|
||||
void OpenGLRenderImage::SubmitCommandBuffer(CommandBuffer* commandBuffer, QueueTypeFlags /*queueTypeFlags*/)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -7,5 +7,10 @@
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
RenderImage::~RenderImage() = default;
|
||||
RenderImage::~RenderImage()
|
||||
{
|
||||
FlushReleaseQueue();
|
||||
}
|
||||
|
||||
RenderImage::Releasable::~Releasable() = default;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user