aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/scenegraph
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@qt.io>2016-06-29 14:25:33 +0200
committerLaszlo Agocs <laszlo.agocs@qt.io>2016-07-01 11:36:49 +0000
commit7019f7c3237d1894ad2e3ccc4ca9c366a9bba2e4 (patch)
tree31f6a63364e27f7b94b0acee4d09fabbc7695140 /src/plugins/scenegraph
parent42f485231c6bdbf2ad42e9483ec372b108d40f37 (diff)
D3D12: Avoid multiple invalidated signals
Calling invalidate() multiple times for any reason should only result in doing cleanup and emitting signals once. The somewhat weird manual pending flag is also removed now. Change-Id: I46eca63a300fe9acb4ebd0bd9b601d8583dced1c Reviewed-by: Andy Nichols <andy.nichols@qt.io>
Diffstat (limited to 'src/plugins/scenegraph')
-rw-r--r--src/plugins/scenegraph/d3d12/qsgd3d12rendercontext.cpp25
-rw-r--r--src/plugins/scenegraph/d3d12/qsgd3d12rendercontext_p.h6
-rw-r--r--src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp6
-rw-r--r--src/plugins/scenegraph/d3d12/qsgd3d12threadedrenderloop.cpp8
4 files changed, 20 insertions, 25 deletions
diff --git a/src/plugins/scenegraph/d3d12/qsgd3d12rendercontext.cpp b/src/plugins/scenegraph/d3d12/qsgd3d12rendercontext.cpp
index 84b12303d9..1a63117ec0 100644
--- a/src/plugins/scenegraph/d3d12/qsgd3d12rendercontext.cpp
+++ b/src/plugins/scenegraph/d3d12/qsgd3d12rendercontext.cpp
@@ -64,8 +64,22 @@ bool QSGD3D12RenderContext::isValid() const
return m_engine != nullptr;
}
+void QSGD3D12RenderContext::initialize(void *)
+{
+ if (m_initialized)
+ return;
+
+ m_initialized = true;
+ emit initialized();
+}
+
void QSGD3D12RenderContext::invalidate()
{
+ if (!m_initialized)
+ return;
+
+ m_initialized = false;
+
if (Q_UNLIKELY(debug_render()))
qDebug("rendercontext invalidate engine %p, %d/%d/%d", m_engine,
m_texturesToDelete.count(), m_textures.count(), m_fontEnginesToClean.count());
@@ -114,16 +128,7 @@ void QSGD3D12RenderContext::setEngine(QSGD3D12Engine *engine)
m_engine = engine;
if (m_engine)
- emit initialized();
-}
-
-void QSGD3D12RenderContext::ensureInitializedEmitted()
-{
- if (!m_pendingInitialized)
- return;
-
- m_pendingInitialized = false;
- emit initialized();
+ initialize(nullptr);
}
QSGRendererInterface::GraphicsApi QSGD3D12RenderContext::graphicsApi() const
diff --git a/src/plugins/scenegraph/d3d12/qsgd3d12rendercontext_p.h b/src/plugins/scenegraph/d3d12/qsgd3d12rendercontext_p.h
index a1029b019e..5cd0b52f4b 100644
--- a/src/plugins/scenegraph/d3d12/qsgd3d12rendercontext_p.h
+++ b/src/plugins/scenegraph/d3d12/qsgd3d12rendercontext_p.h
@@ -63,6 +63,7 @@ class QSGD3D12RenderContext : public QSGRenderContext, public QSGRendererInterfa
public:
QSGD3D12RenderContext(QSGContext *ctx);
bool isValid() const override;
+ void initialize(void *context) override;
void invalidate() override;
void renderNextFrame(QSGRenderer *renderer, uint fbo) override;
QSGTexture *createTexture(const QImage &image, uint flags) const override;
@@ -71,9 +72,6 @@ public:
void setEngine(QSGD3D12Engine *engine);
QSGD3D12Engine *engine() { return m_engine; }
- void ensureInitializedEmitted();
- void setInitializedPending() { m_pendingInitialized = true; }
-
// QSGRendererInterface
GraphicsApi graphicsApi() const override;
void *getResource(Resource resource) const override;
@@ -83,7 +81,7 @@ public:
private:
QSGD3D12Engine *m_engine = nullptr;
- bool m_pendingInitialized = false;
+ bool m_initialized = false;
};
QT_END_NAMESPACE
diff --git a/src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp b/src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp
index 288a7ce4ad..bb7c1d5437 100644
--- a/src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp
+++ b/src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp
@@ -276,9 +276,6 @@ void QSGD3D12RenderLoop::renderWindow(QQuickWindow *window)
data.rc->invalidate();
data.engine->releaseResources();
needsWindow = true;
- // Be nice and emit the rendercontext's initialized() later on so that
- // QQuickWindow::sceneGraphInitialized() behaves in a manner similar to GL.
- data.rc->setInitializedPending();
}
if (needsWindow) {
// Must only ever get here when there is no window or releaseResources() has been called.
@@ -296,10 +293,9 @@ void QSGD3D12RenderLoop::renderWindow(QQuickWindow *window)
wd->cleanupNodesOnShutdown();
QSGD3D12ShaderEffectNode::cleanupMaterialTypeCache();
data.rc->invalidate();
- data.rc->setInitializedPending();
}
- data.rc->ensureInitializedEmitted();
+ data.rc->initialize(nullptr);
wd->syncSceneGraph();
diff --git a/src/plugins/scenegraph/d3d12/qsgd3d12threadedrenderloop.cpp b/src/plugins/scenegraph/d3d12/qsgd3d12threadedrenderloop.cpp
index 9f32a6d8bf..26efa171f5 100644
--- a/src/plugins/scenegraph/d3d12/qsgd3d12threadedrenderloop.cpp
+++ b/src/plugins/scenegraph/d3d12/qsgd3d12threadedrenderloop.cpp
@@ -327,10 +327,6 @@ bool QSGD3D12RenderThread::event(QEvent *e)
rc->invalidate();
engine->releaseResources();
needsWindow = true;
- // Be nice and emit the rendercontext's initialized() later on at
- // some point so that QQuickWindow::sceneGraphInitialized() behaves
- // in a manner similar to GL.
- rc->setInitializedPending();
}
if (needsWindow) {
// Must only ever get here when there is no window or releaseResources() has been called.
@@ -412,7 +408,7 @@ bool QSGD3D12RenderThread::event(QEvent *e)
// However, our hands are tied by the existing, synchronous APIs of
// QQuickWindow and such.
QQuickWindowPrivate *wd = QQuickWindowPrivate::get(wme->window);
- rc->ensureInitializedEmitted();
+ rc->initialize(nullptr);
wd->syncSceneGraph();
wd->renderSceneGraph(wme->window->size());
*wme->image = engine->executeAndWaitReadbackRenderTarget();
@@ -547,7 +543,7 @@ void QSGD3D12RenderThread::sync(bool inExpose)
if (wd->renderer)
wd->renderer->clearChangedFlag();
- rc->ensureInitializedEmitted();
+ rc->initialize(nullptr);
wd->syncSceneGraph();
if (!hadRenderer && wd->renderer) {