diff options
author | Kirill Burtsev <kirill.burtsev@qt.io> | 2020-09-17 14:46:12 +0000 |
---|---|---|
committer | Kirill Burtsev <kirill.burtsev@qt.io> | 2020-09-18 18:22:37 +0200 |
commit | cf47a78cff65e7616b8458c1519ac90113a6586c (patch) | |
tree | 6eb072d568cd600d1d310687235b4783d7516d33 /src/core | |
parent | d701dcbf4d15e16e05b169828dd4e031e99c2625 (diff) |
FIXUP: Fix swap condition in DisplayGLOutputSurface::updatePaintNode
Amends commit 99a668c324. Task 'swapBuffersOnVizThread' is supposed to
be scheduled only when m_middleBuffer is ready after swap on gpu thread.
Checking for m_taskRunner is not enough to verify this. Call to
updatePaintNode may come from SG backend on expose event, thus breaking
expected sequence of buffers swaps.
Task-number: QTBUG-85817
Fixes: QTBUG-86599
Change-Id: Ia97a7a24b5672a2979b514d3cb4879e7630941eb
Reviewed-by: Jüri Valdmann <juri.valdmann@qt.io>
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/compositor/display_gl_output_surface.cpp | 1 | ||||
-rw-r--r-- | src/core/compositor/display_gl_output_surface.h | 1 | ||||
-rw-r--r-- | src/core/compositor/display_gl_output_surface_qsg.cpp | 3 |
3 files changed, 4 insertions, 1 deletions
diff --git a/src/core/compositor/display_gl_output_surface.cpp b/src/core/compositor/display_gl_output_surface.cpp index a75daf222..370eb07e6 100644 --- a/src/core/compositor/display_gl_output_surface.cpp +++ b/src/core/compositor/display_gl_output_surface.cpp @@ -210,6 +210,7 @@ void DisplayGLOutputSurface::swapBuffersOnGpuThread(unsigned int id, std::unique QMutexLocker locker(&m_mutex); m_middleBuffer->serviceId = id; m_middleBuffer->fence = CompositorResourceFence::create(std::move(fence)); + m_readyToUpdate = true; } m_sink->scheduleUpdate(); diff --git a/src/core/compositor/display_gl_output_surface.h b/src/core/compositor/display_gl_output_surface.h index c9c9343ae..d2e203b4e 100644 --- a/src/core/compositor/display_gl_output_surface.h +++ b/src/core/compositor/display_gl_output_surface.h @@ -141,6 +141,7 @@ private: std::unique_ptr<Buffer> m_backBuffer; std::unique_ptr<Buffer> m_middleBuffer; std::unique_ptr<Buffer> m_frontBuffer; + bool m_readyToUpdate = false; scoped_refptr<base::SingleThreadTaskRunner> m_taskRunner; scoped_refptr<viz::VizProcessContextProvider> m_vizContextProvider; }; diff --git a/src/core/compositor/display_gl_output_surface_qsg.cpp b/src/core/compositor/display_gl_output_surface_qsg.cpp index d4b9154d1..0e9fff6e3 100644 --- a/src/core/compositor/display_gl_output_surface_qsg.cpp +++ b/src/core/compositor/display_gl_output_surface_qsg.cpp @@ -88,12 +88,13 @@ QSGNode *DisplayGLOutputSurface::updatePaintNode(QSGNode *oldNode, RenderWidgetH { { QMutexLocker locker(&m_mutex); - if (m_taskRunner) { + if (m_readyToUpdate) { std::swap(m_middleBuffer, m_frontBuffer); m_taskRunner->PostTask( FROM_HERE, base::BindOnce(&DisplayGLOutputSurface::swapBuffersOnVizThread, base::Unretained(this))); m_taskRunner.reset(); + m_readyToUpdate = false; } } |