diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2018-10-23 09:56:00 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2018-11-05 13:46:45 +0000 |
commit | 726be38f774ea62c1f05003cca39fa2a68d794b0 (patch) | |
tree | 957220ebfe93fa41ef2b175989bc986a679c76f6 | |
parent | fd9f66d17d79c4bebbd7b24d9bc52f9c87681ecb (diff) | |
download | qt3d-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.cpp | 11 |
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; } } |