summaryrefslogtreecommitdiffstats
path: root/src/gui/opengl/qopenglfunctions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/opengl/qopenglfunctions.cpp')
-rw-r--r--src/gui/opengl/qopenglfunctions.cpp32
1 files changed, 31 insertions, 1 deletions
diff --git a/src/gui/opengl/qopenglfunctions.cpp b/src/gui/opengl/qopenglfunctions.cpp
index 587995515d..c60532b90b 100644
--- a/src/gui/opengl/qopenglfunctions.cpp
+++ b/src/gui/opengl/qopenglfunctions.cpp
@@ -3538,7 +3538,8 @@ QOpenGLFunctionsPrivate::QOpenGLFunctionsPrivate(QOpenGLContext *)
}
QOpenGLExtensionsPrivate::QOpenGLExtensionsPrivate(QOpenGLContext *ctx)
- : QOpenGLFunctionsPrivate(ctx)
+ : QOpenGLFunctionsPrivate(ctx),
+ flushVendorChecked(false)
{
MapBuffer = qopenglfResolveMapBuffer;
MapBufferRange = qopenglfResolveMapBufferRange;
@@ -3554,4 +3555,33 @@ QOpenGLES3Helper *QOpenGLExtensions::gles3Helper()
return qgles3Helper();
}
+void QOpenGLExtensions::flushShared()
+{
+ Q_D(QOpenGLExtensions);
+
+ if (!d->flushVendorChecked) {
+ d->flushVendorChecked = true;
+ // It is not quite clear if glFlush() is sufficient to synchronize access to
+ // resources between sharing contexts in the same thread. On most platforms this
+ // is enough (e.g. iOS explicitly documents it), while certain drivers only work
+ // properly when doing glFinish().
+ d->flushIsSufficientToSyncContexts = false; // default to false, not guaranteed by the spec
+ const char *vendor = (const char *) glGetString(GL_VENDOR);
+ if (vendor) {
+ static const char *flushEnough[] = { "Apple", "ATI", "Intel", "NVIDIA" };
+ for (size_t i = 0; i < sizeof(flushEnough) / sizeof(const char *); ++i) {
+ if (strstr(vendor, flushEnough[i])) {
+ d->flushIsSufficientToSyncContexts = true;
+ break;
+ }
+ }
+ }
+ }
+
+ if (d->flushIsSufficientToSyncContexts)
+ glFlush();
+ else
+ glFinish();
+}
+
QT_END_NAMESPACE