summaryrefslogtreecommitdiffstats
path: root/src/render/framegraph/qrendersurfaceselector.cpp
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2016-01-22 11:31:22 +0100
committerPaul Lemire <paul.lemire@kdab.com>2016-03-17 11:27:53 +0000
commit7ff2cc9c1f037fa9159bc24d8a47778ebac2390a (patch)
treed96af4c0415662906c1c6fa5a64601b539cb106a /src/render/framegraph/qrendersurfaceselector.cpp
parentc01bc22c287e58186a285b3f8507711fd982fd05 (diff)
Renderer/QRenderTargetSurfaceSelector: implement proper synchronization
This is needed to avoid rendering on a surface that has been destroyed. Change-Id: Iadc2a32e2e0113704ca4df48df6bcdd1a0d8256c Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render/framegraph/qrendersurfaceselector.cpp')
-rw-r--r--src/render/framegraph/qrendersurfaceselector.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/render/framegraph/qrendersurfaceselector.cpp b/src/render/framegraph/qrendersurfaceselector.cpp
index a0d7e3a47..8bd31ac12 100644
--- a/src/render/framegraph/qrendersurfaceselector.cpp
+++ b/src/render/framegraph/qrendersurfaceselector.cpp
@@ -86,6 +86,7 @@ namespace Qt3DRender {
QRenderSurfaceSelectorPrivate::QRenderSurfaceSelectorPrivate()
: Qt3DRender::QFrameGraphNodePrivate()
, m_surface(Q_NULLPTR)
+ , m_surfaceEventFilter(new Qt3DRender::Render::PlatformSurfaceFilter())
{
}
@@ -143,6 +144,23 @@ void QRenderSurfaceSelector::setSurface(QSurface *surface)
return;
d->m_surface = surface;
+ // The platform surface filter only deals with QObject
+ // We assume therefore that our surface is actually a QObject underneath
+ if (d->m_surface) {
+ switch (d->m_surface->surfaceClass()) {
+ case QSurface::Window:
+ d->m_surfaceEventFilter->setSurface(static_cast<QWindow *>(d->m_surface));
+ break;
+ case QSurface::Offscreen:
+ d->m_surfaceEventFilter->setSurface(static_cast<QOffscreenSurface *>(d->m_surface));
+ break;
+ default:
+ break;
+ }
+ } else {
+ QWindow *nullWindow = Q_NULLPTR;
+ d->m_surfaceEventFilter->setSurface(nullWindow);
+ }
emit surfaceChanged(surface);
}
@@ -177,6 +195,37 @@ void QRenderSurfaceSelector::setWindow(QWindow *window)
return;
d->m_surface = window;
+ d->m_surfaceEventFilter->setSurface(window);
+
+ if (window) {
+ QObject::connect(window, &QWindow::widthChanged, [=] (int width) {
+ if (d->m_changeArbiter != Q_NULLPTR) {
+ Qt3DCore::QScenePropertyChangePtr change(
+ new Qt3DCore::QScenePropertyChange(
+ Qt3DCore::NodeUpdated,
+ Qt3DCore::QSceneChange::Node,
+ id()));
+
+ change->setPropertyName("width");
+ change->setValue(QVariant::fromValue(width));
+ d->notifyObservers(change);
+ }
+ });
+ QObject::connect(window, &QWindow::heightChanged, [=] (int height) {
+ if (d->m_changeArbiter != Q_NULLPTR) {
+ Qt3DCore::QScenePropertyChangePtr change(
+ new Qt3DCore::QScenePropertyChange(
+ Qt3DCore::NodeUpdated,
+ Qt3DCore::QSceneChange::Node,
+ id()));
+
+ change->setPropertyName("height");
+ change->setValue(QVariant::fromValue(height));
+ d->notifyObservers(change);
+ }
+ });
+ }
+
emit windowChanged(window);
emit surfaceChanged(d->m_surface);
}