diff options
author | Gunnar Sletta <[email protected]> | 2014-09-17 10:08:09 +0200 |
---|---|---|
committer | Gunnar Sletta <[email protected]> | 2014-09-17 14:10:15 +0200 |
commit | 428b676d84c5576cbbaf549381f47b73e2c9b6aa (patch) | |
tree | 5e781b03bf8d9f7655f3ec7bd409507426ec8cf9 /src/quick/scenegraph/qsgthreadedrenderloop.cpp | |
parent | 401c4e2e5eb97c221bc7d8ca36cf45aea0f8255a (diff) |
Sync QQuickWindow::update() up with polishAndSync().
When calling QQuickWindow::update() on the GUI thread, we would
immediately flag the render thread that a repaint was needed and then
schedule a polishAndSync. If the render thread completed the current
frame before the GUI thread got to polishAndSync, it would repaint
right away without syncing with GUI first.
Instead of sending the repaint right away, register the need for a
full repaint in the window and set it as part of the next sync phase.
Change-Id: Ia731fb46724cc79f5391422213b069de9362d002
Reviewed-by: Giulio Camuffo <[email protected]>
Reviewed-by: Laszlo Agocs <[email protected]>
Diffstat (limited to 'src/quick/scenegraph/qsgthreadedrenderloop.cpp')
-rw-r--r-- | src/quick/scenegraph/qsgthreadedrenderloop.cpp | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/src/quick/scenegraph/qsgthreadedrenderloop.cpp b/src/quick/scenegraph/qsgthreadedrenderloop.cpp index 3866ed9a2b..7cce4593ab 100644 --- a/src/quick/scenegraph/qsgthreadedrenderloop.cpp +++ b/src/quick/scenegraph/qsgthreadedrenderloop.cpp @@ -189,9 +189,15 @@ public: class WMSyncEvent : public WMWindowEvent { public: - WMSyncEvent(QQuickWindow *c, bool inExpose) : WMWindowEvent(c, WM_RequestSync), size(c->size()), syncInExpose(inExpose) { } + WMSyncEvent(QQuickWindow *c, bool inExpose, bool force) + : WMWindowEvent(c, WM_RequestSync) + , size(c->size()) + , syncInExpose(inExpose) + , forceRenderPass(force) + {} QSize size; bool syncInExpose; + bool forceRenderPass; }; @@ -368,6 +374,10 @@ bool QSGRenderThread::event(QEvent *e) qCDebug(QSG_LOG_RENDERLOOP) << QSG_RT_PAD << "- triggered from expose"; pendingUpdate |= ExposeRequest; } + if (se->forceRenderPass) { + qCDebug(QSG_LOG_RENDERLOOP) << QSG_RT_PAD << "- repaint regardless"; + pendingUpdate |= RepaintRequest; + } return true; } case WM_TryRelease: { @@ -855,6 +865,7 @@ void QSGThreadedRenderLoop::handleExposure(QQuickWindow *window) win.thread = new QSGRenderThread(this, QQuickWindowPrivate::get(window)->context); win.timerId = 0; win.updateDuringSync = false; + win.forceRenderPass = true; // also covered by polishAndSync(inExpose=true), but doesn't hurt m_windows << win; w = &m_windows.last(); } @@ -998,7 +1009,9 @@ void QSGThreadedRenderLoop::update(QQuickWindow *window) } qCDebug(QSG_LOG_RENDERLOOP) << "update on window" << w->window; - w->thread->postEvent(new QEvent(WM_RequestRepaint)); + // We set forceRenderPass because we want to make sure the QQuickWindow + // actually does a full render pass after the next sync. + w->forceRenderPass = true; maybeUpdate(w); } @@ -1106,7 +1119,8 @@ void QSGThreadedRenderLoop::polishAndSync(Window *w, bool inExpose) qCDebug(QSG_LOG_RENDERLOOP) << "- lock for sync"; w->thread->mutex.lock(); m_lockedForSync = true; - w->thread->postEvent(new WMSyncEvent(window, inExpose)); + w->thread->postEvent(new WMSyncEvent(window, inExpose, w->forceRenderPass)); + w->forceRenderPass = false; qCDebug(QSG_LOG_RENDERLOOP) << "- wait for sync"; if (profileFrames) |