[scenes/opengl] Cleanup cached decoration shadow textures when suspending compositing
Summary: When suspending compositing, SceneOpenGLShadow cannot cleanup cached decoration shadow textures because the effects handler is already gone. This sometimes can result in a crash when running kwin_x11 --replace (we're hitting an assert statement). To fix that, let's use the scene instead of the effects handler for making the OpenGL context current. Test Plan: No longer hit the assert statement: ASSERT: "m_cache.isEmpty()" in file /home/vlad/Workspace/KDE/src/kde/workspace/kwin/plugins/scenes/opengl/scene_opengl.cpp, line 2025 Application::crashHandler() called with signal 6; recent crashes: 1 QCoreApplication::applicationFilePath: Please instantiate the QApplication object first KCrash: crashing... crashRecursionCounter = 2 KCrash: Application Name = kwin_x11 path = /home/vlad/Workspace/KDE/usr/bin pid = 5407 KCrash: Arguments: /home/vlad/Workspace/KDE/usr/bin/kwin_x11 --replace Reviewers: #kwin, graesslin Reviewed By: #kwin, graesslin Subscribers: kwin Tags: #kwin Differential Revision: https://phabricator.kde.org/D17306
This commit is contained in:
parent
64cf1afa9f
commit
3ad5604580
1 changed files with 7 additions and 4 deletions
|
@ -2074,8 +2074,9 @@ SceneOpenGLShadow::SceneOpenGLShadow(Toplevel *toplevel)
|
|||
|
||||
SceneOpenGLShadow::~SceneOpenGLShadow()
|
||||
{
|
||||
if (effects) {
|
||||
effects->makeOpenGLContextCurrent();
|
||||
Scene *scene = Compositor::self()->scene();
|
||||
if (scene) {
|
||||
scene->makeOpenGLContextCurrent();
|
||||
DecorationShadowTextureCache::instance().unregister(this);
|
||||
m_texture.reset();
|
||||
}
|
||||
|
@ -2334,7 +2335,8 @@ bool SceneOpenGLShadow::prepareBackend()
|
|||
{
|
||||
if (hasDecorationShadow()) {
|
||||
// simplifies a lot by going directly to
|
||||
effects->makeOpenGLContextCurrent();
|
||||
Scene *scene = Compositor::self()->scene();
|
||||
scene->makeOpenGLContextCurrent();
|
||||
m_texture = DecorationShadowTextureCache::instance().getTexture(this);
|
||||
|
||||
return true;
|
||||
|
@ -2403,7 +2405,8 @@ bool SceneOpenGLShadow::prepareBackend()
|
|||
}
|
||||
}
|
||||
|
||||
effects->makeOpenGLContextCurrent();
|
||||
Scene *scene = Compositor::self()->scene();
|
||||
scene->makeOpenGLContextCurrent();
|
||||
m_texture = QSharedPointer<GLTexture>::create(image);
|
||||
|
||||
if (m_texture->internalFormat() == GL_R8) {
|
||||
|
|
Loading…
Reference in a new issue