aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp5
-rw-r--r--src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h1
-rw-r--r--src/quick/scenegraph/coreapi/qsgrenderer_p.h3
-rw-r--r--src/quick/scenegraph/qsgrenderloop.cpp11
-rw-r--r--src/quick/scenegraph/qsgthreadedrenderloop.cpp7
-rw-r--r--src/quick/scenegraph/qsgwindowsrenderloop.cpp10
-rw-r--r--src/quick/scenegraph/qsgwindowsrenderloop_p.h2
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);