Defer EGL init until the surface changed call comes in.  Pass w,h along with surface for verification of driver state.
diff --git a/graphics/java/android/renderscript/RSSurfaceView.java b/graphics/java/android/renderscript/RSSurfaceView.java
index 1bc03ac..ad1bb54 100644
--- a/graphics/java/android/renderscript/RSSurfaceView.java
+++ b/graphics/java/android/renderscript/RSSurfaceView.java
@@ -80,10 +80,10 @@
      */
     public void surfaceDestroyed(SurfaceHolder holder) {
         // Surface will be destroyed when we return
+        Log.v(RenderScript.LOG_TAG, "surfaceDestroyed");
         if (mRS != null) {
-            mRS.contextSetSurface(null);
+            mRS.contextSetSurface(0, 0, null);
         }
-        //Log.v(RenderScript.LOG_TAG, "surfaceDestroyed");
     }
 
     /**
@@ -91,10 +91,10 @@
      * not normally called or subclassed by clients of RSSurfaceView.
      */
     public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
+        Log.v(RenderScript.LOG_TAG, "surfaceChanged");
         if (mRS != null) {
-            mRS.contextSetSurface(holder.getSurface());
+            mRS.contextSetSurface(w, h, holder.getSurface());
         }
-        //Log.v(RenderScript.LOG_TAG, "surfaceChanged");
     }
 
     /**
@@ -147,11 +147,8 @@
     // ----------------------------------------------------------------------
 
     public RenderScript createRenderScript(boolean useDepth, boolean forceSW) {
-        Surface sur = null;
-        while ((sur == null) || (mSurfaceHolder == null)) {
-            sur = getHolder().getSurface();
-        }
-        mRS = new RenderScript(sur, useDepth, forceSW);
+        Log.v(RenderScript.LOG_TAG, "createRenderScript");
+        mRS = new RenderScript(useDepth, forceSW);
         return mRS;
     }
 
@@ -160,6 +157,7 @@
     }
 
     public void destroyRenderScript() {
+        Log.v(RenderScript.LOG_TAG, "destroyRenderScript");
         mRS.destroy();
         mRS = null;
     }
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index f1e5af1..ea11882 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -30,10 +30,12 @@
  *
  **/
 public class RenderScript {
-    static final String LOG_TAG = "libRS_jni";
+    static final String LOG_TAG = "RenderScript_jni";
     private static final boolean DEBUG  = false;
     @SuppressWarnings({"UnusedDeclaration", "deprecation"})
     private static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
+    int mWidth;
+    int mHeight;
 
 
 
@@ -62,9 +64,9 @@
     native int  nDeviceCreate();
     native void nDeviceDestroy(int dev);
     native void nDeviceSetConfig(int dev, int param, int value);
-    native int  nContextCreate(int dev, Surface sur, int ver, boolean useDepth);
+    native int  nContextCreate(int dev, int ver, boolean useDepth);
     native void nContextDestroy(int con);
-    native void nContextSetSurface(Surface sur);
+    native void nContextSetSurface(int w, int h, Surface sur);
 
     native void nContextBindRootScript(int script);
     native void nContextBindSampler(int sampler, int slot);
@@ -259,27 +261,31 @@
                     mRS.mMessageCallback.mID = msg;
                     mRS.mMessageCallback.run();
                 }
-                //Log.d("rs", "MessageThread msg " + msg + " v1 " + rbuf[0] + " v2 " + rbuf[1] + " v3 " +rbuf[2]);
+                //Log.d(LOG_TAG, "MessageThread msg " + msg + " v1 " + rbuf[0] + " v2 " + rbuf[1] + " v3 " +rbuf[2]);
             }
-            Log.d("rs", "MessageThread exiting.");
+            Log.d(LOG_TAG, "MessageThread exiting.");
         }
     }
 
-    public RenderScript(Surface sur, boolean useDepth, boolean forceSW) {
-        mSurface = sur;
+    public RenderScript(boolean useDepth, boolean forceSW) {
+        mSurface = null;
+        mWidth = 0;
+        mHeight = 0;
         mDev = nDeviceCreate();
         if(forceSW) {
             nDeviceSetConfig(mDev, 0, 1);
         }
-        mContext = nContextCreate(mDev, mSurface, 0, useDepth);
+        mContext = nContextCreate(mDev, 0, useDepth);
         Element.initPredefined(this);
         mMessageThread = new MessageThread(this);
         mMessageThread.start();
     }
 
-    public void contextSetSurface(Surface sur) {
+    public void contextSetSurface(int w, int h, Surface sur) {
         mSurface = sur;
-        nContextSetSurface(mSurface);
+        mWidth = w;
+        mHeight = h;
+        nContextSetSurface(w, h, mSurface);
     }
 
     public void destroy() {