SurfaceTexture: fix a memory leak

This change fixes a memory leak.

Bug: 6414806
Change-Id: I43536689b4219a042749aec2096a1d5c4e664ae3
This commit is contained in:
Jamie Gennis 2012-05-02 13:10:56 -07:00
parent 06e51a0aaf
commit 5c8a608497

View File

@ -352,7 +352,7 @@ status_t SurfaceTexture::detachFromContext() {
// new EGLDisplay). // new EGLDisplay).
for (int i =0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) { for (int i =0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) {
EGLImageKHR img = mEGLSlots[i].mEglImage; EGLImageKHR img = mEGLSlots[i].mEglImage;
if (img != EGL_NO_IMAGE_KHR && i != mCurrentTexture) { if (img != EGL_NO_IMAGE_KHR) {
eglDestroyImageKHR(mEglDisplay, img); eglDestroyImageKHR(mEglDisplay, img);
mEGLSlots[i].mEglImage = EGL_NO_IMAGE_KHR; mEGLSlots[i].mEglImage = EGL_NO_IMAGE_KHR;
} }
@ -399,21 +399,12 @@ status_t SurfaceTexture::attachToContext(GLuint tex) {
glBindTexture(mTexTarget, tex); glBindTexture(mTexTarget, tex);
if (mCurrentTextureBuf != NULL) { if (mCurrentTextureBuf != NULL) {
// If the current buffer is no longer associated with a slot, then it // The EGLImageKHR that was associated with the slot was destroyed when
// doesn't have an EGLImage. In that case we create one now, but we also // the SurfaceTexture was detached from the old context, so we need to
// destroy it once we've used it to attach the buffer to the OpenGL ES // recreate it here.
// texture. EGLImageKHR image = createImage(dpy, mCurrentTextureBuf);
bool imageNeedsDestroy = false; if (image == EGL_NO_IMAGE_KHR) {
EGLImageKHR image = EGL_NO_IMAGE_KHR; return UNKNOWN_ERROR;
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;
} }
// Attach the current buffer to the GL texture. // Attach the current buffer to the GL texture.
@ -427,9 +418,12 @@ status_t SurfaceTexture::attachToContext(GLuint tex) {
err = UNKNOWN_ERROR; err = UNKNOWN_ERROR;
} }
if (imageNeedsDestroy) { // We destroy the EGLImageKHR here because the current buffer may no
eglDestroyImageKHR(dpy, image); // 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) { if (err != OK) {
return err; return err;