From 726be38f774ea62c1f05003cca39fa2a68d794b0 Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Tue, 23 Oct 2018 09:56:00 +0200 Subject: [PATCH] Renderer::doRender scene3dBlocking fixes -Reorder sleep and locks -Properly protect isFrameQueueComplete lookup -Reread queueIsEmpty which could have been updated Change-Id: I2b5a52284bbb3ddb48483c5bf73779e335c8bdda Task-number: QTBUG-71294 Reviewed-by: Christian Andersen Reviewed-by: Sean Harmer --- src/render/renderers/opengl/renderer/renderer.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/render/renderers/opengl/renderer/renderer.cpp b/src/render/renderers/opengl/renderer/renderer.cpp index 8039b6412..7aa39aa40 100644 --- a/src/render/renderers/opengl/renderer/renderer.cpp +++ b/src/render/renderers/opengl/renderer/renderer.cpp @@ -629,18 +629,21 @@ void Renderer::doRender(bool scene3dBlocking) // Lock the mutex to protect access to the renderQueue while we look for its state QMutexLocker locker(m_renderQueue->mutex()); bool queueIsComplete = m_renderQueue->isFrameQueueComplete(); - const bool queueIsEmpty = m_renderQueue->targetRenderViewCount() == 0; + bool queueIsEmpty = m_renderQueue->targetRenderViewCount() == 0; // Scene3D Blocking Mode if (scene3dBlocking && !queueIsComplete && !queueIsEmpty) { int i = 0; // We wait at most 10ms to avoid a case we could never recover from - while (!queueIsComplete && i++ < 10) { - QThread::msleep(1); + while (!queueIsComplete && !queueIsEmpty && i++ < 10) { qCDebug(Backend) << Q_FUNC_INFO << "Waiting for ready queue (try:" << i << "/ 10)"; locker.unlock(); - queueIsComplete = m_renderQueue->isFrameQueueComplete(); + // Give worker threads a chance to complete the queue + QThread::msleep(1); locker.relock(); + queueIsComplete = m_renderQueue->isFrameQueueComplete(); + // This could become true if we've tried to shutdown + queueIsEmpty = m_renderQueue->targetRenderViewCount() == 0; } }