Add new error code for Debug Context work.

Bug: 7343201

This error type is less severe when running under the debug context,
allowing developers to use RSErrorHandler to respond to errors like
out-of-bounds native accesses.

Change-Id: I79c87d1956c94833546f0f638ffa1aafecae49cd
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 6f614c3..4493d41 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -128,6 +128,8 @@
         }
     }
 
+    ContextType mContextType;
+
     // Methods below are wrapped to protect the non-threadsafe
     // lockless fifo.
     native int  rsnContextCreateGL(int dev, int ver, int sdkVer,
@@ -1015,6 +1017,7 @@
         static final int RS_MESSAGE_TO_CLIENT_USER = 4;
         static final int RS_MESSAGE_TO_CLIENT_NEW_BUFFER = 5;
 
+        static final int RS_ERROR_FATAL_DEBUG = 0x0800;
         static final int RS_ERROR_FATAL_UNKNOWN = 0x1000;
 
         MessageThread(RenderScript rs) {
@@ -1057,7 +1060,17 @@
                 if (msg == RS_MESSAGE_TO_CLIENT_ERROR) {
                     String e = mRS.nContextGetErrorMessage(mRS.mContext);
 
-                    if (subID >= RS_ERROR_FATAL_UNKNOWN) {
+                    // Throw RSRuntimeException under the following conditions:
+                    //
+                    // 1) It is an unknown fatal error.
+                    // 2) It is a debug fatal error, and we are not in a
+                    //    debug context.
+                    // 3) It is a debug fatal error, and we do not have an
+                    //    error callback.
+                    if (subID >= RS_ERROR_FATAL_UNKNOWN ||
+                        (subID >= RS_ERROR_FATAL_DEBUG &&
+                         (mRS.mContextType != ContextType.DEBUG ||
+                          mRS.mErrorCallback == null))) {
                         throw new RSRuntimeException("Fatal error " + subID + ", details: " + e);
                     }
 
@@ -1092,6 +1105,7 @@
     }
 
     RenderScript(Context ctx) {
+        mContextType = ContextType.NORMAL;
         if (ctx != null) {
             mApplicationContext = ctx.getApplicationContext();
         }
@@ -1125,6 +1139,7 @@
 
         rs.mDev = rs.nDeviceCreate();
         rs.mContext = rs.nContextCreate(rs.mDev, 0, sdkVersion, ct.mID);
+        rs.mContextType = ct;
         if (rs.mContext == 0) {
             throw new RSDriverException("Failed to create RS context.");
         }