From the trace I'd say I'm running glDeleteProgram() without a context? I'm not fully sure why it's not reliably reproducible. I've spent a big chunk of the day switching screen scales (and so geometry) constantly, and hit this twice. Do we sometimes "leak" the doneCurrentContext() and it depends on what it happened to have rendered last? I made the obvious patch, and not seen this since. #6 0x00007fffee16c298 in __run_exit_handlers () at /usr/lib/libc.so.6 #7 0x00007fffee16c2ea in () at /usr/lib/libc.so.6 #8 0x00007fffee220695 in () at /usr/lib/libc.so.6 #9 0x00007fffee2207d4 in () at /usr/lib/libc.so.6 #10 0x00007fffeee175fc in () at /usr/lib/libepoxy.so.0 #11 0x00007fffeedfa69d in () at /usr/lib/libepoxy.so.0 #12 0x00007ffff0b22636 in KWin::GLShader::~GLShader() (this=0x1e786f0, __in_chrg=<optimized out>) at /home/david/projects/kde5/src/kde/workspace/kwin/libkwineffects/kwinglutils.cpp:172 #13 0x00007ffff796b5f7 in QScopedPointerDeleter<KWin::GLShader>::cleanup(KWin::GLShader*) (pointer=0x1e786f0) at /opt/qt5/include/QtCore/qscopedpointer.h:60 #14 0x00007ffff796b2cd in QScopedPointer<KWin::GLShader, QScopedPointerDeleter<KWin::GLShader> >::~QScopedPointer() (this=0x1ee47a8, __in_chrg=<optimized out>) at /opt/qt5/include/QtCore/qscopedpointer.h:107 #15 0x00007ffff7968a91 in KWin::LanczosFilter::~LanczosFilter() (this=0x1ee4780, __in_chrg=<optimized out>) at /home/david/projects/kde5/src/kde/workspace/kwin/lanczosfilter.cpp:55 #16 0x00007ffff7968ace in KWin::LanczosFilter::~LanczosFilter() (this=0x1ee4780, __in_chrg=<optimized out>) at /home/david/projects/kde5/src/kde/workspace/kwin/lanczosfilter.cpp:59 #17 0x00007ffff7950c6e in KWin::SceneOpenGL2::resetLanczosFilter() (this=0xaabf40) at /home/david/projects/kde5/src/kde/workspace/kwin/scene_opengl.cpp:1194 #18 0x00007ffff7a6f77f in KWin::SceneOpenGL2::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) (_o=0xaabf40, _c=QMetaObject::InvokeMetaMethod, _id=0, _a=0x7fffffffcbf8) at kwin_autogen/EWIEGA46WW/moc_scene_opengl.cpp:178 #19 0x00007fffef531a22 in QMetaObject::activate(QObject*, int, int, void**) (sender=sender@entry=0x7ca700, signalOffset=<optimized out>, local_signal_index=local_signal_index@entry=1, argv=argv@entry=0x0) at /home/david/projects/qt5/qtbase/src/corelib/kernel/qobject.cpp:3766 #20 0x00007fffef531d0b in QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (sender=0x7ca700, m=<optimized out---Type <return> to continue, or q <return> to quit--- >, local_signal_index=1, argv=0x0) at /home/david/projects/qt5/qtbase/src/corelib/kernel/qobject.cpp:3628 #21 0x00007ffff7a70bbb in KWin::Screens::changed() (this=0x7ca700) at kwin_autogen/EWIEGA46WW/moc_screens.cpp:262 #22 0x00007fffde44e19a in KWin::DrmBackend::configurationChangeRequested(KWayland::Server::OutputConfigurationInterface*) (this=0x6a9910, config=0x1edd2f0) at /home/david/projects/kde5/src/kde/workspace/kwin/plugins/platforms/drm/drm_backend.cpp:537 #23 0x00007ffff7a046fa in KWin::WaylandServer::<lambda(KWayland::Server::OutputConfigurationInterface*)>::operator()(KWayland::Server::OutputConfigurationInterface *) const (__closure=0x6a9560, config=0x1edd2f0) at /home/david/projects/kde5/src/kde/workspace/kwin/wayland_server.cpp:298 #24 0x00007ffff7a0971f in QtPrivate::FunctorCall<QtPrivate::IndexesList<0>, QtPrivate::List<KWayland::Server::OutputConfigurationInterface*>, void, KWin::WaylandServer::init(const QByteArray&, KWin::WaylandServer::InitalizationFlags)::<lambda(KWayland::Server::OutputConfigurationInterface*)> >::call(KWin::WaylandServer::<lambda(KWayland::Server::OutputConfigurationInterface*)> &, void **) (f=..., arg=0x7fffffffcee0) at /opt/qt5/include/QtCore/qobjectdefs_impl.h:130 #25 0x00007ffff7a092fe in QtPrivate::Functor<KWin::WaylandServer::init(const QByteArray&, KWin::WaylandServer::InitalizationFlags)::<lambda(KWayland::Server::OutputConfigurationInterface*)>, 1>::call<QtPrivate::List<KWayland::Server::OutputConfigurationInterface*>, void>(KWin::WaylandServer::<lambda(KWayland::Server::OutputConfigurationInterface*)> &, void *, void **) (f=..., arg=0x7fffffffcee0) at /opt/qt5/include/QtCore/qobjectdefs_impl.h:240 #26 0x00007ffff7a0829a in QtPrivate::QFunctorSlotObject<KWin::WaylandServer::init(const QByteArray&, KWin::WaylandServer::InitalizationFlags)::<lambda(KWayland::Server::OutputConfigurationInterface*)>, 1, QtPrivate::List<KWayland::Server::OutputConfigurationInterface*>, void>::impl(int, QtPrivate::QSlotObjectBase *, QObject *, void **, bool *) (which=1, this_=0x6a9550, r=0x69f0f0, a=0x7fffffffcee0, ret=0x0) at /opt/qt5/include/QtCore/qobject_impl.h:168 #27 0x00007fffef531879 in QtPrivate::QSlotObjectBase::call(QObject*, void**) (a=<optimized out>, r=0x69f0f0, this=0x6a9550) at ../../include/QtCore/../../../../qt5/qtbase/src/corelib/kernel/qobject_impl.h:101 #28 0x00007fffef531879 in QMetaObject::activate(QObject*, int, int, void**) (sender=sender@entry=0x6a93f0, signalOffset=<optimized out>, local_signal_index=local_signal_index@entry=0, argv=argv@entry=0x7fffffffcee0) at /home/david/projects/qt5/qtbase/src/corelib/kernel/qobject.cpp:3749 #29 0x00007fffef531d0b in QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (sender=0x6a93f0, m=<optimized out>, local_signal_index=0, argv=0x7fffffffcee0) at /home/david/projects/qt5/qtbase/src/corelib/kernel/qobject.cpp:3628 #30 0x00007ffff14b4e65 in KWayland::Server::OutputManagementInterface::configurationChangeRequested(KWayland::Server::OutputConfigurationInterface*) (this=0x6a93f0, _t1=0x1edd2f0) at src/server/KF5WaylandServer_autogen/EWIEGA46WW/moc_outputmanagement_interface.cpp:132 #31 0x00007ffff143fc4f in KWayland::Server::OutputConfigurationInterface::Private::emitConfigurationChangeRequested() const (this=0x1f00a10) at /home/david/projects/kde5/src/frameworks/kwayland/src/server/outputconfiguration_interface.cpp:199 #32 0x00007ffff143fc1c in KWayland::Server::OutputConfigurationInterface::Private::applyCallback(wl_client*, wl_resource*) (client=0x1e746f0, resource=0x1ede140) at /home/david/projects/kde5/src/frameworks/kwayland/src/server/outputconfiguration_interface.cpp:193 #33 0x00007fffe44d91c8 in ffi_call_unix64 () at /usr/lib/libffi.so.6 #34 0x00007fffe44d8c2a in ffi_call () at /usr/lib/libffi.so.6 #35 0x00007fffeb593ffe in () at /usr/lib/libwayland-server.so.0 #36 0x00007fffeb5908d7 in () at /usr/lib/libwayland-server.so.0
Why are you not seeing it always: the LanczosFilter is lazy loaded, so you need to trigger it. This happens for example in Present Windows. Yes, I consider it possible that we leak the doneCurrentContext in the case that a screen gets deleted.
Git commit 1783fda30eee41fb1bc74e7276f90b8f29648817 by David Edmundson. Committed on 20/09/2017 at 16:46. Pushed by davidedmundson into branch 'Plasma/5.11'. Make sure OpenGL Context is valid before deleting shader Summary: Deleting the lanczos filter deletes it's GLShader, this calls glDeleteProgram glFooBar always needs to have an openGL context, we don't know we have this on a screen changed event as it is called from outside the normal render methods. Test Plan: Ran on my wayland session. Switched geometry a lot, couldn't reproduce the crash. Ran on my desktop session, seemed the same as before Reviewers: #plasma, graesslin Reviewed By: #plasma, graesslin Subscribers: graesslin, plasma-devel, kwin, #kwin Tags: #plasma Differential Revision: https://phabricator.kde.org/D7888 M +7 -9 scene_opengl.cpp M +0 -3 scene_opengl.h https://commits.kde.org/kwin/1783fda30eee41fb1bc74e7276f90b8f29648817