diff options
Diffstat (limited to 'src/quickwidgets/qquickwidget.cpp')
-rw-r--r-- | src/quickwidgets/qquickwidget.cpp | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp index 30c35c55dd..439b039266 100644 --- a/src/quickwidgets/qquickwidget.cpp +++ b/src/quickwidgets/qquickwidget.cpp @@ -143,6 +143,7 @@ QQuickWidgetPrivate::QQuickWidgetPrivate() , offscreenSurface(0) , renderControl(0) , fbo(0) + , resolvedFbo(0) , context(0) , resizeMode(QQuickWidget::SizeViewToRootObject) , initialSize(0,0) @@ -163,6 +164,7 @@ QQuickWidgetPrivate::~QQuickWidgetPrivate() Q_ASSERT(!context || (QOpenGLContext::currentContext() == context && context->surface() == offscreenSurface)); delete offscreenWindow; delete renderControl; + delete resolvedFbo; delete fbo; destroyContext(); @@ -226,6 +228,12 @@ void QQuickWidgetPrivate::renderSceneGraph() renderControl->sync(); renderControl->render(); glFlush(); + + if (resolvedFbo) { + QRect rect(QPoint(0, 0), fbo->size()); + QOpenGLFramebufferObject::blitFramebuffer(resolvedFbo, rect, fbo, rect); + } + context->doneCurrent(); q->update(); } @@ -669,11 +677,23 @@ void QQuickWidget::createFramebufferObject() context->makeCurrent(d->offscreenSurface); + int samples = d->offscreenWindow->requestedFormat().samples(); + if (!QOpenGLExtensions(context).hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample)) + samples = 0; + + QOpenGLFramebufferObjectFormat format; + format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); + format.setSamples(samples); + + QSize fboSize = size() * window()->devicePixelRatio(); + delete d->fbo; - d->fbo = new QOpenGLFramebufferObject(size() * window()->devicePixelRatio()); - d->fbo->setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); + d->fbo = new QOpenGLFramebufferObject(fboSize, format); d->offscreenWindow->setRenderTarget(d->fbo); + if (samples > 0) + d->resolvedFbo = new QOpenGLFramebufferObject(fboSize); + // Sanity check: The window must not have an underlying platform window. // Having one would mean create() was called and platforms that only support // a single native window were in trouble. @@ -683,9 +703,10 @@ void QQuickWidget::createFramebufferObject() void QQuickWidget::destroyFramebufferObject() { Q_D(QQuickWidget); - if (d->fbo) - delete d->fbo; + delete d->fbo; d->fbo = 0; + delete d->resolvedFbo; + d->resolvedFbo = 0; } QQuickWidget::ResizeMode QQuickWidget::resizeMode() const @@ -770,7 +791,8 @@ GLuint QQuickWidgetPrivate::textureId() const << "Consider setting Qt::AA_DontCreateNativeWidgetSiblings"; return 0; } - return fbo ? fbo->texture() : 0; + return resolvedFbo ? resolvedFbo->texture() + : (fbo ? fbo->texture() : 0); } /*! |