Beging GL2 user shaders.  Switch master to using GL2 by default.
diff --git a/graphics/java/android/renderscript/ProgramFragment.java b/graphics/java/android/renderscript/ProgramFragment.java
index 392d93d..f8625e8 100644
--- a/graphics/java/android/renderscript/ProgramFragment.java
+++ b/graphics/java/android/renderscript/ProgramFragment.java
@@ -69,6 +69,7 @@
         Element mIn;
         Element mOut;
         boolean mPointSpriteEnable;
+        String mShader;
 
         private class Slot {
             Type mType;
@@ -92,6 +93,10 @@
             }
         }
 
+        public void setShader(String s) {
+            mShader = s;
+        }
+
         public void setType(int slot, Type t)
             throws IllegalArgumentException {
             if((slot < 0) || (slot >= MAX_SLOT)) {
@@ -144,6 +149,10 @@
                 }
             }
 
+            if (b.mShader != null) {
+                rs.nProgramFragmentSetShader(b.mShader);
+            }
+
             int id = rs.nProgramFragmentCreate();
             return new ProgramFragment(id, rs);
         }
diff --git a/graphics/java/android/renderscript/ProgramVertex.java b/graphics/java/android/renderscript/ProgramVertex.java
index ddb23ac..8a22138 100644
--- a/graphics/java/android/renderscript/ProgramVertex.java
+++ b/graphics/java/android/renderscript/ProgramVertex.java
@@ -45,6 +45,7 @@
         Light[] mLights;
         int mLightCount;
         boolean mTextureMatrixEnable;
+        String mShader;
 
 
         public Builder(RenderScript rs, Element in, Element out) {
@@ -59,6 +60,10 @@
             mTextureMatrixEnable = enable;
         }
 
+        public void setShader(String s) {
+            mShader = s;
+        }
+
         public void addLight(Light l) throws IllegalStateException {
             if(mLightCount >= MAX_LIGHT) {
                 throw new IllegalArgumentException("Max light count exceeded.");
@@ -79,10 +84,14 @@
                 outID = b.mOut.mID;
             }
             rs.nProgramVertexBegin(inID, outID);
-            for(int ct=0; ct < b.mLightCount; ct++) {
-                rs.nProgramVertexAddLight(b.mLights[ct].mID);
+            if (b.mShader != null) {
+                rs.nProgramVertexSetShader(b.mShader);
+            } else {
+                for(int ct=0; ct < b.mLightCount; ct++) {
+                    rs.nProgramVertexAddLight(b.mLights[ct].mID);
+                }
+                rs.nProgramVertexSetTextureMatrixEnable(b.mTextureMatrixEnable);
             }
-            rs.nProgramVertexSetTextureMatrixEnable(b.mTextureMatrixEnable);
             int id = rs.nProgramVertexCreate();
             return new ProgramVertex(id, rs);
         }
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index c42f647..22bfa69 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -171,12 +171,14 @@
     native void nProgramFragmentBindTexture(int vpf, int slot, int a);
     native void nProgramFragmentBindSampler(int vpf, int slot, int s);
     native void nProgramFragmentSetSlot(int slot, boolean enable, int env, int vt);
+    native void nProgramFragmentSetShader(String txt);
     native int  nProgramFragmentCreate();
 
     native void nProgramVertexBindAllocation(int pv, int mID);
     native void nProgramVertexBegin(int inID, int outID);
     native void nProgramVertexSetTextureMatrixEnable(boolean enable);
     native void nProgramVertexAddLight(int id);
+    native void nProgramVertexSetShader(String txt);
     native int  nProgramVertexCreate();
 
     native void nLightBegin();