aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@digia.com>2014-06-04 15:05:00 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-06-06 12:25:43 +0200
commit2e4a40a6ccf466802ea6b3a1cbbd85869228e3fc (patch)
treea5fc7fc8564df7759155bfb07bf606c66e467e60 /src
parent0d3dc8c9e4ee07895c952d48faa55cf4f4b00b7b (diff)
Add support for multisampling in QQuickWidget
Use a multisampled fbo when the requested format has samples > 0. Resolving happens after each rendering of the scene. The blit to the temporary non-multisampled fbo could be avoided, in theory, by sending the fbo instead of the texture id down the stack and performing a blit directly to fbo #0. This however involves a number of potential issues, for example due to the non-sharability of FBOs between contexts. Hence it is left as a future exercise. Task-number: QTBUG-39187 Change-Id: Iae98b969bcbc3bb57e6d73288496f5428913c826 Reviewed-by: Paul Olav Tvete <paul.tvete@digia.com> Reviewed-by: Gunnar Sletta <gunnar.sletta@jollamobile.com>
Diffstat (limited to 'src')
-rw-r--r--src/quickwidgets/qquickwidget.cpp32
-rw-r--r--src/quickwidgets/qquickwidget_p.h1
2 files changed, 28 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);
}
/*!
diff --git a/src/quickwidgets/qquickwidget_p.h b/src/quickwidgets/qquickwidget_p.h
index d7652432b7..356c34e7f5 100644
--- a/src/quickwidgets/qquickwidget_p.h
+++ b/src/quickwidgets/qquickwidget_p.h
@@ -107,6 +107,7 @@ public:
QOffscreenSurface *offscreenSurface;
QQuickRenderControl *renderControl;
QOpenGLFramebufferObject *fbo;
+ QOpenGLFramebufferObject *resolvedFbo;
QOpenGLContext *context;
QQuickWidget::ResizeMode resizeMode;