egl: Remove window disconnect before calling driver eglDestroySurface

This was originally added for b/14445579. An in-development app was
attempting to render to a window as an EGLSurface, then tear that
down, change some window properties, and create a new EGLSurface. The
second eglCreateWindowSurface failed because the window was already
connected. This change went in, but it turned out the real problem was
that the app still (unintentionally) had the surface current. After
the app bug was fixed, nobody revisited whether this change was
actually needed.

Turns out it wasn't needed. After an EGLSurface is both destroyed
*AND* not current (basically refcount==0), we were already
disconnecting the window in ~egl_surface_t().

Apart from being unnecessary and redundant, disconnecting the window
here is wrong for two reasons:

(a) The surface may still be in use after eglDestroySurface, if it was
still current. Rendering is undefined in that case, but disconnecting
the window leads to more catastrophic results than necessary.

(b) It's being called before calling the driver's eglDestroySurface.
The driver will almost definitely have a buffer dequeued that it needs
to cancel, and by disconnecting first we turn that into an error that
they don't have a graceful way to deal with.

Bug: 24524053
Change-Id: Ib063134413d25d3526f794aafb5e333e3417ea42
This commit is contained in:
Jesse Hall 2015-10-14 11:10:24 -07:00
parent 16b0ae105e
commit 312d7555cb

View File

@ -595,15 +595,6 @@ EGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface surface)
return setError(EGL_BAD_SURFACE, EGL_FALSE); return setError(EGL_BAD_SURFACE, EGL_FALSE);
egl_surface_t * const s = get_surface(surface); egl_surface_t * const s = get_surface(surface);
ANativeWindow* window = s->win.get();
if (window) {
int result = native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
if (result != OK) {
ALOGE("eglDestroySurface: native_window_api_disconnect (win=%p) "
"failed (%#x)",
window, result);
}
}
EGLBoolean result = s->cnx->egl.eglDestroySurface(dp->disp.dpy, s->surface); EGLBoolean result = s->cnx->egl.eglDestroySurface(dp->disp.dpy, s->surface);
if (result == EGL_TRUE) { if (result == EGL_TRUE) {
_s.terminate(); _s.terminate();