diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2016-01-22 11:31:22 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2016-03-17 11:27:53 +0000 |
commit | 7ff2cc9c1f037fa9159bc24d8a47778ebac2390a (patch) | |
tree | d96af4c0415662906c1c6fa5a64601b539cb106a /src/render/framegraph/qrendersurfaceselector.cpp | |
parent | c01bc22c287e58186a285b3f8507711fd982fd05 (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.cpp | 49 |
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); } |