summaryrefslogtreecommitdiffstats
path: root/src/render/renderers/opengl/renderer/renderer.cpp
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2019-08-06 12:20:34 +0200
committerPaul Lemire <paul.lemire@kdab.com>2019-08-07 12:53:51 +0200
commit2e6f30c807421dfec7821ca9cd61d6ac39e03e0c (patch)
treefb872e8369be391672ef87ca4afabea6fb953aa8 /src/render/renderers/opengl/renderer/renderer.cpp
parent6631bf0983250e1a86cb9d27628c44b6e607609b (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.cpp15
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);
}