From 18d8da09450bed533166076e36bc3e3f83e5e7a3 Mon Sep 17 00:00:00 2001 From: Steffen Ohrendorf Date: Sat, 9 Oct 2021 12:17:43 +0200 Subject: [PATCH] use less blocking sync --- src/engine/presenter.cpp | 16 +++++++++++----- src/render/scene/csm.h | 17 +++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/engine/presenter.cpp b/src/engine/presenter.cpp index e86983a56..69781f5c9 100644 --- a/src/engine/presenter.cpp +++ b/src/engine/presenter.cpp @@ -123,8 +123,6 @@ void Presenter::renderWorld(const ObjectManager& objectManager, for(const auto& texture : m_csm->getDepthTextures()) texture->clear(gl::ScalarDepth{1.0f}); - gl::FenceSync::block(); - for(size_t i = 0; i < render::scene::CSMBuffer::NSplits; ++i) { SOGLB_DEBUGGROUP("csm-pass/" + std::to_string(i)); @@ -147,24 +145,32 @@ void Presenter::renderWorld(const ObjectManager& objectManager, visitor.visit(*child); } } + m_csm->beginActiveSync(); } - gl::FenceSync::block(); for(size_t i = 0; i < render::scene::CSMBuffer::NSplits; ++i) { SOGLB_DEBUGGROUP("csm-pass-square/" + std::to_string(i)); m_csm->setActiveSplit(i); + m_csm->waitActiveSync(); m_csm->renderSquare(); + m_csm->beginActiveSync(); } - gl::FenceSync::block(); for(size_t i = 0; i < render::scene::CSMBuffer::NSplits; ++i) { SOGLB_DEBUGGROUP("csm-pass-blur/" + std::to_string(i)); m_csm->setActiveSplit(i); + m_csm->waitActiveSync(); m_csm->renderBlur(); + m_csm->beginActiveSync(); + } + + for(size_t i = 0; i < render::scene::CSMBuffer::NSplits; ++i) + { + m_csm->setActiveSplit(i); + m_csm->waitActiveSync(); } - gl::FenceSync::block(); } { diff --git a/src/render/scene/csm.h b/src/render/scene/csm.h index f96f5e555..df39b2a67 100644 --- a/src/render/scene/csm.h +++ b/src/render/scene/csm.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -49,6 +50,7 @@ class CSM final std::shared_ptr squareMaterial{}; std::shared_ptr squareMesh{}; std::shared_ptr> squareBlur; + mutable std::unique_ptr sync; void init(int32_t resolution, size_t idx, MaterialManager& materialManager); void renderSquare(); @@ -74,6 +76,21 @@ class CSM final return m_splits.at(m_activeSplit).depthFramebuffer; } + void beginActiveSync() const + { + m_splits.at(m_activeSplit).sync = std::make_unique(); + } + + void waitActiveSync() const + { + auto& sync = m_splits.at(m_activeSplit).sync; + if(sync == nullptr) + return; + + sync->wait(); + sync.reset(); + } + void setActiveSplit(size_t idx) { Expects(idx < m_splits.size());