From 67f27952c1bcb2230beef9b5ca0bf42edad436a9 Mon Sep 17 00:00:00 2001
From: Romain Guy <romainguy@google.com>
Date: Tue, 7 Dec 2010 20:09:23 -0800
Subject: Correctly release the OpenGL Canvas on EGL error.

Change-Id: Ib31fd8445f7ce5f7aa7e0205de0e7db80d024fc2
---
 core/java/android/view/HardwareRenderer.java | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

(limited to 'core')

diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java
index 24a9f87..0e294f7 100644
--- a/core/java/android/view/HardwareRenderer.java
+++ b/core/java/android/view/HardwareRenderer.java
@@ -50,7 +50,7 @@ public abstract class HardwareRenderer {
     private boolean mRequested = true;
 
     /**
-     * Indicates that the current process cannot use hardware rendering.
+     * Invoke this method to disable hardware rendering in the current process.
      * 
      * @hide
      */
@@ -207,7 +207,7 @@ public abstract class HardwareRenderer {
         EGLSurface mEglSurface;
         
         GL mGl;
-        GLES20Canvas mCanvas;
+        HardwareCanvas mCanvas;
 
         final int mGlVersion;
         final boolean mTranslucent;
@@ -279,12 +279,15 @@ public abstract class HardwareRenderer {
                     if (error != EGL11.EGL_CONTEXT_LOST) {
                         // we'll try again if it was context lost
                         setRequested(false);
+                    } else {
+                        Log.w(LOG_TAG, "Mountain View, we've had a problem here. " 
+                                + "Switching back to software rendering.");
                     }
                     Log.w(LOG_TAG, "EGL error: " + getEGLErrorString(error));
                 }
             }
         }
-        
+
         @Override
         boolean initialize(SurfaceHolder holder) {
             if (isRequested() && !isEnabled()) {
@@ -654,6 +657,14 @@ public abstract class HardwareRenderer {
         }
 
         @Override
+        void destroy(boolean full) {
+            super.destroy(full);
+            if (full && mGlCanvas != null) {
+                mGlCanvas = null;
+            }
+        }
+
+        @Override
         DisplayList createDisplayList() {
             return new GLES20DisplayList();
         }
-- 
cgit v1.1