diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c1f79bb07b..c0cfbda15b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1077,6 +1077,11 @@ void Application::initializeUi() { } void Application::paintGL() { + // paintGL uses a queued connection, so we can get messages from the queue even after we've quit + // and the plugins have shutdown + if (_aboutToQuit) { + return; + } _frameCount++; // update fps moving average diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index 8e02077600..9a0db0ad97 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -30,6 +30,12 @@ class PresentThread : public QThread, public Dependency { using Lock = std::unique_lock; public: + PresentThread() { + connect(qApp, &QCoreApplication::aboutToQuit, [this]{ + _shutdown = true; + }); + } + ~PresentThread() { _shutdown = true; wait(); @@ -99,6 +105,10 @@ public: _context->doneCurrent(); } + _context->makeCurrent(); + if (_activePlugin) { + _activePlugin->uncustomizeContext(); + } _context->doneCurrent(); _context->moveToThread(qApp->thread()); } diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index f2eb112dc7..482eb1b36f 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -337,6 +337,9 @@ void OffscreenQmlSurface::create(QOpenGLContext* shareContext) { // a timer with a small interval is used to get better performance. _updateTimer.setInterval(MIN_TIMER_MS); connect(&_updateTimer, &QTimer::timeout, this, &OffscreenQmlSurface::updateQuick); + QObject::connect(qApp, &QCoreApplication::aboutToQuit, [this]{ + disconnect(&_updateTimer, &QTimer::timeout, this, &OffscreenQmlSurface::updateQuick); + }); _updateTimer.start(); _qmlComponent = new QQmlComponent(_qmlEngine);