From c8ba0b46161e55b16e43d8872ab67b47038cafa7 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Fri, 21 Jun 2013 16:40:30 -0700 Subject: [PATCH] When destroying a surface, only unmake current if necessary Bug #9404946 The Calendar app destroys one of its popup windows during a draw traversal. Without this patch, we end up with no current context nor surface after we're done gathering display lists. This means that all of our EGL/GL calls will either fail or have undefined behaviors. This could explain the PBO crash we are seeing with the monkeys. Without a proper GL context, the driver returns NULL when we map the PBO in CPU memory. Change-Id: I210cf724be73da909a7621f807298a9f4a58e61d --- core/java/android/view/HardwareRenderer.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index 03428c732c2de..bcefdbaf5d907 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -1301,7 +1301,10 @@ public abstract class HardwareRenderer { void destroySurface() { if (mEglSurface != null && mEglSurface != EGL_NO_SURFACE) { - sEgl.eglMakeCurrent(sEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + if (mEglSurface.equals(sEgl.eglGetCurrentSurface(EGL_DRAW))) { + sEgl.eglMakeCurrent(sEglDisplay, + EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + } sEgl.eglDestroySurface(sEglDisplay, mEglSurface); mEglSurface = null; }