diff --git a/include/Nazara/Graphics/ForwardFramePipeline.hpp b/include/Nazara/Graphics/ForwardFramePipeline.hpp index f5baa96a3..bc16a4390 100644 --- a/include/Nazara/Graphics/ForwardFramePipeline.hpp +++ b/include/Nazara/Graphics/ForwardFramePipeline.hpp @@ -87,6 +87,7 @@ namespace Nz RenderQueue depthPrepassRenderQueue; RenderQueue forwardRenderQueue; ShaderBindingPtr blitShaderBinding; + bool prepare = true; bool rebuildDepthPrepass = true; bool rebuildForwardPass = true; }; diff --git a/include/Nazara/Graphics/MaterialPass.hpp b/include/Nazara/Graphics/MaterialPass.hpp index 2fd2104b4..6070b434a 100644 --- a/include/Nazara/Graphics/MaterialPass.hpp +++ b/include/Nazara/Graphics/MaterialPass.hpp @@ -110,6 +110,7 @@ namespace Nz NazaraSignal(OnMaterialRelease, const MaterialPass* /*material*/); private: + inline void InvalidateCommandBuffer(); inline void InvalidatePipeline(); inline void InvalidateTextureSampler(std::size_t textureIndex); inline void InvalidateUniformData(std::size_t uniformBufferIndex); diff --git a/include/Nazara/Graphics/MaterialPass.inl b/include/Nazara/Graphics/MaterialPass.inl index 6b7539a89..70b67acd4 100644 --- a/include/Nazara/Graphics/MaterialPass.inl +++ b/include/Nazara/Graphics/MaterialPass.inl @@ -608,7 +608,8 @@ namespace Nz if (m_textures[textureIndex].texture != texture) { m_textures[textureIndex].texture = std::move(texture); - OnMaterialInvalidated(this); + + InvalidateCommandBuffer(); } } @@ -618,6 +619,7 @@ namespace Nz if (m_textures[textureIndex].samplerInfo != samplerInfo) { m_textures[textureIndex].samplerInfo = std::move(samplerInfo); + InvalidateTextureSampler(textureIndex); } } @@ -630,10 +632,16 @@ namespace Nz m_uniformBuffers[bufferIndex].buffer = std::move(uniformBuffer); m_uniformBuffers[bufferIndex].dataInvalidated = true; - OnMaterialInvalidated(this); + InvalidateCommandBuffer(); } } + inline void MaterialPass::InvalidateCommandBuffer() + { + m_forceCommandBufferRegeneration = true; + OnMaterialInvalidated(this); + } + inline void MaterialPass::InvalidatePipeline() { m_forceCommandBufferRegeneration = true; @@ -647,7 +655,7 @@ namespace Nz assert(textureIndex < m_textures.size()); m_textures[textureIndex].sampler.reset(); - OnMaterialInvalidated(this); + InvalidateCommandBuffer(); } inline void MaterialPass::InvalidateUniformData(std::size_t uniformBufferIndex) diff --git a/src/Nazara/Graphics/ForwardFramePipeline.cpp b/src/Nazara/Graphics/ForwardFramePipeline.cpp index 045fd6e56..59234a153 100644 --- a/src/Nazara/Graphics/ForwardFramePipeline.cpp +++ b/src/Nazara/Graphics/ForwardFramePipeline.cpp @@ -155,6 +155,7 @@ namespace Nz { viewerData.rebuildDepthPrepass = true; viewerData.rebuildForwardPass = true; + viewerData.prepare = true; } } } @@ -171,7 +172,6 @@ namespace Nz }; // Render queues handling - bool prepare = false; for (auto&& [viewer, data] : m_viewers) { auto& viewerData = data; @@ -213,7 +213,7 @@ namespace Nz { viewerData.rebuildDepthPrepass = true; viewerData.rebuildForwardPass = true; - prepare = true; + viewerData.prepare = true; viewerData.visibilityHash = visibilityHash; } @@ -262,48 +262,42 @@ namespace Nz }); } - if (prepare) + for (auto&& [viewer, viewerData] : m_viewers) { + if (!viewerData.prepare) + continue; + for (std::size_t i = 0; i < m_elementRenderers.size(); ++i) { auto& elementRendererPtr = m_elementRenderers[i]; - for (auto&& [_, viewerData] : m_viewers) + if (i >= viewerData.elementRendererData.size() || !viewerData.elementRendererData[i]) { - if (i >= viewerData.elementRendererData.size() || !viewerData.elementRendererData[i]) - { - if (i >= viewerData.elementRendererData.size()) - viewerData.elementRendererData.resize(i + 1); + if (i >= viewerData.elementRendererData.size()) + viewerData.elementRendererData.resize(i + 1); - viewerData.elementRendererData[i] = elementRendererPtr->InstanciateData(); - } - - if (elementRendererPtr) - elementRendererPtr->Reset(*viewerData.elementRendererData[i], renderFrame); + viewerData.elementRendererData[i] = elementRendererPtr->InstanciateData(); } + + if (elementRendererPtr) + elementRendererPtr->Reset(*viewerData.elementRendererData[i], renderFrame); } - for (auto&& [viewer, viewerData] : m_viewers) + auto& rendererData = viewerData.elementRendererData; + + const auto& viewerInstance = viewer->GetViewerInstance(); + + ProcessRenderQueue(viewerData.depthPrepassRenderQueue, [&](std::size_t elementType, const Pointer* elements, std::size_t elementCount) { - auto& rendererData = viewerData.elementRendererData; + ElementRenderer& elementRenderer = *m_elementRenderers[elementType]; + elementRenderer.Prepare(viewerInstance, *rendererData[elementType], renderFrame, elements, elementCount); + }); - const auto& viewerInstance = viewer->GetViewerInstance(); - - ProcessRenderQueue(viewerData.depthPrepassRenderQueue, [&](std::size_t elementType, const Pointer* elements, std::size_t elementCount) - { - ElementRenderer& elementRenderer = *m_elementRenderers[elementType]; - elementRenderer.Prepare(viewerInstance, *rendererData[elementType], renderFrame, elements, elementCount); - }); - - ProcessRenderQueue(viewerData.forwardRenderQueue, [&](std::size_t elementType, const Pointer* elements, std::size_t elementCount) - { - ElementRenderer& elementRenderer = *m_elementRenderers[elementType]; - elementRenderer.Prepare(viewerInstance, *rendererData[elementType], renderFrame, elements, elementCount); - }); - - viewerData.rebuildForwardPass = true; - viewerData.rebuildDepthPrepass = true; - } + ProcessRenderQueue(viewerData.forwardRenderQueue, [&](std::size_t elementType, const Pointer* elements, std::size_t elementCount) + { + ElementRenderer& elementRenderer = *m_elementRenderers[elementType]; + elementRenderer.Prepare(viewerInstance, *rendererData[elementType], renderFrame, elements, elementCount); + }); } if (m_bakedFrameGraph.Resize(renderFrame)) @@ -335,6 +329,7 @@ namespace Nz { viewerData.rebuildForwardPass = false; viewerData.rebuildDepthPrepass = false; + viewerData.prepare = false; const RenderTarget& renderTarget = viewer->GetRenderTarget(); Recti renderRegion(0, 0, frameSize.x, frameSize.y);