path: root/tests
diff options
authorAlexandru Croitor <>2016-09-30 18:36:15 +0200
committerAlexandru Croitor <>2016-10-13 15:38:08 +0000
commitcd1d11414021288729cd85a32a7a1160756aeeab (patch)
treeff319ec1e5505036b9f11e3b397ec6087b9e3dfe /tests
parent51767affb380eea5961637f07a2e881b93b6fea5 (diff)
Unset qgl_current_fbo when the default FBO is bound
Previously when a new QOpenGLFramebufferObject was bound, the QOpenGLContextPrivate::qgl_current_fbo member was also updated to point to this new object. But if a user called QOpenGLFramebufferObject::bindDefault(), qgl_current_fbo was not unset, meaning that if the FBO object would be deleted at some point, qgl_current_fbo would be a dangling pointer. This patch makes sure to clear the value of qgl_current_fbo when bindDefault() is called. It is cleared, and not set to point to another object because the default platform OpenGL FBO is not backed by a QOpenGLFramebufferObject. Task-number: QTBUG-56296 Change-Id: I68b53d8b446660accdf5841df3d168ee2f133a90 Reviewed-by: Simon Hausmann <> Reviewed-by: Laszlo Agocs <>
Diffstat (limited to 'tests')
1 files changed, 28 insertions, 0 deletions
diff --git a/tests/auto/gui/qopengl/tst_qopengl.cpp b/tests/auto/gui/qopengl/tst_qopengl.cpp
index e2ad502a52..00b5da92a8 100644
--- a/tests/auto/gui/qopengl/tst_qopengl.cpp
+++ b/tests/auto/gui/qopengl/tst_qopengl.cpp
@@ -114,6 +114,7 @@ private slots:
void vaoCreate();
void bufferCreate();
void bufferMapRange();
+ void defaultQGLCurrentBuffer();
struct SharedResourceTracker
@@ -1525,6 +1526,33 @@ void tst_QOpenGL::bufferMapRange()
+void tst_QOpenGL::defaultQGLCurrentBuffer()
+ QScopedPointer<QSurface> surface(createSurface(QSurface::Window));
+ QScopedPointer<QOpenGLContext> ctx(new QOpenGLContext);
+ ctx->create();
+ ctx->makeCurrent(;
+ // Bind default FBO on the current context, and record what's the current QGL FBO. It should
+ // be Q_NULLPTR because the default platform OpenGL FBO is not backed by a
+ // QOpenGLFramebufferObject.
+ QOpenGLFramebufferObject::bindDefault();
+ QOpenGLFramebufferObject *defaultQFBO = QOpenGLContextPrivate::get(>qgl_current_fbo;
+ // Create new FBO, bind it, and see that the QGL FBO points to the newly created FBO.
+ QScopedPointer<QOpenGLFramebufferObject> obj(new QOpenGLFramebufferObject(128, 128));
+ obj->bind();
+ QOpenGLFramebufferObject *customQFBO = QOpenGLContextPrivate::get(>qgl_current_fbo;
+ QVERIFY(defaultQFBO != customQFBO);
+ // Bind the default FBO, and check that the QGL FBO points to the original FBO object.
+ QOpenGLFramebufferObject::bindDefault();
+ QOpenGLFramebufferObject *finalQFBO = QOpenGLContextPrivate::get(>qgl_current_fbo;
+ QCOMPARE(defaultQFBO, finalQFBO);
+ ctx->doneCurrent();
void tst_QOpenGL::nullTextureInitializtion()
QScopedPointer<QSurface> surface(createSurface(QSurface::Window));