From cf47a78cff65e7616b8458c1519ac90113a6586c Mon Sep 17 00:00:00 2001 From: Kirill Burtsev Date: Thu, 17 Sep 2020 14:46:12 +0000 Subject: FIXUP: Fix swap condition in DisplayGLOutputSurface::updatePaintNode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/core/compositor/display_gl_output_surface.cpp | 1 + src/core/compositor/display_gl_output_surface.h | 1 + src/core/compositor/display_gl_output_surface_qsg.cpp | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) (limited to 'src') 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 m_backBuffer; std::unique_ptr m_middleBuffer; std::unique_ptr m_frontBuffer; + bool m_readyToUpdate = false; scoped_refptr m_taskRunner; scoped_refptr 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; } } -- cgit v1.2.3