Make default vertex program correctly track surface size.
diff --git a/java/Fountain/src/com/android/fountain/FountainView.java b/java/Fountain/src/com/android/fountain/FountainView.java
index cda005e..1e7c5a2 100644
--- a/java/Fountain/src/com/android/fountain/FountainView.java
+++ b/java/Fountain/src/com/android/fountain/FountainView.java
@@ -48,28 +48,24 @@
     private RenderScript mRS;
     private FountainRS mRender;
 
-    private void destroyRS() {
+    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
+        super.surfaceChanged(holder, format, w, h);
+        if (mRS == null) {
+            mRS = createRenderScript(false, true);
+            mRS.contextSetSurface(w, h, holder.getSurface());
+            mRender = new FountainRS();
+            mRender.init(mRS, getResources(), w, h);
+        }
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
         if(mRS != null) {
             mRS = null;
             destroyRenderScript();
         }
-        java.lang.System.gc();
     }
 
-    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
-        super.surfaceChanged(holder, format, w, h);
-        destroyRS();
-        mRS = createRenderScript(false, true);
-        mRender = new FountainRS();
-        mRender.init(mRS, getResources(), w, h);
-    }
-
-    public void surfaceDestroyed(SurfaceHolder holder) {
-        // Surface will be destroyed when we return
-        destroyRS();
-    }
-
-
 
     @Override
     public boolean onTouchEvent(MotionEvent ev)
diff --git a/rsContext.cpp b/rsContext.cpp
index ab3809d..c835dda 100644
--- a/rsContext.cpp
+++ b/rsContext.cpp
@@ -443,6 +443,7 @@
         eglQuerySurface(mEGL.mDisplay, mEGL.mSurface, EGL_HEIGHT, &mEGL.mHeight);
         mWidth = w;
         mHeight = h;
+        mStateVertex.updateSize(this, w, h);
 
         if ((int)mWidth != mEGL.mWidth || (int)mHeight != mEGL.mHeight) {
             LOGE("EGL/Surface mismatch  EGL (%i x %i)  SF (%i x %i)", mEGL.mWidth, mEGL.mHeight, mWidth, mHeight);
diff --git a/rsProgramVertex.cpp b/rsProgramVertex.cpp
index eea8b3b..68f589f 100644
--- a/rsProgramVertex.cpp
+++ b/rsProgramVertex.cpp
@@ -157,12 +157,17 @@
 
     pv->bindAllocation(alloc);
 
+    updateSize(rsc, w, h);
+}
+
+void ProgramVertexState::updateSize(Context *rsc, int32_t w, int32_t h)
+{
     Matrix m;
     m.loadOrtho(0,w, h,0, -1,1);
-    alloc->subData(RS_PROGRAM_VERTEX_PROJECTION_OFFSET, 16, &m.m[0], 16*4);
+    mDefaultAlloc->subData(RS_PROGRAM_VERTEX_PROJECTION_OFFSET, 16, &m.m[0], 16*4);
 
     m.loadIdentity();
-    alloc->subData(RS_PROGRAM_VERTEX_MODELVIEW_OFFSET, 16, &m.m[0], 16*4);
+    mDefaultAlloc->subData(RS_PROGRAM_VERTEX_MODELVIEW_OFFSET, 16, &m.m[0], 16*4);
 }
 
 void ProgramVertexState::deinit(Context *rsc)
diff --git a/rsProgramVertex.h b/rsProgramVertex.h
index 493668c..a97ba38 100644
--- a/rsProgramVertex.h
+++ b/rsProgramVertex.h
@@ -63,6 +63,7 @@
 
     void init(Context *rsc, int32_t w, int32_t h);
     void deinit(Context *rsc);
+    void updateSize(Context *rsc, int32_t w, int32_t h);
 
     ObjectBaseRef<ProgramVertex> mDefault;
     ObjectBaseRef<ProgramVertex> mLast;