diff options
author | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2014-10-09 18:13:54 +0200 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2014-10-09 18:14:56 +0200 |
commit | e1dfb78667bd7e8dc418e12a9669404adea7e2cb (patch) | |
tree | 16f40a9852281a63c1f98af21c680bddedaa5258 /src/quickwidgets | |
parent | 28949c9699014b4f7abba396c28dea207b29821e (diff) | |
parent | 26bbd784d67d151eee531e5ff57977a5353549f5 (diff) |
Merge remote-tracking branch 'origin/5.4' into dev
Conflicts:
src/quick/items/context2d/qquickcanvasitem.cpp
src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
src/quick/scenegraph/coreapi/qsgrenderer.cpp
src/quick/scenegraph/qsgadaptationlayer.cpp
src/quick/scenegraph/qsgrenderloop.cpp
src/quick/scenegraph/qsgthreadedrenderloop.cpp
src/quick/scenegraph/qsgwindowsrenderloop.cpp
src/quick/scenegraph/util/qsgatlastexture.cpp
src/quick/scenegraph/util/qsgtexture.cpp
src/quick/util/qquickprofiler_p.h
Change-Id: Ie274c3baf72a8a0711c87d67238d68e2b2887429
Diffstat (limited to 'src/quickwidgets')
-rw-r--r-- | src/quickwidgets/qquickwidget.cpp | 81 | ||||
-rw-r--r-- | src/quickwidgets/qquickwidget_p.h | 1 |
2 files changed, 46 insertions, 36 deletions
diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp index 8d93bf389b..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() @@ -294,6 +303,11 @@ QImage QQuickWidgetPrivate::grabFramebuffer() some of the benefits of threaded rendering, for example \l Animator classes and vsync driven animations, will not be available. + \note Avoid calling winId() on a QQuickWidget. This function triggers the creation of + a native window, resulting in reduced performance and possibly rendering glitches. The + entire purpose of QQuickWidget is to render Quick scenes without a separate native + window, hence making it a native widget should always be avoided. + \section1 Limitations Putting other widgets underneath and making the QQuickWidget transparent will not lead @@ -937,29 +951,14 @@ 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 */ void QQuickWidget::keyPressEvent(QKeyEvent *e) { Q_D(QQuickWidget); - Q_QUICK_PROFILE(addEvent<QQuickProfiler::Key>()); + Q_QUICK_INPUT_PROFILE(addEvent<QQuickProfiler::Key>()); QCoreApplication::sendEvent(d->offscreenWindow, e); } @@ -968,7 +967,7 @@ void QQuickWidget::keyPressEvent(QKeyEvent *e) void QQuickWidget::keyReleaseEvent(QKeyEvent *e) { Q_D(QQuickWidget); - Q_QUICK_PROFILE(addEvent<QQuickProfiler::Key>()); + Q_QUICK_INPUT_PROFILE(addEvent<QQuickProfiler::Key>()); QCoreApplication::sendEvent(d->offscreenWindow, e); } @@ -977,7 +976,7 @@ void QQuickWidget::keyReleaseEvent(QKeyEvent *e) void QQuickWidget::mouseMoveEvent(QMouseEvent *e) { Q_D(QQuickWidget); - Q_QUICK_PROFILE(addEvent<QQuickProfiler::Mouse>()); + Q_QUICK_INPUT_PROFILE(addEvent<QQuickProfiler::Mouse>()); // Use the constructor taking localPos and screenPos. That puts localPos into the // event's localPos and windowPos, and screenPos into the event's screenPos. This way @@ -992,7 +991,7 @@ void QQuickWidget::mouseMoveEvent(QMouseEvent *e) void QQuickWidget::mouseDoubleClickEvent(QMouseEvent *e) { Q_D(QQuickWidget); - Q_QUICK_PROFILE(addEvent<QQuickProfiler::Mouse>()); + Q_QUICK_INPUT_PROFILE(addEvent<QQuickProfiler::Mouse>()); // As the second mouse press is suppressed in widget windows we emulate it here for QML. // See QTBUG-25831 @@ -1025,7 +1024,7 @@ void QQuickWidget::hideEvent(QHideEvent *) void QQuickWidget::mousePressEvent(QMouseEvent *e) { Q_D(QQuickWidget); - Q_QUICK_PROFILE(addEvent<QQuickProfiler::Mouse>()); + Q_QUICK_INPUT_PROFILE(addEvent<QQuickProfiler::Mouse>()); QMouseEvent mappedEvent(e->type(), e->localPos(), e->screenPos(), e->button(), e->buttons(), e->modifiers()); QCoreApplication::sendEvent(d->offscreenWindow, &mappedEvent); @@ -1036,7 +1035,7 @@ void QQuickWidget::mousePressEvent(QMouseEvent *e) void QQuickWidget::mouseReleaseEvent(QMouseEvent *e) { Q_D(QQuickWidget); - Q_QUICK_PROFILE(addEvent<QQuickProfiler::Mouse>()); + Q_QUICK_INPUT_PROFILE(addEvent<QQuickProfiler::Mouse>()); QMouseEvent mappedEvent(e->type(), e->localPos(), e->screenPos(), e->button(), e->buttons(), e->modifiers()); QCoreApplication::sendEvent(d->offscreenWindow, &mappedEvent); @@ -1048,7 +1047,7 @@ void QQuickWidget::mouseReleaseEvent(QMouseEvent *e) void QQuickWidget::wheelEvent(QWheelEvent *e) { Q_D(QQuickWidget); - Q_QUICK_PROFILE(addEvent<QQuickProfiler::Mouse>()); + Q_QUICK_INPUT_PROFILE(addEvent<QQuickProfiler::Mouse>()); // Wheel events only have local and global positions, no need to map. QCoreApplication::sendEvent(d->offscreenWindow, e); @@ -1099,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(); |