From 78be65e7bf6898c6afa55c9016f331ab1aa2503a Mon Sep 17 00:00:00 2001 From: Michael Lentine Date: Thu, 2 Oct 2014 12:10:07 -0700 Subject: [PATCH] Adding eglInitialize and eglTerminate image creation and deletion. Previously it was possible to have the driver's eglTerminate called beofre eglDestroyImageKHR in GLConsumer. This was because we didn't increment the refcount for the lifetime of the image. This could lead to a crash or a deadlock when multiple threads called terminate and destroy simultaneously. Bug: 17700483 Change-Id: I7010d0f1b3db875332e95630b5e098a5564ba755 --- libs/gui/GLConsumer.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/gui/GLConsumer.cpp b/libs/gui/GLConsumer.cpp index ccafe81ce..cc96a92d2 100644 --- a/libs/gui/GLConsumer.cpp +++ b/libs/gui/GLConsumer.cpp @@ -1065,6 +1065,7 @@ GLConsumer::EglImage::~EglImage() { if (!eglDestroyImageKHR(mEglDisplay, mEglImage)) { ALOGE("~EglImage: eglDestroyImageKHR failed"); } + eglTerminate(mEglDisplay); } } @@ -1079,6 +1080,7 @@ status_t GLConsumer::EglImage::createIfNeeded(EGLDisplay eglDisplay, if (!eglDestroyImageKHR(mEglDisplay, mEglImage)) { ALOGE("createIfNeeded: eglDestroyImageKHR failed"); } + eglTerminate(mEglDisplay); mEglImage = EGL_NO_IMAGE_KHR; mEglDisplay = EGL_NO_DISPLAY; } @@ -1129,11 +1131,13 @@ EGLImageKHR GLConsumer::EglImage::createImage(EGLDisplay dpy, // removes this restriction if there is hardware that can support it. attrs[2] = EGL_NONE; } + eglInitialize(dpy, 0, 0); EGLImageKHR image = eglCreateImageKHR(dpy, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, cbuf, attrs); if (image == EGL_NO_IMAGE_KHR) { EGLint error = eglGetError(); ALOGE("error creating EGLImage: %#x", error); + eglTerminate(dpy); } return image; }