From f3b76763d98ac3db76610d5f2cdec5ca9a72918e Mon Sep 17 00:00:00 2001 From: Sylvain Doremus Date: Wed, 21 Jun 2023 18:41:10 +0200 Subject: [PATCH 1/2] Fixed render pass resetting. --- .../RunnablePasses/RenderPassHolder.hpp | 3 +++ source/RenderGraph/Attachment.cpp | 2 +- .../RunnablePasses/PipelineHolder.cpp | 7 +++++++ .../RunnablePasses/RenderPassHolder.cpp | 16 ++++++++++++++-- .../RunnablePasses/RenderQuadHolder.cpp | 9 ++++++++- 5 files changed, 33 insertions(+), 4 deletions(-) diff --git a/include/RenderGraph/RunnablePasses/RenderPassHolder.hpp b/include/RenderGraph/RunnablePasses/RenderPassHolder.hpp index 9044089..8e355f1 100644 --- a/include/RenderGraph/RunnablePasses/RenderPassHolder.hpp +++ b/include/RenderGraph/RunnablePasses/RenderPassHolder.hpp @@ -94,5 +94,8 @@ namespace crg VkPipelineColorBlendAttachmentStateArray m_blendAttachs; uint32_t m_layers{}; uint32_t m_index{}; + PipelineState m_srcState; + PipelineState m_dstState; + uint32_t m_count{ 1u }; }; } diff --git a/source/RenderGraph/Attachment.cpp b/source/RenderGraph/Attachment.cpp index 4856a2a..10c8bbc 100644 --- a/source/RenderGraph/Attachment.cpp +++ b/source/RenderGraph/Attachment.cpp @@ -458,7 +458,7 @@ namespace crg { result |= VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; } - else if ( !isTransitionView() ) + else { result |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; } diff --git a/source/RenderGraph/RunnablePasses/PipelineHolder.cpp b/source/RenderGraph/RunnablePasses/PipelineHolder.cpp index bf5a42b..e5aa4b0 100644 --- a/source/RenderGraph/RunnablePasses/PipelineHolder.cpp +++ b/source/RenderGraph/RunnablePasses/PipelineHolder.cpp @@ -197,6 +197,13 @@ namespace crg void PipelineHolder::resetPipeline( VkPipelineShaderStageCreateInfoArray config , uint32_t index ) { + assert( m_pipelines.size() == 1u || index < m_pipelines.size() ); + + if ( m_pipelines.size() == 1u ) + { + index = 0u; + } + if ( m_pipelines[index] ) { crgUnregisterObject( m_context, m_pipelines[index] ); diff --git a/source/RenderGraph/RunnablePasses/RenderPassHolder.cpp b/source/RenderGraph/RunnablePasses/RenderPassHolder.cpp index 1f26a07..6f9a038 100644 --- a/source/RenderGraph/RunnablePasses/RenderPassHolder.cpp +++ b/source/RenderGraph/RunnablePasses/RenderPassHolder.cpp @@ -92,6 +92,12 @@ namespace crg } ); return it == attaches.end(); } + + static bool operator==( PipelineState const & lhs, PipelineState const & rhs ) + { + return lhs.access == rhs.access + && lhs.pipelineStage == rhs.pipelineStage; + } } //********************************************************************************************* @@ -147,10 +153,14 @@ namespace crg , crg::RunnablePass const & runnable , uint32_t passIndex ) { + using rpHolder::operator==; + auto & renderPass = m_passes[passIndex].renderPass; if ( renderPass - && rpHolder::checkAttaches( context, m_passes[passIndex].attaches ) ) + && rpHolder::checkAttaches( context, m_passes[passIndex].attaches ) + && m_srcState == context.getPrevPipelineState() + && m_dstState == context.getNextPipelineState() ) { return false; } @@ -275,6 +285,8 @@ namespace crg , depthReference.layout ? &depthReference : nullptr , 0u , nullptr }; + m_srcState = previousState; + m_dstState = nextState; VkSubpassDependencyArray dependencies{ { VK_SUBPASS_EXTERNAL , 0u @@ -304,7 +316,7 @@ namespace crg , m_context.allocator , &data.renderPass ); checkVkResult( res, m_pass.getGroupName() + " - RenderPass creation" ); - crgRegisterObject( m_context, m_pass.getGroupName(), data.renderPass ); + crgRegisterObject( m_context, m_pass.getGroupName() + std::to_string( m_count++ ), data.renderPass ); } VkPipelineColorBlendStateCreateInfo RenderPassHolder::createBlendState() diff --git a/source/RenderGraph/RunnablePasses/RenderQuadHolder.cpp b/source/RenderGraph/RunnablePasses/RenderQuadHolder.cpp index 18e85d2..76dbfcc 100644 --- a/source/RenderGraph/RunnablePasses/RenderQuadHolder.cpp +++ b/source/RenderGraph/RunnablePasses/RenderQuadHolder.cpp @@ -78,7 +78,14 @@ namespace crg doPreparePipelineStates( renderSize, renderPass, std::move( blendState ) ); } - doCreatePipeline( index ); + if ( m_renderPass != renderPass ) + { + resetRenderPass( renderSize, renderPass, blendState, index ); + } + else + { + doCreatePipeline( index ); + } } void RenderQuadHolder::resetRenderPass( VkExtent2D const & renderSize From 4cb06295c66bfaf567763f1c7320b8234b2f0dfe Mon Sep 17 00:00:00 2001 From: Sylvain Doremus Date: Thu, 20 Jul 2023 17:57:42 +0200 Subject: [PATCH 2/2] Fixed a possible null pointer dereference --- source/RenderGraph/RunnablePasses/RenderQuadHolder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/RenderGraph/RunnablePasses/RenderQuadHolder.cpp b/source/RenderGraph/RunnablePasses/RenderQuadHolder.cpp index 76dbfcc..0d8700e 100644 --- a/source/RenderGraph/RunnablePasses/RenderQuadHolder.cpp +++ b/source/RenderGraph/RunnablePasses/RenderQuadHolder.cpp @@ -78,7 +78,7 @@ namespace crg doPreparePipelineStates( renderSize, renderPass, std::move( blendState ) ); } - if ( m_renderPass != renderPass ) + if ( m_renderPass && m_renderPass != renderPass ) { resetRenderPass( renderSize, renderPass, blendState, index ); }