diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2016-06-29 16:09:56 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2016-07-01 11:36:54 +0000 |
commit | 589f92b188ff61a3b965d5d5c67d89333425cc97 (patch) | |
tree | 8584779b2e62815df46aa5adb8f11d1936ce75de /src/plugins/scenegraph | |
parent | 6b8070d5a9598caa1c42753bb9034eb6137e7237 (diff) |
D3D12: Fix grabbing with the new gui thread render loop
Grabbing was not completely ported from the separate render thread based
version, and so some of the grab tests in tst_qquickwindow did not pass.
This is now corrected.
Change-Id: I830d9b439082cf8ebc1bfe75ce756ef5dd7c54c0
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
Diffstat (limited to 'src/plugins/scenegraph')
-rw-r--r-- | src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp | 54 | ||||
-rw-r--r-- | src/plugins/scenegraph/d3d12/qsgd3d12renderloop_p.h | 2 |
2 files changed, 36 insertions, 20 deletions
diff --git a/src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp b/src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp index bb7c1d5437..4684e7243f 100644 --- a/src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp +++ b/src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp @@ -128,39 +128,49 @@ void QSGD3D12RenderLoop::windowDestroyed(QQuickWindow *window) delete engine; } -void QSGD3D12RenderLoop::exposureChanged(QQuickWindow *window) +void QSGD3D12RenderLoop::exposeWindow(QQuickWindow *window) { + WindowData data; + data.engine = new QSGD3D12Engine; + data.rc = static_cast<QSGD3D12RenderContext *>(QQuickWindowPrivate::get(window)->context); + data.rc->setEngine(data.engine); + m_windows[window] = data; + + const int samples = window->format().samples(); + const qreal dpr = window->effectiveDevicePixelRatio(); + if (Q_UNLIKELY(debug_loop())) - qDebug() << "exposure changed" << window; + qDebug() << "initializing D3D12 engine" << window << window->size() << dpr << samples; - if (window->isExposed()) { - if (!m_windows.contains(window)) { - WindowData data; - data.engine = new QSGD3D12Engine; - data.rc = static_cast<QSGD3D12RenderContext *>(QQuickWindowPrivate::get(window)->context); - data.rc->setEngine(data.engine); - m_windows[window] = data; + data.engine->attachToWindow(window->winId(), window->size(), dpr, samples); +} - const int samples = window->format().samples(); - const qreal dpr = window->effectiveDevicePixelRatio(); +void QSGD3D12RenderLoop::obscureWindow(QQuickWindow *window) +{ + QQuickWindowPrivate *wd = QQuickWindowPrivate::get(window); + wd->fireAboutToStop(); +} - if (debug_loop()) - qDebug() << "initializing D3D12 engine" << window << window->size() << dpr << samples; +void QSGD3D12RenderLoop::exposureChanged(QQuickWindow *window) +{ + if (Q_UNLIKELY(debug_loop())) + qDebug() << "exposure changed" << window; - data.engine->attachToWindow(window->winId(), window->size(), dpr, samples); - } + if (window->isExposed()) { + if (!m_windows.contains(window)) + exposeWindow(window); m_windows[window].updatePending = true; renderWindow(window); } else if (m_windows.contains(window)) { - QQuickWindowPrivate *wd = QQuickWindowPrivate::get(window); - wd->fireAboutToStop(); + obscureWindow(window); } } QImage QSGD3D12RenderLoop::grab(QQuickWindow *window) { - if (!m_windows.contains(window)) - return QImage(); + const bool tempExpose = !m_windows.contains(window); + if (tempExpose) + exposeWindow(window); m_windows[window].grabOnly = true; @@ -168,6 +178,10 @@ QImage QSGD3D12RenderLoop::grab(QQuickWindow *window) QImage grabbed = m_grabContent; m_grabContent = QImage(); + + if (tempExpose) + obscureWindow(window); + return grabbed; } @@ -234,7 +248,7 @@ void QSGD3D12RenderLoop::renderWindow(QQuickWindow *window) qDebug() << "renderWindow" << window; QQuickWindowPrivate *wd = QQuickWindowPrivate::get(window); - if (!wd->isRenderable() || !m_windows.contains(window)) + if (!m_windows.contains(window) || !window->geometry().isValid()) return; WindowData &data(m_windows[window]); diff --git a/src/plugins/scenegraph/d3d12/qsgd3d12renderloop_p.h b/src/plugins/scenegraph/d3d12/qsgd3d12renderloop_p.h index fbd9d66d4a..3cd0fa0043 100644 --- a/src/plugins/scenegraph/d3d12/qsgd3d12renderloop_p.h +++ b/src/plugins/scenegraph/d3d12/qsgd3d12renderloop_p.h @@ -91,6 +91,8 @@ public: int flags() const override; private: + void exposeWindow(QQuickWindow *window); + void obscureWindow(QQuickWindow *window); void renderWindow(QQuickWindow *window); QSGD3D12Context *sg; |