From aefb5f4dd9d41aa7377d56ece203089c73aefe07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Sat, 1 Jul 2017 19:19:14 +0200 Subject: [PATCH] Prevent endless loop in checkGLError due to GL_CONTEXT_LOST Summary: The GL_CONTEXT_LOST flag is not reset when calling glGetError. This of course bites with: "Thus, glGetError should always be called in a loop, until it returns GL_NO_ERROR, if all error flags are to be reset." (see https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetError.xhtml) As KWin calls checkGLError from init call it can result in a freeze of KWin. This is a regression reported multiple times since the release of 5.10.3 which enabled GLX_NV_robustness_video_memory_purge extension. Please note that I am not able to test this change. I do not have an NVIDIA card and are not hiting the problem. I have no way to simulate the code. I do not know whether the change will fix the problem, it is based on what others do. Inspiration for this change is mostly from mutter: https://git.gnome.org/browse/mutter/commit/?id=d4d2bf0f6c1737256b921c4f1dedd3a95138cab9 BUG: 381870 FIXED-IN: 5.10.3.1 Test Plan: See above, I can only compile check the change Reviewers: #kwin, #plasma Subscribers: plasma-devel, kwin Tags: #kwin Differential Revision: https://phabricator.kde.org/D6464 --- libkwineffects/kwinglutils.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libkwineffects/kwinglutils.cpp b/libkwineffects/kwinglutils.cpp index 8f7ce38ca0..11a8163ea3 100644 --- a/libkwineffects/kwinglutils.cpp +++ b/libkwineffects/kwinglutils.cpp @@ -128,11 +128,19 @@ static QString formatGLError(GLenum err) bool checkGLError(const char* txt) { GLenum err = glGetError(); + if (err == GL_CONTEXT_LOST) { + qCWarning(LIBKWINGLUTILS) << "GL error: context lost"; + return true; + } bool hasError = false; while (err != GL_NO_ERROR) { qCWarning(LIBKWINGLUTILS) << "GL error (" << txt << "): " << formatGLError(err); hasError = true; err = glGetError(); + if (err == GL_CONTEXT_LOST) { + qCWarning(LIBKWINGLUTILS) << "GL error: context lost"; + break; + } } return hasError; }