summaryrefslogtreecommitdiffstats
path: root/src/opengl/qgl_p.h
diff options
context:
space:
mode:
authorTom Cooksey <thomas.cooksey@nokia.com>2009-07-22 15:38:12 (GMT)
committerTom Cooksey <thomas.cooksey@nokia.com>2009-07-22 17:08:23 (GMT)
commit8768bcfa0000bc216a7f722cd82ac6b06b85a70d (patch)
treec5b75ce32eef1f92a1ba4909fbce5225afad532b /src/opengl/qgl_p.h
parentd1eca480acd39c478957e39243ff61b55c0113b4 (diff)
downloadQt-8768bcfa0000bc216a7f722cd82ac6b06b85a70d.zip
Qt-8768bcfa0000bc216a7f722cd82ac6b06b85a70d.tar.gz
Qt-8768bcfa0000bc216a7f722cd82ac6b06b85a70d.tar.bz2
Plug a texture leak when deleting QPixmaps without a current context
~QGLTexture wouldn't make the texture's context current if the current context was zero, meaning the texture would leak. This also means deleteBoundPixmap doesn't need to make the context currnet anymore (as it's only called from ~QGLTexture). Reviewed-By: Kim
Diffstat (limited to 'src/opengl/qgl_p.h')
-rw-r--r--src/opengl/qgl_p.h11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/opengl/qgl_p.h b/src/opengl/qgl_p.h
index 01385f0..2ee3e1d 100644
--- a/src/opengl/qgl_p.h
+++ b/src/opengl/qgl_p.h
@@ -402,7 +402,7 @@ extern Q_OPENGL_EXPORT QGLShareRegister* qgl_share_reg();
class QGLTexture {
public:
QGLTexture(QGLContext *ctx = 0, GLuint tx_id = 0, GLenum tx_target = GL_TEXTURE_2D,
- bool _clean = true, bool _yInverted = false)
+ bool _clean = false, bool _yInverted = false)
: context(ctx), id(tx_id), target(tx_target), clean(_clean), yInverted(_yInverted)
#if defined(Q_WS_X11)
, boundPixmap(0)
@@ -413,14 +413,19 @@ public:
if (clean) {
QGLContext *current = const_cast<QGLContext *>(QGLContext::currentContext());
QGLContext *ctx = const_cast<QGLContext *>(context);
- bool switch_context = current && current != ctx && !qgl_share_reg()->checkSharing(current, ctx);
+ Q_ASSERT(ctx);
+ bool switch_context = current != ctx && !qgl_share_reg()->checkSharing(current, ctx);
if (switch_context)
ctx->makeCurrent();
#if defined(Q_WS_X11)
+ // Although glXReleaseTexImage is a glX call, it must be called while there
+ // is a current context - the context the pixmap was bound to a texture in.
+ // Otherwise the release doesn't do anything and you get BadDrawable errors
+ // when you come to delete the context.
deleteBoundPixmap();
#endif
glDeleteTextures(1, &id);
- if (switch_context)
+ if (switch_context && current)
current->makeCurrent();
}
}