From 7ff2cc9c1f037fa9159bc24d8a47778ebac2390a Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Fri, 22 Jan 2016 11:31:22 +0100 Subject: 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 --- src/render/framegraph/qrendersurfaceselector.cpp | 49 ++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'src/render/framegraph/qrendersurfaceselector.cpp') 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(d->m_surface)); + break; + case QSurface::Offscreen: + d->m_surfaceEventFilter->setSurface(static_cast(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); } -- cgit v1.2.3