Remove InvokeData and add ContextFinish to generate a sync point.

Change-Id: I27da8bf5fba2c8a428964cb6a5e66dd7a94958d8
diff --git a/java/Fountain/res/raw/fountain.rs b/java/Fountain/res/raw/fountain.rs
index 7573398..c44a796 100644
--- a/java/Fountain/res/raw/fountain.rs
+++ b/java/Fountain/res/raw/fountain.rs
@@ -1,6 +1,8 @@
 // Fountain test script
 #pragma version(1)
 
+#pragma rs java_package_name(com.android.fountain)
+
 #include "../../../../scriptc/rs_types.rsh"
 #include "../../../../scriptc/rs_math.rsh"
 #include "../../../../scriptc/rs_graphics.rsh"
@@ -10,7 +12,7 @@
 float4 partColor;
 rs_mesh partMesh;
 
-typedef struct __attribute__((packed, aligned(4))) Point_s {
+typedef struct __attribute__((packed, aligned(4))) Point {
     float2 delta;
     float2 position;
     uchar4 color;
diff --git a/java/Fountain/res/raw/fountain_bc.bc b/java/Fountain/res/raw/fountain_bc.bc
index b01098b..f90d8f1 100644
--- a/java/Fountain/res/raw/fountain_bc.bc
+++ b/java/Fountain/res/raw/fountain_bc.bc
Binary files differ
diff --git a/java/Fountain/src/com/android/fountain/FountainRS.java b/java/Fountain/src/com/android/fountain/FountainRS.java
index 5433597..7a7866d 100644
--- a/java/Fountain/src/com/android/fountain/FountainRS.java
+++ b/java/Fountain/src/com/android/fountain/FountainRS.java
@@ -34,7 +34,7 @@
         mRS = rs;
         mRes = res;
 
-        ScriptField_Point_s points = new ScriptField_Point_s(mRS, PART_COUNT);
+        ScriptField_Point points = new ScriptField_Point(mRS, PART_COUNT);
 
         SimpleMesh.Builder smb = new SimpleMesh.Builder(mRS);
         int vtxSlot = smb.addVertexType(points.getType());
@@ -42,7 +42,7 @@
         SimpleMesh sm = smb.create();
         sm.bindVertexAllocation(points.getAllocation(), vtxSlot);
 
-        mScript = new ScriptC_Fountain(mRS, mRes, true);
+        mScript = new ScriptC_Fountain(mRS, mRes, R.raw.fountain_bc, true);
         mScript.set_partMesh(sm);
         mScript.bind_point(points);
         mRS.contextBindRootScript(mScript);
diff --git a/java/Fountain/src/com/android/fountain/ScriptC_Fountain.java b/java/Fountain/src/com/android/fountain/ScriptC_Fountain.java
index f6bef27..88062e8 100644
--- a/java/Fountain/src/com/android/fountain/ScriptC_Fountain.java
+++ b/java/Fountain/src/com/android/fountain/ScriptC_Fountain.java
@@ -22,8 +22,8 @@
 
 public class ScriptC_Fountain extends ScriptC {
     // Constructor
-    public  ScriptC_Fountain(RenderScript rs, Resources resources, boolean isRoot) {
-        super(rs, resources, R.raw.fountain_bc, isRoot);
+    public  ScriptC_Fountain(RenderScript rs, Resources resources, int id, boolean isRoot) {
+        super(rs, resources, id, isRoot);
     }
 
     private final static int mExportVarIdx_partColor = 0;
@@ -43,9 +43,7 @@
     private SimpleMesh mExportVar_partMesh;
     public void set_partMesh(SimpleMesh v) {
         mExportVar_partMesh = v;
-        int id = 0;
-        if (v != null) id = v.getID();
-        setVar(mExportVarIdx_partMesh, id);
+        setVar(mExportVarIdx_partMesh, (v == null) ? 0 : v.getID());
     }
 
     public SimpleMesh get_partMesh() {
@@ -53,14 +51,14 @@
     }
 
     private final static int mExportVarIdx_point = 2;
-    private ScriptField_Point_s mExportVar_point;
-    public void bind_point(ScriptField_Point_s v) {
+    private ScriptField_Point mExportVar_point;
+    public void bind_point(ScriptField_Point v) {
         mExportVar_point = v;
         if(v == null) bindAllocation(null, mExportVarIdx_point);
         else bindAllocation(v.getAllocation(), mExportVarIdx_point);
     }
 
-    public ScriptField_Point_s get_point() {
+    public ScriptField_Point get_point() {
         return mExportVar_point;
     }
 
@@ -70,7 +68,7 @@
         addParticles_fp.addI32(rate);
         addParticles_fp.addI32(x);
         addParticles_fp.addI32(y);
-        invokeV(mExportFuncIdx_addParticles, addParticles_fp);
+        invoke(mExportFuncIdx_addParticles, addParticles_fp);
     }
 
 }
diff --git a/java/Fountain/src/com/android/fountain/ScriptField_Point_s.java b/java/Fountain/src/com/android/fountain/ScriptField_Point.java
similarity index 93%
rename from java/Fountain/src/com/android/fountain/ScriptField_Point_s.java
rename to java/Fountain/src/com/android/fountain/ScriptField_Point.java
index 9697a4d..dee4e96 100644
--- a/java/Fountain/src/com/android/fountain/ScriptField_Point_s.java
+++ b/java/Fountain/src/com/android/fountain/ScriptField_Point.java
@@ -20,7 +20,7 @@
 import android.content.res.Resources;
 import android.util.Log;
 
-public class ScriptField_Point_s extends android.renderscript.Script.FieldBase {
+public class ScriptField_Point extends android.renderscript.Script.FieldBase {
     static public class Item {
         public static final int sizeof = 20;
 
@@ -38,7 +38,7 @@
 
     private Item mItemArray[];
     private FieldPacker mIOBuffer;
-    public  ScriptField_Point_s(RenderScript rs, int count) {
+    public  ScriptField_Point(RenderScript rs, int count) {
         mItemArray = null;
         mIOBuffer = null;
         {
diff --git a/java/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java b/java/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java
index 5e36a78..b39d141 100644
--- a/java/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java
+++ b/java/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java
@@ -286,6 +286,7 @@
             long t = java.lang.System.currentTimeMillis();
             if (true) {
                 mScript.invokable_Filter();
+                mRS.finish();
             } else {
                 javaFilter();
             }
@@ -355,6 +356,7 @@
     public void surfaceCreated(SurfaceHolder holder) {
         createScript();
         mScript.invokable_Filter();
+        mRS.finish();
     }
 
     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
@@ -412,6 +414,7 @@
         long t = java.lang.System.currentTimeMillis();
 
         mScript.invokable_FilterBenchmark();
+        mRS.finish();
 
         t = java.lang.System.currentTimeMillis() - t;
         android.util.Log.v("Img", "Renderscript frame time core ms " + t);
@@ -424,5 +427,6 @@
         mScript.set_radius(mRadius);
 
         mScript.invokable_Filter();
+        mRS.finish();
     }
 }
diff --git a/java/ImageProcessing/src/com/android/rs/image/ScriptC_Threshold.java b/java/ImageProcessing/src/com/android/rs/image/ScriptC_Threshold.java
index 4d5c7f5..42adb27 100644
--- a/java/ImageProcessing/src/com/android/rs/image/ScriptC_Threshold.java
+++ b/java/ImageProcessing/src/com/android/rs/image/ScriptC_Threshold.java
@@ -104,12 +104,12 @@
 
     private final static int mInvokableIndex_Filter = 4;
     public void invokable_Filter() {
-        invokeData(mInvokableIndex_Filter);
+        invoke(mInvokableIndex_Filter);
     }
 
     private final static int mInvokableIndex_FilterBenchmark = 5;
     public void invokable_FilterBenchmark() {
-        invokeData(mInvokableIndex_FilterBenchmark);
+        invoke(mInvokableIndex_FilterBenchmark);
     }
 }
 
diff --git a/rs.spec b/rs.spec
index 4867cad..5f76486 100644
--- a/rs.spec
+++ b/rs.spec
@@ -1,4 +1,7 @@
 
+ContextFinish {
+	handcodeApi
+	}
 
 ContextBindRootScript {
 	param RsScript sampler
@@ -261,12 +264,6 @@
 	param uint32_t slot
 	}
 
-ScriptInvokeData {
-	param RsScript s
-	param uint32_t slot
-	param void * data
-	}
-
 ScriptInvokeV {
 	param RsScript s
 	param uint32_t slot
diff --git a/rsContext.cpp b/rsContext.cpp
index 449e5dc..b9349bd 100644
--- a/rsContext.cpp
+++ b/rsContext.cpp
@@ -761,6 +761,9 @@
 namespace android {
 namespace renderscript {
 
+void rsi_ContextFinish(Context *rsc)
+{
+}
 
 void rsi_ContextBindRootScript(Context *rsc, RsScript vs)
 {
diff --git a/rsHandcode.h b/rsHandcode.h
index f6e56ac..353b73a 100644
--- a/rsHandcode.h
+++ b/rsHandcode.h
@@ -1,6 +1,14 @@
 
 #define DATA_SYNC_SIZE 1024
 
+static inline void rsHCAPI_ContextFinish (RsContext rsc)
+{
+    ThreadIO *io = &((Context *)rsc)->mIO;
+    uint32_t size = sizeof(RS_CMD_ContextFinish);
+    RS_CMD_ContextFinish *cmd = static_cast<RS_CMD_ContextFinish *>(io->mToCore.reserve(size));
+    io->mToCore.commitSync(RS_CMD_ID_ContextFinish, size);
+}
+
 static inline void rsHCAPI_ScriptInvokeV (RsContext rsc, RsScript va, uint32_t slot, const void * data, uint32_t sizeBytes)
 {
     ThreadIO *io = &((Context *)rsc)->mIO;
diff --git a/rsScriptC.cpp b/rsScriptC.cpp
index ef37286..975b704 100644
--- a/rsScriptC.cpp
+++ b/rsScriptC.cpp
@@ -260,17 +260,25 @@
         s->mProgram.mInit();
     }
 
-    s->mEnviroment.mInvokeFunctions = (Script::InvokeFunc_t *)calloc(100, sizeof(void *));
-    BCCchar **labels = new char*[100];
-    bccGetFunctions(s->mBccScript, (BCCsizei *)&s->mEnviroment.mInvokeFunctionCount,
-                    100, (BCCchar **)labels);
-    //LOGE("func count %i", s->mEnviroment.mInvokeFunctionCount);
-    for (uint32_t i=0; i < s->mEnviroment.mInvokeFunctionCount; i++) {
-        BCCsizei length;
-        bccGetFunctionBinary(s->mBccScript, labels[i], (BCCvoid **)&(s->mEnviroment.mInvokeFunctions[i]), &length);
-        //LOGE("func %i %p", i, s->mEnviroment.mInvokeFunctions[i]);
+    bccGetExportFuncs(s->mBccScript, (BCCsizei*) &s->mEnviroment.mInvokeFunctionCount, 0, NULL);
+    if(s->mEnviroment.mInvokeFunctionCount <= 0)
+        s->mEnviroment.mInvokeFunctions = NULL;
+    else {
+        s->mEnviroment.mInvokeFunctions = (Script::InvokeFunc_t*) calloc(s->mEnviroment.mInvokeFunctionCount, sizeof(Script::InvokeFunc_t));
+        bccGetExportFuncs(s->mBccScript, NULL, s->mEnviroment.mInvokeFunctionCount, (BCCvoid **) s->mEnviroment.mInvokeFunctions);
     }
 
+//    s->mEnviroment.mInvokeFunctions = (Script::InvokeFunc_t *)calloc(100, sizeof(void *));
+//    BCCchar **labels = new char*[100];
+//    bccGetFunctions(s->mBccScript, (BCCsizei *)&s->mEnviroment.mInvokeFunctionCount,
+//                    100, (BCCchar **)labels);
+    //LOGE("func count %i", s->mEnviroment.mInvokeFunctionCount);
+//    for (uint32_t i=0; i < s->mEnviroment.mInvokeFunctionCount; i++) {
+//        BCCsizei length;
+//        bccGetFunctionBinary(s->mBccScript, labels[i], (BCCvoid **)&(s->mEnviroment.mInvokeFunctions[i]), &length);
+        //LOGE("func %i %p", i, s->mEnviroment.mInvokeFunctions[i]);
+  //  }
+
     s->mEnviroment.mFieldAddress = (void **)calloc(100, sizeof(void *));
     bccGetExportVars(s->mBccScript, (BCCsizei *)&s->mEnviroment.mFieldCount,
                      100, s->mEnviroment.mFieldAddress);
diff --git a/rsScriptC_LibGL.cpp b/rsScriptC_LibGL.cpp
index 8f650f8..01a23c0 100644
--- a/rsScriptC_LibGL.cpp
+++ b/rsScriptC_LibGL.cpp
@@ -477,6 +477,8 @@
 
     { "_Z18rsgUploadToTextureii", (void *)&SC_uploadToTexture2 },
     { "_Z18rsgUploadToTexturei", (void *)&SC_uploadToTexture },
+    { "_Z18rsgUploadToTexture13rs_allocationi", (void *)&SC_uploadToTexture2 },
+    { "_Z18rsgUploadToTexture13rs_allocation", (void *)&SC_uploadToTexture },
     { "rsgUploadToBufferObject", (void *)&SC_uploadToBufferObject },
 
     { "rsgDrawRect", (void *)&SC_drawRect },
@@ -487,6 +489,8 @@
     { "rsgDrawSpriteScreenspaceCropped", (void *)&SC_drawSpriteScreenspaceCropped },
     { "rsgDrawLine", (void *)&SC_drawLine },
     { "rsgDrawPoint", (void *)&SC_drawPoint },
+    { "_Z17rsgDrawSimpleMesh7rs_mesh", (void *)&SC_drawSimpleMesh },
+    { "_Z17rsgDrawSimpleMesh7rs_meshii", (void *)&SC_drawSimpleMeshRange },
     { "_Z17rsgDrawSimpleMeshi", (void *)&SC_drawSimpleMesh },
     { "_Z17rsgDrawSimpleMeshiii", (void *)&SC_drawSimpleMeshRange },