summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
authorKirill Burtsev <kirill.burtsev@qt.io>2020-09-17 14:46:12 +0000
committerKirill Burtsev <kirill.burtsev@qt.io>2020-09-18 18:22:37 +0200
commitcf47a78cff65e7616b8458c1519ac90113a6586c (patch)
tree6eb072d568cd600d1d310687235b4783d7516d33 /src/core
parentd701dcbf4d15e16e05b169828dd4e031e99c2625 (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.cpp1
-rw-r--r--src/core/compositor/display_gl_output_surface.h1
-rw-r--r--src/core/compositor/display_gl_output_surface_qsg.cpp3
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;
}
}