diff options
author | Jamie Gennis <jgennis@google.com> | 2012-05-02 13:10:56 -0700 |
---|---|---|
committer | Jamie Gennis <jgennis@google.com> | 2012-05-02 13:10:56 -0700 |
commit | 5c8a608497f12ecea4d6e8f1f286baf57c161ea3 (patch) | |
tree | 88617a8826e3ef9fb5a53cd59755b45e59d71f71 /libs/gui/SurfaceTexture.cpp | |
parent | 06e51a0aaf76fe53cef20c3345cf1ebda2b3461e (diff) | |
download | frameworks_native-5c8a608497f12ecea4d6e8f1f286baf57c161ea3.zip frameworks_native-5c8a608497f12ecea4d6e8f1f286baf57c161ea3.tar.gz frameworks_native-5c8a608497f12ecea4d6e8f1f286baf57c161ea3.tar.bz2 |
SurfaceTexture: fix a memory leak
This change fixes a memory leak.
Bug: 6414806
Change-Id: I43536689b4219a042749aec2096a1d5c4e664ae3
Diffstat (limited to 'libs/gui/SurfaceTexture.cpp')
-rw-r--r-- | libs/gui/SurfaceTexture.cpp | 32 |
1 files changed, 13 insertions, 19 deletions
diff --git a/libs/gui/SurfaceTexture.cpp b/libs/gui/SurfaceTexture.cpp index c103e14..a6ca085 100644 --- a/libs/gui/SurfaceTexture.cpp +++ b/libs/gui/SurfaceTexture.cpp @@ -352,7 +352,7 @@ status_t SurfaceTexture::detachFromContext() { // new EGLDisplay). for (int i =0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) { EGLImageKHR img = mEGLSlots[i].mEglImage; - if (img != EGL_NO_IMAGE_KHR && i != mCurrentTexture) { + if (img != EGL_NO_IMAGE_KHR) { eglDestroyImageKHR(mEglDisplay, img); mEGLSlots[i].mEglImage = EGL_NO_IMAGE_KHR; } @@ -399,21 +399,12 @@ status_t SurfaceTexture::attachToContext(GLuint tex) { glBindTexture(mTexTarget, tex); if (mCurrentTextureBuf != NULL) { - // If the current buffer is no longer associated with a slot, then it - // doesn't have an EGLImage. In that case we create one now, but we also - // destroy it once we've used it to attach the buffer to the OpenGL ES - // texture. - bool imageNeedsDestroy = false; - EGLImageKHR image = EGL_NO_IMAGE_KHR; - if (mCurrentTexture != BufferQueue::INVALID_BUFFER_SLOT) { - image = mEGLSlots[mCurrentTexture].mEglImage; - imageNeedsDestroy = false; - } else { - image = createImage(dpy, mCurrentTextureBuf); - if (image == EGL_NO_IMAGE_KHR) { - return UNKNOWN_ERROR; - } - imageNeedsDestroy = true; + // The EGLImageKHR that was associated with the slot was destroyed when + // the SurfaceTexture was detached from the old context, so we need to + // recreate it here. + EGLImageKHR image = createImage(dpy, mCurrentTextureBuf); + if (image == EGL_NO_IMAGE_KHR) { + return UNKNOWN_ERROR; } // Attach the current buffer to the GL texture. @@ -427,9 +418,12 @@ status_t SurfaceTexture::attachToContext(GLuint tex) { err = UNKNOWN_ERROR; } - if (imageNeedsDestroy) { - eglDestroyImageKHR(dpy, image); - } + // We destroy the EGLImageKHR here because the current buffer may no + // longer be associated with one of the buffer slots, so we have + // nowhere to to store it. If the buffer is still associated with a + // slot then another EGLImageKHR will be created next time that buffer + // gets acquired in updateTexImage. + eglDestroyImageKHR(dpy, image); if (err != OK) { return err; |