summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTrond Kjernåsen <trond.kjernasen@nokia.com>2010-07-08 15:31:16 (GMT)
committerTrond Kjernåsen <trond.kjernasen@nokia.com>2010-07-08 15:35:47 (GMT)
commite02d97c50cee8bdc662bb1183ed01aa0dac53f01 (patch)
tree8a03912f4e3db9cbd512d77c1180bba9ebc0e996 /src
parent2d691f6e743cad6efb676854ac65218a1cbe5e5f (diff)
downloadQt-e02d97c50cee8bdc662bb1183ed01aa0dac53f01.zip
Qt-e02d97c50cee8bdc662bb1183ed01aa0dac53f01.tar.gz
Qt-e02d97c50cee8bdc662bb1183ed01aa0dac53f01.tar.bz2
Track the GL DCs we use across different threads under Windows.
A DC returned by GetDC() is only valid within the context of the calling thread, so we need to track which tread a DC belongs to. Reviewed-by: Kim
Diffstat (limited to 'src')
-rw-r--r--src/opengl/qgl.cpp1
-rw-r--r--src/opengl/qgl_p.h1
-rw-r--r--src/opengl/qgl_win.cpp5
3 files changed, 6 insertions, 1 deletions
diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp
index 3f2af9d..05dae60 100644
--- a/src/opengl/qgl.cpp
+++ b/src/opengl/qgl.cpp
@@ -1655,6 +1655,7 @@ void QGLContextPrivate::init(QPaintDevice *dev, const QGLFormat &format)
#if defined(Q_WS_WIN)
dc = 0;
win = 0;
+ threadId = 0;
pixelFormatId = 0;
cmap = 0;
hbitmap = 0;
diff --git a/src/opengl/qgl_p.h b/src/opengl/qgl_p.h
index eca4a29..dfbc926 100644
--- a/src/opengl/qgl_p.h
+++ b/src/opengl/qgl_p.h
@@ -347,6 +347,7 @@ public:
QGLCmap* cmap;
HBITMAP hbitmap;
HDC hbitmap_hdc;
+ Qt::HANDLE threadId;
#endif
#ifndef QT_NO_EGL
uint ownsEglContext : 1;
diff --git a/src/opengl/qgl_win.cpp b/src/opengl/qgl_win.cpp
index 52988b6..3f13ac4 100644
--- a/src/opengl/qgl_win.cpp
+++ b/src/opengl/qgl_win.cpp
@@ -1261,6 +1261,7 @@ void QGLContext::reset()
}
d->dc = 0;
d->win = 0;
+ d->threadId = 0;
d->pixelFormatId = 0;
d->sharing = false;
d->valid = false;
@@ -1283,8 +1284,9 @@ void QGLContext::makeCurrent()
if (d->rc == wglGetCurrentContext() || !d->valid) // already current
return;
- if (d->win && !d->dc) {
+ if (d->win && (!d->dc || d->threadId != QThread::currentThreadId())) {
d->dc = GetDC(d->win);
+ d->threadId = QThread::currentThreadId();
if (!d->dc) {
qwglError("QGLContext::makeCurrent()", "GetDC()");
return;
@@ -1322,6 +1324,7 @@ void QGLContext::doneCurrent()
if (d->win && d->dc) {
ReleaseDC(d->win, d->dc);
d->dc = 0;
+ d->threadId = 0;
}
}