diff options
author | Trond Kjernaasen <trond@trolltech.com> | 2009-09-28 14:52:04 (GMT) |
---|---|---|
committer | Trond Kjernaasen <trond@trolltech.com> | 2009-09-28 15:03:33 (GMT) |
commit | 14a896cf6b8b67a8d83a6204737249afa9ecd220 (patch) | |
tree | fc1989faa3e38afecb9108520f748eef5d694466 /src | |
parent | 00ee879628e392ad46daf9cabe7c760c09afb6b7 (diff) | |
download | Qt-14a896cf6b8b67a8d83a6204737249afa9ecd220.zip Qt-14a896cf6b8b67a8d83a6204737249afa9ecd220.tar.gz Qt-14a896cf6b8b67a8d83a6204737249afa9ecd220.tar.bz2 |
Fixed a crash in the boxes demo when using -graphicssystem opengl.
Several problems:
1. The demo leaked the scene contents, which caused cleanup problems.
2. The QGLContext::currentContext() could be changed behind Qt's back
under Windows (the temp contexts never reset the current context).
3. QGLFormat::openGLVersionFlags() function would return uninitialized
flags if the QGLWidget constructor happened to call
qt_gl_preferGL2Engine().
Reviewed-by: Kim
Diffstat (limited to 'src')
-rw-r--r-- | src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp | 2 | ||||
-rw-r--r-- | src/opengl/qgl.cpp | 2 | ||||
-rw-r--r-- | src/opengl/qgl_win.cpp | 6 |
3 files changed, 8 insertions, 2 deletions
diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp index 119c89d..7e45fd9 100644 --- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp +++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp @@ -129,7 +129,7 @@ public Q_SLOTS: // since the context holding the texture is shared, and // about to be destroyed, we have to transfer ownership // of the texture to one of the share contexts - ctx = const_cast<QGLContext *>(shares.at(0)); + ctx = const_cast<QGLContext *>((ctx == shares.at(0)) ? shares.at(1) : shares.at(0)); } } } diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp index 97a4a73..0ad6772 100644 --- a/src/opengl/qgl.cpp +++ b/src/opengl/qgl.cpp @@ -1245,11 +1245,11 @@ QGLFormat::OpenGLVersionFlags QGLFormat::openGLVersionFlags() if (cachedDefault) { return defaultVersionFlags; } else { - cachedDefault = true; if (!hasOpenGL()) return defaultVersionFlags; dummy = new QGLWidget; dummy->makeCurrent(); // glGetString() needs a current context + cachedDefault = true; } } diff --git a/src/opengl/qgl_win.cpp b/src/opengl/qgl_win.cpp index 2f9e225..5b5820a 100644 --- a/src/opengl/qgl_win.cpp +++ b/src/opengl/qgl_win.cpp @@ -660,6 +660,8 @@ public: int dmy_pf = ChoosePixelFormat(dmy_pdc, &dmy_pfd); SetPixelFormat(dmy_pdc, dmy_pf, &dmy_pfd); dmy_rc = wglCreateContext(dmy_pdc); + old_dc = wglGetCurrentDC(); + old_context = wglGetCurrentContext(); wglMakeCurrent(dmy_pdc, dmy_rc); } @@ -668,10 +670,14 @@ public: wglDeleteContext(dmy_rc); ReleaseDC(dmy_id, dmy_pdc); DestroyWindow(dmy_id); + if (old_dc && old_context) + wglMakeCurrent(old_dc, old_context); } HDC dmy_pdc; HGLRC dmy_rc; + HDC old_dc; + HGLRC old_context; WId dmy_id; }; |