SurfaceTexture: fix a memory leak
This change fixes a memory leak. Bug: 6414806 Change-Id: I43536689b4219a042749aec2096a1d5c4e664ae3
This commit is contained in:
parent
06e51a0aaf
commit
5c8a608497
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user