summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2018-10-23 09:56:00 +0200
committerPaul Lemire <paul.lemire@kdab.com>2018-11-05 13:46:45 +0000
commit726be38f774ea62c1f05003cca39fa2a68d794b0 (patch)
tree957220ebfe93fa41ef2b175989bc986a679c76f6
parentfd9f66d17d79c4bebbd7b24d9bc52f9c87681ecb (diff)
downloadqt3d-726be38f774ea62c1f05003cca39fa2a68d794b0.tar.gz
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 <csandersen3@gmail.com> Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--src/render/renderers/opengl/renderer/renderer.cpp11
1 files 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;
}
}