diff options
author | Laszlo Agocs <laszlo.agocs@digia.com> | 2014-09-11 13:04:49 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@digia.com> | 2014-09-23 12:24:44 +0200 |
commit | edb6976120be9b8ad76b48ecd929f916dcdf216a (patch) | |
tree | 4fd54dde804b53ee01bc89ea44b2ae242e5059c5 /src/quickwidgets | |
parent | a76985eb05fcb7ecf9b22e5472d439585d4f2075 (diff) |
Recreate the fbo on screen change in QQuickWidget when needed
Move the rendering code out into a separate function since it is
now called from three places.
Like in QOpenGLWidget, the FBO may need to be recreated with a
different size in case the window is moved onto a screen with
a different device pixel ratio.
Change-Id: Iaaa42a06dab9e02710b0a7dafb0ea8c018b69ec2
Reviewed-by: Gunnar Sletta <gunnar@sletta.org>
Diffstat (limited to 'src/quickwidgets')
-rw-r--r-- | src/quickwidgets/qquickwidget.cpp | 62 | ||||
-rw-r--r-- | src/quickwidgets/qquickwidget_p.h | 1 |
2 files changed, 34 insertions, 29 deletions
diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp index 7df529c9d9..ef6c174b88 100644 --- a/src/quickwidgets/qquickwidget.cpp +++ b/src/quickwidgets/qquickwidget.cpp @@ -200,6 +200,26 @@ void QQuickWidgetPrivate::itemGeometryChanged(QQuickItem *resizeItem, const QRec QQuickItemChangeListener::itemGeometryChanged(resizeItem, newGeometry, oldGeometry); } +void QQuickWidgetPrivate::render(bool needsSync) +{ + context->makeCurrent(offscreenSurface); + + if (needsSync) { + renderControl->polishItems(); + renderControl->sync(); + } + + renderControl->render(); + context->functions()->glFlush(); + + if (resolvedFbo) { + QRect rect(QPoint(0, 0), fbo->size()); + QOpenGLFramebufferObject::blitFramebuffer(resolvedFbo, rect, fbo, rect); + } + + context->doneCurrent(); +} + void QQuickWidgetPrivate::renderSceneGraph() { Q_Q(QQuickWidget); @@ -215,19 +235,8 @@ void QQuickWidgetPrivate::renderSceneGraph() } Q_ASSERT(offscreenSurface); - context->makeCurrent(offscreenSurface); - renderControl->polishItems(); - renderControl->sync(); - renderControl->render(); - context->functions()->glFlush(); - - if (resolvedFbo) { - QRect rect(QPoint(0, 0), fbo->size()); - QOpenGLFramebufferObject::blitFramebuffer(resolvedFbo, rect, fbo, rect); - } - - context->doneCurrent(); - q->update(); + render(true); + q->update(); // schedule composition } QImage QQuickWidgetPrivate::grabFramebuffer() @@ -942,22 +951,7 @@ void QQuickWidget::resizeEvent(QResizeEvent *e) return; } - context->makeCurrent(d->offscreenSurface); - - if (needsSync) { - d->renderControl->polishItems(); - d->renderControl->sync(); - } - - d->renderControl->render(); - context->functions()->glFlush(); - - if (d->resolvedFbo) { - QRect rect(QPoint(0, 0), d->fbo->size()); - QOpenGLFramebufferObject::blitFramebuffer(d->resolvedFbo, rect, d->fbo, rect); - } - - context->doneCurrent(); + d->render(needsSync); } /*! \reimp */ @@ -1104,6 +1098,16 @@ bool QQuickWidget::event(QEvent *e) case QEvent::WindowChangeInternal: d->handleWindowChange(); break; + + case QEvent::ScreenChangeInternal: + if (d->fbo) { + // This will check the size taking the devicePixelRatio into account + // and recreate if needed. + createFramebufferObject(); + d->render(true); + } + break; + default: break; } diff --git a/src/quickwidgets/qquickwidget_p.h b/src/quickwidgets/qquickwidget_p.h index 2289b18d72..2ff9601f77 100644 --- a/src/quickwidgets/qquickwidget_p.h +++ b/src/quickwidgets/qquickwidget_p.h @@ -75,6 +75,7 @@ public: void updateSize(); void updateFrambufferObjectSize(); void setRootObject(QObject *); + void render(bool needsSync); void renderSceneGraph(); void createContext(); void destroyContext(); |