summaryrefslogtreecommitdiffstats
path: root/src/platformsupport
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@theqtcompany.com>2015-11-12 17:26:21 +0100
committerLaszlo Agocs <laszlo.agocs@theqtcompany.com>2015-11-23 08:31:53 +0000
commit5a48d1d164ba507469ee1a8a682a3c194d733890 (patch)
treea2ccfb485a17b63fccf777cb81bb755f7361f631 /src/platformsupport
parentfe4ab7edce3863a23d5871634d93f0b855aa93ac (diff)
Do not leak textures from the backing stores
Neither the default nor the eglfs-specific backingstore release the OpenGL textures that are in use when render-to-texture widgets are involved. The result can be fatal on embedded devices that run out of GPU memory at after showing and closing dialogs and popups a certain number of times. Task-number: QTBUG-49363 Task-number: QTBUG-49399 Change-Id: Ia7471b037f147bcca0a4f1db5808ca348e230547 Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com> Reviewed-by: Andy Nichols <andy.nichols@theqtcompany.com>
Diffstat (limited to 'src/platformsupport')
-rw-r--r--src/platformsupport/platformcompositor/qopenglcompositorbackingstore.cpp11
-rw-r--r--src/platformsupport/platformcompositor/qopenglcompositorbackingstore_p.h1
2 files changed, 12 insertions, 0 deletions
diff --git a/src/platformsupport/platformcompositor/qopenglcompositorbackingstore.cpp b/src/platformsupport/platformcompositor/qopenglcompositorbackingstore.cpp
index 8ce1ed2d2b..55f8ea160c 100644
--- a/src/platformsupport/platformcompositor/qopenglcompositorbackingstore.cpp
+++ b/src/platformsupport/platformcompositor/qopenglcompositorbackingstore.cpp
@@ -67,6 +67,7 @@ QOpenGLCompositorBackingStore::QOpenGLCompositorBackingStore(QWindow *window)
: QPlatformBackingStore(window),
m_window(window),
m_bsTexture(0),
+ m_bsTextureContext(0),
m_textures(new QPlatformTextureList),
m_lockedWidgetTextures(0)
{
@@ -74,6 +75,14 @@ QOpenGLCompositorBackingStore::QOpenGLCompositorBackingStore(QWindow *window)
QOpenGLCompositorBackingStore::~QOpenGLCompositorBackingStore()
{
+ if (m_bsTexture) {
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ if (ctx && m_bsTextureContext && ctx->shareGroup() == m_bsTextureContext->shareGroup())
+ glDeleteTextures(1, &m_bsTexture);
+ else
+ qWarning("QOpenGLCompositorBackingStore: Texture is not valid in the current context");
+ }
+
delete m_textures;
}
@@ -85,6 +94,8 @@ QPaintDevice *QOpenGLCompositorBackingStore::paintDevice()
void QOpenGLCompositorBackingStore::updateTexture()
{
if (!m_bsTexture) {
+ m_bsTextureContext = QOpenGLContext::currentContext();
+ Q_ASSERT(m_bsTextureContext);
glGenTextures(1, &m_bsTexture);
glBindTexture(GL_TEXTURE_2D, m_bsTexture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
diff --git a/src/platformsupport/platformcompositor/qopenglcompositorbackingstore_p.h b/src/platformsupport/platformcompositor/qopenglcompositorbackingstore_p.h
index 49d8bfd6e7..bd843e8bd9 100644
--- a/src/platformsupport/platformcompositor/qopenglcompositorbackingstore_p.h
+++ b/src/platformsupport/platformcompositor/qopenglcompositorbackingstore_p.h
@@ -83,6 +83,7 @@ private:
QImage m_image;
QRegion m_dirty;
uint m_bsTexture;
+ QOpenGLContext *m_bsTextureContext;
QPlatformTextureList *m_textures;
QPlatformTextureList *m_lockedWidgetTextures;
};