summaryrefslogtreecommitdiffstats
path: root/src/opengl
diff options
context:
space:
mode:
authorSamuel Rødal <samuel.rodal@digia.com>2013-05-28 15:43:05 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-05-29 08:15:13 +0200
commit72768c089a431eafcc816413c247c8b8d896fdce (patch)
treee399474d29a9f728eba5ad6ba647b82a08d03476 /src/opengl
parent81e981a704116ca7b1b619a2c1e8db837046d2cf (diff)
Fixed crashes in QGLTextureDestroyer.
QGLTextureDestroyer will try to make the context current on the GUI thread, regardless of whether it is owned by another thread. Use QOpenGLSharedResourceGuard instead which does the right thing and takes shared contexts into account. Task-number: QTBUG-31403 Change-Id: I1377f9284995a7ba5af32c85296eef152fc035c8 Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
Diffstat (limited to 'src/opengl')
-rw-r--r--src/opengl/qgl.cpp5
-rw-r--r--src/opengl/qgl_p.h21
2 files changed, 7 insertions, 19 deletions
diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp
index 72c6e035d9..3f496a4ffc 100644
--- a/src/opengl/qgl.cpp
+++ b/src/opengl/qgl.cpp
@@ -1579,10 +1579,7 @@ QGLContextPrivate::QGLContextPrivate(QGLContext *context)
{
group = new QGLContextGroup(context);
- if (qApp) {
- texture_destroyer = new QGLTextureDestroyer;
- texture_destroyer->moveToThread(qApp->thread());
- }
+ texture_destroyer = new QGLTextureDestroyer;
}
QGLContextPrivate::~QGLContextPrivate()
diff --git a/src/opengl/qgl_p.h b/src/opengl/qgl_p.h
index ff9baf8971..484c3ea2d9 100644
--- a/src/opengl/qgl_p.h
+++ b/src/opengl/qgl_p.h
@@ -335,25 +335,16 @@ QT_END_NAMESPACE
Q_DECLARE_METATYPE(GLuint)
QT_BEGIN_NAMESPACE
-class Q_OPENGL_EXPORT QGLTextureDestroyer : public QObject
+class Q_OPENGL_EXPORT QGLTextureDestroyer
{
- Q_OBJECT
public:
- QGLTextureDestroyer() : QObject() {
- connect(this, SIGNAL(freeTexture(QGLContext *, QPlatformPixmap *, quint32)),
- this, SLOT(freeTexture_slot(QGLContext *, QPlatformPixmap *, quint32)));
- }
- void emitFreeTexture(QGLContext *context, QPlatformPixmap *boundPixmap, GLuint id) {
- emit freeTexture(context, boundPixmap, id);
+ void emitFreeTexture(QGLContext *context, QPlatformPixmap *, GLuint id) {
+ if (context->contextHandle())
+ (new QOpenGLSharedResourceGuard(context->contextHandle(), id, freeTextureFunc))->free();
}
-Q_SIGNALS:
- void freeTexture(QGLContext *context, QPlatformPixmap *boundPixmap, quint32 id);
-
-private slots:
- void freeTexture_slot(QGLContext *context, QPlatformPixmap *boundPixmap, quint32 id) {
- Q_UNUSED(boundPixmap);
- QGLShareContextScope scope(context);
+private:
+ static void freeTextureFunc(QOpenGLFunctions *, GLuint id) {
glDeleteTextures(1, &id);
}
};