diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2016-06-29 14:25:33 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2016-07-01 11:36:49 +0000 |
commit | 7019f7c3237d1894ad2e3ccc4ca9c366a9bba2e4 (patch) | |
tree | 31f6a63364e27f7b94b0acee4d09fabbc7695140 /src/plugins/scenegraph | |
parent | 42f485231c6bdbf2ad42e9483ec372b108d40f37 (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')
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) { |