File 0005-Use-only-one-timer-to-detect-freezes-and-other-optim.patch of Package kwin5
From 8f5dbeba06ce05d6474f369a95a1a9d1f814a06f Mon Sep 17 00:00:00 2001
From: Antonio Larrosa <larrosa@kde.org>
Date: Mon, 24 Oct 2016 16:45:04 +0200
Subject: [PATCH 5/7] Use only one timer to detect freezes and other
optimizations
stop/restart the same timer instead of creating a new one for each frame
tested for freezes. Merged PreInit with PreFrame and PostInit with
PostFrame so there's no need to call both before/after init, which
didn't make sense contextually. Also moved group.sync() so
PreFrame/PostFrame don't call it continuously. Finally, also renamed
PostLastFrame to PostLastGuardedFrame
---
composite.cpp | 4 +-
platform.h | 2 +-
plugins/platforms/x11/standalone/x11_platform.cpp | 55 ++++++++++++-----------
3 files changed, 31 insertions(+), 30 deletions(-)
diff --git a/composite.cpp b/composite.cpp
index 0abf531..573e7a6 100644
--- a/composite.cpp
+++ b/composite.cpp
@@ -207,11 +207,9 @@ void Compositor::slotCompositingOptionsInitialized()
qCWarning(KWIN_CORE) << "KWin has detected that your OpenGL library is unsafe to use";
else {
kwinApp()->platform()->createOpenGLSafePoint(Platform::OpenGLSafePoint::PreInit);
- kwinApp()->platform()->createOpenGLSafePoint(Platform::OpenGLSafePoint::PreFrame);
m_scene = SceneOpenGL::createScene(this);
- kwinApp()->platform()->createOpenGLSafePoint(Platform::OpenGLSafePoint::PostLastFrame);
kwinApp()->platform()->createOpenGLSafePoint(Platform::OpenGLSafePoint::PostInit);
if (m_scene && !m_scene->initFailed()) {
@@ -748,7 +746,7 @@ void Compositor::performCompositing()
}
m_framesToTestForSafety--;
if (m_framesToTestForSafety == 0) {
- kwinApp()->platform()->createOpenGLSafePoint(Platform::OpenGLSafePoint::PostLastFrame);
+ kwinApp()->platform()->createOpenGLSafePoint(Platform::OpenGLSafePoint::PostLastGuardedFrame);
}
}
m_timeSinceStart += m_timeSinceLastVBlank;
diff --git a/platform.h b/platform.h
index 83e41bb..de0b3bf 100644
--- a/platform.h
+++ b/platform.h
@@ -145,7 +145,7 @@ public:
PostInit,
PreFrame,
PostFrame,
- PostLastFrame
+ PostLastGuardedFrame
};
/**
* This method is invoked before and after creating the OpenGL rendering Scene.
diff --git a/plugins/platforms/x11/standalone/x11_platform.cpp b/plugins/platforms/x11/standalone/x11_platform.cpp
index 39652c2..88b37ea 100644
--- a/plugins/platforms/x11/standalone/x11_platform.cpp
+++ b/plugins/platforms/x11/standalone/x11_platform.cpp
@@ -201,47 +201,50 @@ void X11StandalonePlatform::createOpenGLSafePoint(OpenGLSafePoint safePoint)
switch (safePoint) {
case OpenGLSafePoint::PreInit:
group.writeEntry(unsafeKey, true);
- break;
- case OpenGLSafePoint::PostInit:
- group.writeEntry(unsafeKey, false);
- break;
+ group.sync();
+ // Deliberately continue with PreFrame
case OpenGLSafePoint::PreFrame:
if (m_openGLFreezeProtectionThread == nullptr) {
+ Q_ASSERT(m_openGLFreezeProtection == nullptr);
m_openGLFreezeProtectionThread = new QThread(this);
m_openGLFreezeProtectionThread->setObjectName("FreezeDetector");
m_openGLFreezeProtectionThread->start();
- }
- Q_ASSERT(m_openGLFreezeProtection == nullptr);
- m_openGLFreezeProtection = new QTimer;
- m_openGLFreezeProtection->setInterval(15000);
- m_openGLFreezeProtection->setSingleShot(true);
- m_openGLFreezeProtection->start();
- m_openGLFreezeProtection->moveToThread(m_openGLFreezeProtectionThread);
- connect(m_openGLFreezeProtection, &QTimer::timeout, m_openGLFreezeProtection,
- [] {
- const QString unsafeKey(QLatin1String("OpenGLIsUnsafe") + (kwinApp()->isX11MultiHead() ? QString::number(kwinApp()->x11ScreenNumber()) : QString()));
- auto group = KConfigGroup(kwinApp()->config(), "Compositing");
- group.writeEntry(unsafeKey, true);
- group.sync();
- qFatal("Freeze in OpenGL initialization detected");
- }, Qt::DirectConnection);
+ m_openGLFreezeProtection = new QTimer;
+ m_openGLFreezeProtection->setInterval(15000);
+ m_openGLFreezeProtection->setSingleShot(true);
+ m_openGLFreezeProtection->start();
+ m_openGLFreezeProtection->moveToThread(m_openGLFreezeProtectionThread);
+ connect(m_openGLFreezeProtection, &QTimer::timeout, m_openGLFreezeProtection,
+ [] {
+ const QString unsafeKey(QLatin1String("OpenGLIsUnsafe") + (kwinApp()->isX11MultiHead() ? QString::number(kwinApp()->x11ScreenNumber()) : QString()));
+ auto group = KConfigGroup(kwinApp()->config(), "Compositing");
+ group.writeEntry(unsafeKey, true);
+ group.sync();
+ qFatal("Freeze in OpenGL initialization detected");
+ }, Qt::DirectConnection);
+ }
+ else
+ {
+ Q_ASSERT(m_openGLFreezeProtection);
+ QMetaObject::invokeMethod(m_openGLFreezeProtection, "start", Qt::QueuedConnection);
+ }
break;
+ case OpenGLSafePoint::PostInit:
+ group.writeEntry(unsafeKey, false);
+ group.sync();
+ // Deliberately continue with PostFrame
case OpenGLSafePoint::PostFrame:
+ QMetaObject::invokeMethod(m_openGLFreezeProtection, "stop", Qt::QueuedConnection);
+ break;
+ case OpenGLSafePoint::PostLastGuardedFrame:
m_openGLFreezeProtection->deleteLater();
m_openGLFreezeProtection = nullptr;
- break;
- case OpenGLSafePoint::PostLastFrame:
- if (m_openGLFreezeProtection) {
- m_openGLFreezeProtection->deleteLater();
- m_openGLFreezeProtection = nullptr;
- };
m_openGLFreezeProtectionThread->quit();
m_openGLFreezeProtectionThread->wait();
delete m_openGLFreezeProtectionThread;
m_openGLFreezeProtectionThread = nullptr;
break;
}
- group.sync();
}
}
--
2.10.1