aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/scenegraph
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@qt.io>2016-06-29 16:09:56 +0200
committerLaszlo Agocs <laszlo.agocs@qt.io>2016-07-01 11:36:54 +0000
commit589f92b188ff61a3b965d5d5c67d89333425cc97 (patch)
tree8584779b2e62815df46aa5adb8f11d1936ce75de /src/plugins/scenegraph
parent6b8070d5a9598caa1c42753bb9034eb6137e7237 (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.cpp54
-rw-r--r--src/plugins/scenegraph/d3d12/qsgd3d12renderloop_p.h2
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;