Continue es2 shader dev

Conflicts:

	graphics/java/android/renderscript/Program.java
	graphics/java/android/renderscript/ProgramVertex.java
diff --git a/graphics/java/android/renderscript/Program.java b/graphics/java/android/renderscript/Program.java
index bf6aac7..88b87b0 100644
--- a/graphics/java/android/renderscript/Program.java
+++ b/graphics/java/android/renderscript/Program.java
@@ -29,10 +29,12 @@
     public static final int MAX_INPUT = 8;
     public static final int MAX_OUTPUT = 8;
     public static final int MAX_CONSTANT = 8;
+    public static final int MAX_TEXTURE = 8;
 
     Element mInputs[];
     Element mOutputs[];
     Type mConstants[];
+    int mTextureCount;
     String mShader;
 
     Program(int id, RenderScript rs) {
@@ -65,6 +67,7 @@
             mInputCount = 0;
             mOutputCount = 0;
             mConstantCount = 0;
+            mTextureCount = 0;
         }
 
         public void setShader(String s) {
@@ -95,12 +98,12 @@
             mConstants[mConstantCount++] = t;
         }
 
-        public void addTexture(Type t) throws IllegalStateException {
+        public void setTextureCount(int count) throws IllegalArgumentException {
             // Should check for consistant and non-conflicting names...
-            if(mTextureCount >= MAX_CONSTANT) {
-                throw new IllegalArgumentException("Max input count exceeded.");
+            if(count >= MAX_CONSTANT) {
+                throw new IllegalArgumentException("Max texture count exceeded.");
             }
-            mTextures[mTextureCount++] = t;
+            mTextureCount = count;
         }
 
         protected void initProgram(Program p) {
@@ -110,8 +113,7 @@
             System.arraycopy(mOutputs, 0, p.mOutputs, 0, mOutputCount);
             p.mConstants = new Type[mConstantCount];
             System.arraycopy(mConstants, 0, p.mConstants, 0, mConstantCount);
-            p.mTextures = new Type[mTextureCount];
-            System.arraycopy(mTextures, 0, p.mTextures, 0, mTextureCount);
+            p.mTextureCount = mTextureCount;
         }
     }
 
diff --git a/graphics/java/android/renderscript/ProgramFragment.java b/graphics/java/android/renderscript/ProgramFragment.java
index 2b2557d..f150043 100644
--- a/graphics/java/android/renderscript/ProgramFragment.java
+++ b/graphics/java/android/renderscript/ProgramFragment.java
@@ -25,7 +25,7 @@
  * @hide
  *
  **/
-public class ProgramFragment extends BaseObj {
+public class ProgramFragment extends Program {
     public static final int MAX_SLOT = 2;
 
     public enum EnvMode {
@@ -41,8 +41,7 @@
 
 
     ProgramFragment(int id, RenderScript rs) {
-        super(rs);
-        mID = id;
+        super(id, rs);
     }
 
     public void bindTexture(Allocation va, int slot)
@@ -65,6 +64,37 @@
         mRS.nProgramFragmentBindSampler(mID, slot, vs.mID);
     }
 
+    public static class ShaderBuilder extends BaseProgramBuilder {
+        public ShaderBuilder(RenderScript rs) {
+            super(rs);
+        }
+
+        public ProgramFragment create() {
+            mRS.validate();
+            int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + 1) * 2];
+            int idx = 0;
+
+            for (int i=0; i < mInputCount; i++) {
+                tmp[idx++] = 0;
+                tmp[idx++] = mInputs[i].mID;
+            }
+            for (int i=0; i < mOutputCount; i++) {
+                tmp[idx++] = 1;
+                tmp[idx++] = mOutputs[i].mID;
+            }
+            for (int i=0; i < mConstantCount; i++) {
+                tmp[idx++] = 2;
+                tmp[idx++] = mConstants[i].mID;
+            }
+            tmp[idx++] = 3;
+            tmp[idx++] = mTextureCount;
+
+            int id = mRS.nProgramFragmentCreate2(mShader, tmp);
+            ProgramFragment pf = new ProgramFragment(id, mRS);
+            initProgram(pf);
+            return pf;
+        }
+    }
 
     public static class Builder {
         RenderScript mRS;
diff --git a/graphics/java/android/renderscript/ProgramVertex.java b/graphics/java/android/renderscript/ProgramVertex.java
index 06cfc93..101f030 100644
--- a/graphics/java/android/renderscript/ProgramVertex.java
+++ b/graphics/java/android/renderscript/ProgramVertex.java
@@ -79,10 +79,8 @@
                 tmp[idx++] = 2;
                 tmp[idx++] = mConstants[i].mID;
             }
-            for (int i=0; i < mTextureCount; i++) {
-                tmp[idx++] = 3;
-                tmp[idx++] = mTextures[i].mID;
-            }
+            tmp[idx++] = 3;
+            tmp[idx++] = mTextureCount;
 
             int id = mRS.nProgramVertexCreate2(mShader, tmp);
             ProgramVertex pv = new ProgramVertex(id, mRS);
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 75bd3d0..0e4d5b0 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -175,6 +175,7 @@
     native void nProgramFragmentSetSlot(int slot, boolean enable, int env, int vt);
     native void nProgramFragmentSetShader(String txt);
     native int  nProgramFragmentCreate();
+    native int  nProgramFragmentCreate2(String shader, int[] params);
 
     native int  nProgramVertexCreate(boolean texMat);
     native int  nProgramVertexCreate2(String shader, int[] params);