diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2019-08-06 12:20:34 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2019-08-07 12:53:51 +0200 |
commit | 2e6f30c807421dfec7821ca9cd61d6ac39e03e0c (patch) | |
tree | fb872e8369be391672ef87ca4afabea6fb953aa8 /src/render/renderers/opengl/renderer/renderer.cpp | |
parent | 6631bf0983250e1a86cb9d27628c44b6e607609b (diff) |
Renderer renderSynchronous: allow skipping swap buffer step
Needed for cases where Scene3D is used as an Underlay
Change-Id: I13889efc146d278a6331000f886b8fcb33448f65
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src/render/renderers/opengl/renderer/renderer.cpp')
-rw-r--r-- | src/render/renderers/opengl/renderer/renderer.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/render/renderers/opengl/renderer/renderer.cpp b/src/render/renderers/opengl/renderer/renderer.cpp index 88dd77f39..83f17e54f 100644 --- a/src/render/renderers/opengl/renderer/renderer.cpp +++ b/src/render/renderers/opengl/renderer/renderer.cpp @@ -203,6 +203,7 @@ Renderer::Renderer(QRenderAspect::RenderType type) , m_syncLoadingJobs(Render::GenericLambdaJobPtr<std::function<void ()>>::create([] {}, JobTypes::SyncLoadingJobs)) , m_ownedContext(false) , m_offscreenHelper(nullptr) + , m_shouldSwapBuffers(true) #if QT_CONFIG(qt3d_profile_jobs) , m_commandExecuter(new Qt3DRender::Debug::CommandExecuter(this)) #endif @@ -627,7 +628,9 @@ void Renderer::render() } } -void Renderer::doRender() +// Either called by render if Qt3D is in charge of the RenderThread +// or by QRenderAspectPrivate::renderSynchronous (for Scene3D) +void Renderer::doRender(bool swapBuffers) { Renderer::ViewSubmissionResultData submissionData; bool hasCleanedQueueAndProceeded = false; @@ -636,6 +639,7 @@ void Renderer::doRender() // Blocking until RenderQueue is full const bool canSubmit = isReadyToSubmit(); + m_shouldSwapBuffers = swapBuffers; // Lock the mutex to protect access to the renderQueue while we look for its state QMutexLocker locker(m_renderQueue->mutex()); @@ -765,7 +769,10 @@ void Renderer::doRender() if (beganDrawing) { SurfaceLocker surfaceLock(submissionData.surface); // Finish up with last surface used in the list of RenderViews - m_submissionContext->endDrawing(submissionData.lastBoundFBOId == m_submissionContext->defaultFBO() && surfaceLock.isSurfaceValid()); + const bool swapBuffers = submissionData.lastBoundFBOId == m_submissionContext->defaultFBO() + && surfaceLock.isSurfaceValid() + && m_shouldSwapBuffers; + m_submissionContext->endDrawing(swapBuffers); } } @@ -1460,7 +1467,9 @@ Renderer::ViewSubmissionResultData Renderer::submitRenderViews(const QVector<Ren const bool surfaceHasChanged = surface != previousSurface; if (surfaceHasChanged && previousSurface) { - const bool swapBuffers = (lastBoundFBOId == m_submissionContext->defaultFBO()) && PlatformSurfaceFilter::isSurfaceValid(previousSurface); + const bool swapBuffers = lastBoundFBOId == m_submissionContext->defaultFBO() + && surfaceLock.isSurfaceValid() + && m_shouldSwapBuffers; // We only call swap buffer if we are sure the previous surface is still valid m_submissionContext->endDrawing(swapBuffers); } |