Avoid multisampled contexts in QQuickWidget
authorLaszlo Agocs <laszlo.agocs@theqtcompany.com>
Wed, 29 Jul 2015 11:16:14 +0000 (13:16 +0200)
committerLaszlo Agocs <laszlo.agocs@theqtcompany.com>
Tue, 4 Aug 2015 13:13:58 +0000 (13:13 +0000)
Like with QOpenGLWidget, not requesting a multisampled context
unnecessarily avoids crashing with Mesa/Intel/EGL (f.ex. in the
qquickviewcomparison example when enabling multisampling).

Task-number: QTBUG-47509
Change-Id: Ia22110332f639a238cfb3b2c36916f65c00a7bbc
Reviewed-by: Andy Nichols <andy.nichols@theqtcompany.com>
src/quickwidgets/qquickwidget.cpp
src/quickwidgets/qquickwidget_p.h

index 26dd4e5b3a38744d96764c8548dbfee651615bd4..553dba37fa0b1713cb644f701e80f438cafabf1f 100644 (file)
@@ -143,6 +143,7 @@ QQuickWidgetPrivate::QQuickWidgetPrivate()
     , eventPending(false)
     , updatePending(false)
     , fakeHidden(false)
+    , requestedSamples(0)
 {
 }
 
@@ -772,7 +773,7 @@ void QQuickWidget::createFramebufferObject()
 
     context->makeCurrent(d->offscreenSurface);
 
-    int samples = d->offscreenWindow->requestedFormat().samples();
+    int samples = d->requestedSamples;
     if (!QOpenGLExtensions(context).hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample))
         samples = 0;
 
@@ -1248,6 +1249,14 @@ void QQuickWidget::setFormat(const QSurfaceFormat &format)
     newFormat.setDepthBufferSize(qMax(newFormat.depthBufferSize(), currentFormat.depthBufferSize()));
     newFormat.setStencilBufferSize(qMax(newFormat.stencilBufferSize(), currentFormat.stencilBufferSize()));
     newFormat.setAlphaBufferSize(qMax(newFormat.alphaBufferSize(), currentFormat.alphaBufferSize()));
+
+    // Do not include the sample count. Requesting a multisampled context is not necessary
+    // since we render into an FBO, never to an actual surface. What's more, attempting to
+    // create a pbuffer with a multisampled config crashes certain implementations. Just
+    // avoid the entire hassle, the result is the same.
+    d->requestedSamples = newFormat.samples();
+    newFormat.setSamples(0);
+
     d->offscreenWindow->setFormat(newFormat);
 }
 
index dd0da96c3d150ecf63d455c6cb49681860e5bdbb..9249fa138b22a71ab6e9f3c1b7fd8b41a0b6e34a 100644 (file)
@@ -115,6 +115,8 @@ public:
     bool eventPending;
     bool updatePending;
     bool fakeHidden;
+
+    int requestedSamples;
 };
 
 QT_END_NAMESPACE