path: root/src/widgets
diff options
authorLaszlo Agocs <>2015-03-19 14:49:54 +0100
committerLaszlo Agocs <>2015-03-23 09:26:42 +0000
commitcafd54d34b0e4e0fb9d99650c7c6ffd1969811a1 (patch)
tree116c309bfcd0ab6c2b54730fc5fd90e24a992adf /src/widgets
parent09f631d78710420d25fa0765772bef3ef37e78cb (diff)
Use glFinish() in QOpenGLWidget unless glFlush() is known to be enough
The driver used on the Odroid-XU3 does not like doing just glFlush() before accessing the texture in another context. There is no guarantee that glFlush() is enough to sync access to resources between contexts, so start using glFinish() as the default, except on common desktop hw + iOS where flush is enough and presumably more efficient. To unify the code pathes, remove the separate flushes and do it only once, before the backingstore compositor indicates that it is about to access the textures. This should improve performance a bit, esp. when doing multisampling since we flush only once then. A helper function is added to the internal QOpenGLExtensions because it is highly likely that QQuickWidget will need the same. Task-number: QTBUG-45106 Change-Id: Ifb405c5723f29f2f6c04df8e15fb70280681755e Reviewed-by: Giuseppe D'Angelo <>
Diffstat (limited to 'src/widgets')
1 files changed, 3 insertions, 3 deletions
diff --git a/src/widgets/kernel/qopenglwidget.cpp b/src/widgets/kernel/qopenglwidget.cpp
index 3b33894627..8faa9f8681 100644
--- a/src/widgets/kernel/qopenglwidget.cpp
+++ b/src/widgets/kernel/qopenglwidget.cpp
@@ -691,7 +691,7 @@ void QOpenGLWidgetPrivate::beginCompose()
if (flushPending) {
flushPending = false;
- context->functions()->glFlush();
+ static_cast<QOpenGLExtensions *>(context->functions())->flushShared();
hasBeenComposed = true;
emit q->aboutToCompose();
@@ -768,7 +768,7 @@ void QOpenGLWidgetPrivate::resolveSamples()
QRect rect(QPoint(0, 0), fbo->size());
QOpenGLFramebufferObject::blitFramebuffer(resolvedFbo, rect, fbo, rect);
- QOpenGLContext::currentContext()->functions()->glFlush();
+ flushPending = true;
@@ -779,7 +779,7 @@ void QOpenGLWidgetPrivate::invokeUserPaint()
f->glViewport(0, 0, q->width() * q->devicePixelRatio(), q->height() * q->devicePixelRatio());
- f->glFlush();
+ flushPending = true;
void QOpenGLWidgetPrivate::render()