diff options
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp | 5 | ||||
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h | 1 | ||||
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgrenderer_p.h | 3 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgrenderloop.cpp | 11 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgthreadedrenderloop.cpp | 7 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgwindowsrenderloop.cpp | 10 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgwindowsrenderloop_p.h | 2 |
7 files changed, 36 insertions, 3 deletions
diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp index edee29584c..d016e79641 100644 --- a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp +++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp @@ -2914,6 +2914,11 @@ void Renderer::renderRenderNode(Batch *batch) glBindFramebuffer(GL_FRAMEBUFFER, prevFbo); } +void Renderer::releaseCachedResources() +{ + m_shaderManager->invalidated(); +} + class VisualizeShader : public QOpenGLShaderProgram { public: diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h b/src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h index 2c0f8667e8..b0a14d23b9 100644 --- a/src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h +++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h @@ -629,6 +629,7 @@ public: protected: void nodeChanged(QSGNode *node, QSGNode::DirtyState state) Q_DECL_OVERRIDE; void render() Q_DECL_OVERRIDE; + void releaseCachedResources() Q_DECL_OVERRIDE; private: enum ClipTypeBit diff --git a/src/quick/scenegraph/coreapi/qsgrenderer_p.h b/src/quick/scenegraph/coreapi/qsgrenderer_p.h index 4589685765..d96d893ca5 100644 --- a/src/quick/scenegraph/coreapi/qsgrenderer_p.h +++ b/src/quick/scenegraph/coreapi/qsgrenderer_p.h @@ -92,7 +92,8 @@ public: QSGNodeUpdater *nodeUpdater() const; void setNodeUpdater(QSGNodeUpdater *updater); inline QSGMaterialShader::RenderState state(QSGMaterialShader::RenderState::DirtyStates dirty) const; - virtual void setCustomRenderMode(const QByteArray &) { }; + virtual void setCustomRenderMode(const QByteArray &) { } + virtual void releaseCachedResources() { } void clearChangedFlag() { m_changed_emitted = false; } diff --git a/src/quick/scenegraph/qsgrenderloop.cpp b/src/quick/scenegraph/qsgrenderloop.cpp index bc65dc1bc3..2c73339b7a 100644 --- a/src/quick/scenegraph/qsgrenderloop.cpp +++ b/src/quick/scenegraph/qsgrenderloop.cpp @@ -56,6 +56,7 @@ #include <QtQuick/QQuickWindow> #include <QtQuick/private/qquickwindow_p.h> #include <QtQuick/private/qsgcontext_p.h> +#include <QtQuick/private/qsgrenderer_p.h> #include <private/qquickprofiler_p.h> #if QT_CONFIG(opengl) @@ -152,7 +153,7 @@ public: void update(QQuickWindow *window) { maybeUpdate(window); } // identical for this implementation. void handleUpdateRequest(QQuickWindow *); - void releaseResources(QQuickWindow *) { } + void releaseResources(QQuickWindow *) Q_DECL_OVERRIDE; QAnimationDriver *animationDriver() const { return 0; } @@ -505,6 +506,14 @@ QSGContext *QSGGuiThreadRenderLoop::sceneGraphContext() const return sg; } +void QSGGuiThreadRenderLoop::releaseResources(QQuickWindow *w) +{ + // No full invalidation of the rendercontext, just clear some caches. + QQuickWindowPrivate *d = QQuickWindowPrivate::get(w); + if (d->renderer) + d->renderer->releaseCachedResources(); +} + void QSGGuiThreadRenderLoop::handleUpdateRequest(QQuickWindow *window) { renderWindow(window); diff --git a/src/quick/scenegraph/qsgthreadedrenderloop.cpp b/src/quick/scenegraph/qsgthreadedrenderloop.cpp index d28a73da20..e0f78a9873 100644 --- a/src/quick/scenegraph/qsgthreadedrenderloop.cpp +++ b/src/quick/scenegraph/qsgthreadedrenderloop.cpp @@ -406,6 +406,13 @@ bool QSGRenderThread::event(QEvent *e) stopEventProcessing = true; } else { qCDebug(QSG_LOG_RENDERLOOP) << QSG_RT_PAD << "- not releasing because window is still active"; + if (window) { + QQuickWindowPrivate *d = QQuickWindowPrivate::get(window); + if (d->renderer) { + qCDebug(QSG_LOG_RENDERLOOP) << QSG_RT_PAD << "- requesting renderer to release cached resources"; + d->renderer->releaseCachedResources(); + } + } } waitCondition.wakeOne(); wm->m_lockedForSync = false; diff --git a/src/quick/scenegraph/qsgwindowsrenderloop.cpp b/src/quick/scenegraph/qsgwindowsrenderloop.cpp index e10e52d95e..e33f31f2ac 100644 --- a/src/quick/scenegraph/qsgwindowsrenderloop.cpp +++ b/src/quick/scenegraph/qsgwindowsrenderloop.cpp @@ -48,6 +48,7 @@ #include <QtQuick/private/qsgcontext_p.h> #include <QtQuick/private/qquickwindow_p.h> +#include <QtQuick/private/qsgrenderer_p.h> #include <QtQuick/private/qsgdefaultrendercontext_p.h> #include <QtQuick/QQuickWindow> @@ -503,6 +504,15 @@ void QSGWindowsRenderLoop::renderWindow(QQuickWindow *window) QQuickProfiler::SceneGraphRenderLoopSwap); } +void QSGWindowsRenderLoop::releaseResources(QQuickWindow *w) +{ + // No full invalidation of the rendercontext, just clear some caches. + RLDEBUG("releaseResources"); + QQuickWindowPrivate *d = QQuickWindowPrivate::get(w); + if (d->renderer) + d->renderer->releaseCachedResources(); +} + QT_END_NAMESPACE #include "moc_qsgwindowsrenderloop_p.cpp" diff --git a/src/quick/scenegraph/qsgwindowsrenderloop_p.h b/src/quick/scenegraph/qsgwindowsrenderloop_p.h index 1940a66af2..a1188fed8a 100644 --- a/src/quick/scenegraph/qsgwindowsrenderloop_p.h +++ b/src/quick/scenegraph/qsgwindowsrenderloop_p.h @@ -86,7 +86,7 @@ public: QSGContext *sceneGraphContext() const override { return m_sg; } QSGRenderContext *createRenderContext(QSGContext *) const override; - void releaseResources(QQuickWindow *) override { } + void releaseResources(QQuickWindow *) override; void render(); void renderWindow(QQuickWindow *window); |