Continue es2 shader dev

Conflicts:

	graphics/java/android/renderscript/Program.java
	graphics/java/android/renderscript/ProgramVertex.java
diff --git a/rsProgramFragment.cpp b/rsProgramFragment.cpp
index 3ddaa37..2d18c42 100644
--- a/rsProgramFragment.cpp
+++ b/rsProgramFragment.cpp
@@ -40,6 +40,19 @@
     mEnvModes[1] = RS_TEX_ENV_MODE_DECAL;
 }
 
+ProgramFragment::ProgramFragment(Context *rsc, const char * shaderText,
+                                 uint32_t shaderLength, const uint32_t * params,
+                                 uint32_t paramLength) :
+    Program(rsc, shaderText, shaderLength, params, paramLength)
+{
+    mAllocFile = __FILE__;
+    mAllocLine = __LINE__;
+
+    init(rsc);
+    mTextureEnableMask = (1 << mTextureCount) -1;
+}
+
+
 ProgramFragment::~ProgramFragment()
 {
 }
@@ -158,58 +171,68 @@
     mShader.append("varying vec4 varColor;\n");
     mShader.append("varying vec4 varTex0;\n");
 
-    uint32_t mask = mTextureEnableMask;
-    uint32_t texNum = 0;
-    while (mask) {
-        if (mask & 1) {
-            char buf[64];
-            mShader.append("uniform sampler2D uni_Tex");
-            sprintf(buf, "%i", texNum);
+    if (mUserShader.length() > 1) {
+        for (uint32_t ct=0; ct < mTextureCount; ct++) {
+            char buf[256];
+            sprintf(buf, "uniform sampler2D uni_Tex%i;\n", ct);
             mShader.append(buf);
-            mShader.append(";\n");
         }
-        mask >>= 1;
-        texNum++;
-    }
 
-
-    mShader.append("void main() {\n");
-    mShader.append("  vec4 col = varColor;\n");
-
-    if (mTextureEnableMask) {
-        if (mPointSpriteEnable) {
-            mShader.append("  vec2 tex0 = gl_PointCoord;\n");
-        } else {
-            mShader.append("  vec2 tex0 = varTex0.xy;\n");
-        }
-    }
-
-    mask = mTextureEnableMask;
-    texNum = 0;
-    while (mask) {
-        if (mask & 1) {
-            switch(mEnvModes[texNum]) {
-            case RS_TEX_ENV_MODE_REPLACE:
-                mShader.append("  col = texture2D(uni_Tex0, tex0);\n");
-                break;
-            case RS_TEX_ENV_MODE_MODULATE:
-                mShader.append("  col *= texture2D(uni_Tex0, tex0);\n");
-                break;
-            case RS_TEX_ENV_MODE_DECAL:
-                mShader.append("  col = texture2D(uni_Tex0, tex0);\n");
-                break;
+        mShader.append(mUserShader);
+    } else {
+        uint32_t mask = mTextureEnableMask;
+        uint32_t texNum = 0;
+        while (mask) {
+            if (mask & 1) {
+                char buf[64];
+                mShader.append("uniform sampler2D uni_Tex");
+                sprintf(buf, "%i", texNum);
+                mShader.append(buf);
+                mShader.append(";\n");
             }
-
+            mask >>= 1;
+            texNum++;
         }
-        mask >>= 1;
-        texNum++;
+
+
+        mShader.append("void main() {\n");
+        mShader.append("  vec4 col = varColor;\n");
+
+        if (mTextureEnableMask) {
+            if (mPointSpriteEnable) {
+                mShader.append("  vec2 tex0 = gl_PointCoord;\n");
+            } else {
+                mShader.append("  vec2 tex0 = varTex0.xy;\n");
+            }
+        }
+
+        mask = mTextureEnableMask;
+        texNum = 0;
+        while (mask) {
+            if (mask & 1) {
+                switch(mEnvModes[texNum]) {
+                case RS_TEX_ENV_MODE_REPLACE:
+                    mShader.append("  col = texture2D(uni_Tex0, tex0);\n");
+                    break;
+                case RS_TEX_ENV_MODE_MODULATE:
+                    mShader.append("  col *= texture2D(uni_Tex0, tex0);\n");
+                    break;
+                case RS_TEX_ENV_MODE_DECAL:
+                    mShader.append("  col = texture2D(uni_Tex0, tex0);\n");
+                    break;
+                }
+
+            }
+            mask >>= 1;
+            texNum++;
+        }
+
+        //mShader.append("  col.a = 1.0;\n");
+        //mShader.append("  col.r = 0.5;\n");
+
+        mShader.append("  gl_FragColor = col;\n");
+        mShader.append("}\n");
     }
-
-    //mShader.append("  col.a = 1.0;\n");
-    //mShader.append("  col.r = 0.5;\n");
-
-    mShader.append("  gl_FragColor = col;\n");
-    mShader.append("}\n");
 }
 
 void ProgramFragment::bindTexture(uint32_t slot, Allocation *a)
@@ -361,6 +384,14 @@
     return pf;
 }
 
+RsProgramFragment rsi_ProgramFragmentCreate2(Context *rsc, const char * shaderText,
+                             uint32_t shaderLength, const uint32_t * params,
+                             uint32_t paramLength)
+{
+    ProgramFragment *pf = new ProgramFragment(rsc, shaderText, shaderLength, params, paramLength);
+    pf->incUserRef();
+    return pf;
+}
 
 }
 }