summaryrefslogtreecommitdiffstats
path: root/src/opengl/qgl.cpp
diff options
context:
space:
mode:
authorRhys Weatherley <rhys.weatherley@nokia.com>2009-09-14 02:30:44 (GMT)
committerRhys Weatherley <rhys.weatherley@nokia.com>2009-09-14 05:06:06 (GMT)
commit9e3fb515207f8d80fe87b6e34e78d3d201b0b438 (patch)
treee89933d4ba8f65f5099e1beaab33a514c247e2cd /src/opengl/qgl.cpp
parent732660e89af34c76f6aa8a46ce8507dfd5fad077 (diff)
downloadQt-9e3fb515207f8d80fe87b6e34e78d3d201b0b438.zip
Qt-9e3fb515207f8d80fe87b6e34e78d3d201b0b438.tar.gz
Qt-9e3fb515207f8d80fe87b6e34e78d3d201b0b438.tar.bz2
Performance: reduce TLS overhead of QGLContext::currentContext()
The handling for the current QGLContext was looking up the same TLS data several times per call (hasLocalData() and localData() calls particularly). This change also refactors the code a little so that the setting of the QGLContext within makeCurrent() and doneCurrent() is in one location in the code instead of six (one per platform). Reviewed-by: Michael Brasser Reviewed-by: Sarah Smith
Diffstat (limited to 'src/opengl/qgl.cpp')
-rw-r--r--src/opengl/qgl.cpp27
1 files changed, 24 insertions, 3 deletions
diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp
index c2b747a..1a0957c 100644
--- a/src/opengl/qgl.cpp
+++ b/src/opengl/qgl.cpp
@@ -103,7 +103,11 @@ QT_BEGIN_NAMESPACE
QGLExtensionFuncs QGLContextPrivate::qt_extensionFuncs;
#endif
-QThreadStorage<QGLThreadContext *> qgl_context_storage;
+struct QGLThreadContext {
+ QGLContext *context;
+};
+
+static QThreadStorage<QGLThreadContext *> qgl_context_storage;
Q_GLOBAL_STATIC(QGLFormat, qgl_default_format)
@@ -2939,11 +2943,28 @@ void QGLContext::setInitialized(bool on)
const QGLContext* QGLContext::currentContext()
{
- if (qgl_context_storage.hasLocalData())
- return qgl_context_storage.localData()->context;
+ QGLThreadContext *threadContext = qgl_context_storage.localData();
+ if (threadContext)
+ return threadContext->context;
return 0;
}
+void QGLContextPrivate::setCurrentContext(QGLContext *context)
+{
+ QGLThreadContext *threadContext = qgl_context_storage.localData();
+ if (!threadContext) {
+ if (!QThread::currentThread()) {
+ // We don't have a current QThread, so just set the static.
+ QGLContext::currentCtx = context;
+ return;
+ }
+ threadContext = new QGLThreadContext;
+ qgl_context_storage.setLocalData(threadContext);
+ }
+ threadContext->context = context;
+ QGLContext::currentCtx = context; // XXX: backwards-compat, not thread-safe
+}
+
/*!
\fn bool QGLContext::chooseContext(const QGLContext* shareContext = 0)