Add support for non-VBO drawing in Meshes.

Change-Id: Ic4dd88cbe591091ebe740babe30213c15ad60cb3
diff --git a/libs/rs/java/Fountain/res/raw/fountain.rs b/libs/rs/java/Fountain/res/raw/fountain.rs
index 4b56b1b..6ff4c5bb 100644
--- a/libs/rs/java/Fountain/res/raw/fountain.rs
+++ b/libs/rs/java/Fountain/res/raw/fountain.rs
@@ -8,7 +8,6 @@
 #include "../../../../scriptc/rs_graphics.rsh"
 
 static int newPart = 0;
-
 static float4 partColor;
 rs_mesh partMesh;
 
@@ -19,13 +18,13 @@
 } Point_t;
 Point_t *point;
 
-#pragma rs export_var(point, partColor, partMesh)
+#pragma rs export_var(point, partMesh)
+#pragma rs export_func(addParticles)
 
 int root() {
     rsgClearColor(0.f, 0.f, 0.f, 1.f);
-    float height = rsgGetHeight();
-    rs_allocation alloc = rsGetAllocation(point);
-    int size = rsAllocationGetDimX(alloc);
+    const float height = rsgGetHeight();
+    const int size = rsAllocationGetDimX(rsGetAllocation(point));
 
     Point_t * p = point;
     for (int ct=0; ct < size; ct++) {
@@ -37,13 +36,10 @@
         p++;
     }
 
-    rsgUploadToBufferObject(alloc);
     rsgDrawSimpleMesh(partMesh);
     return 1;
 }
 
-#pragma rs export_func(addParticles)
-
 void addParticles(int rate, float x, float y, int newColor)
 {
     if (newColor) {
diff --git a/libs/rs/java/Fountain/res/raw/fountain_bc.bc b/libs/rs/java/Fountain/res/raw/fountain_bc.bc
index 66d50b3..b200687 100644
--- a/libs/rs/java/Fountain/res/raw/fountain_bc.bc
+++ b/libs/rs/java/Fountain/res/raw/fountain_bc.bc
Binary files differ
diff --git a/libs/rs/java/Fountain/src/com/android/fountain/ScriptC_Fountain.java b/libs/rs/java/Fountain/src/com/android/fountain/ScriptC_Fountain.java
index 66b5b98..2653f6b 100644
--- a/libs/rs/java/Fountain/src/com/android/fountain/ScriptC_Fountain.java
+++ b/libs/rs/java/Fountain/src/com/android/fountain/ScriptC_Fountain.java
@@ -26,20 +26,7 @@
         super(rs, resources, id, isRoot);
     }
 
-    private final static int mExportVarIdx_partColor = 0;
-    private Float4 mExportVar_partColor;
-    public void set_partColor(Float4 v) {
-        mExportVar_partColor = v;
-        FieldPacker fp = new FieldPacker(16);
-        fp.addF32(v);
-        setVar(mExportVarIdx_partColor, fp);
-    }
-
-    public Float4 get_partColor() {
-        return mExportVar_partColor;
-    }
-
-    private final static int mExportVarIdx_partMesh = 1;
+    private final static int mExportVarIdx_partMesh = 0;
     private SimpleMesh mExportVar_partMesh;
     public void set_partMesh(SimpleMesh v) {
         mExportVar_partMesh = v;
@@ -50,7 +37,7 @@
         return mExportVar_partMesh;
     }
 
-    private final static int mExportVarIdx_point = 2;
+    private final static int mExportVarIdx_point = 1;
     private ScriptField_Point mExportVar_point;
     public void bind_point(ScriptField_Point v) {
         mExportVar_point = v;
diff --git a/libs/rs/rsAllocation.h b/libs/rs/rsAllocation.h
index a408a57..8273165 100644
--- a/libs/rs/rsAllocation.h
+++ b/libs/rs/rsAllocation.h
@@ -78,6 +78,9 @@
 
     virtual void uploadCheck(const Context *rsc);
 
+    bool getIsTexture() const {return mIsTexture;}
+    bool getIsBufferObject() const {return mIsVertexBuffer;}
+
 protected:
     void sendDirty() const;
 
diff --git a/libs/rs/rsSimpleMesh.cpp b/libs/rs/rsSimpleMesh.cpp
index 6ec1a3b..e5c2eb5 100644
--- a/libs/rs/rsSimpleMesh.cpp
+++ b/libs/rs/rsSimpleMesh.cpp
@@ -70,7 +70,11 @@
     VertexArray va;
     for (uint32_t ct=0; ct < mVertexTypeCount; ct++) {
         mVertexBuffers[ct]->uploadCheck(rsc);
-        va.setActiveBuffer(mVertexBuffers[ct]->getBufferObjectID());
+        if (mVertexBuffers[ct]->getIsBufferObject()) {
+            va.setActiveBuffer(mVertexBuffers[ct]->getBufferObjectID());
+        } else {
+            va.setActiveBuffer(mVertexBuffers[ct]->getPtr());
+        }
         mVertexTypes[ct]->enableGLVertexBuffer(&va);
     }
     va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
diff --git a/libs/rs/rsVertexArray.cpp b/libs/rs/rsVertexArray.cpp
index a13371a..ef892a5 100644
--- a/libs/rs/rsVertexArray.cpp
+++ b/libs/rs/rsVertexArray.cpp
@@ -84,6 +84,7 @@
     rsAssert(mCount < RS_MAX_ATTRIBS);
     mAttribs[mCount].set(a);
     mAttribs[mCount].buffer = mActiveBuffer;
+    mAttribs[mCount].ptr = mActivePointer;
     mAttribs[mCount].stride = stride;
     mCount ++;
 }
@@ -96,16 +97,19 @@
     mAttribs[mCount].size = size;
     mAttribs[mCount].offset = offset;
     mAttribs[mCount].normalized = normalized;
-    mAttribs[mCount].buffer = mActiveBuffer;
     mAttribs[mCount].stride = stride;
     mAttribs[mCount].name.setTo(name);
+
+    mAttribs[mCount].buffer = mActiveBuffer;
+    mAttribs[mCount].ptr = mActivePointer;
     mCount ++;
 }
 
 void VertexArray::logAttrib(uint32_t idx, uint32_t slot) const {
-    LOGE("va %i: slot=%i name=%s buf=%i  size=%i  type=0x%x  stride=0x%x  norm=%i  offset=0x%x", idx, slot,
+    LOGE("va %i: slot=%i name=%s buf=%i ptr=%p size=%i  type=0x%x  stride=0x%x  norm=%i  offset=0x%x", idx, slot,
          mAttribs[idx].name.string(),
          mAttribs[idx].buffer,
+         mAttribs[idx].ptr,
          mAttribs[idx].size,
          mAttribs[idx].type,
          mAttribs[idx].stride,
@@ -154,7 +158,7 @@
                               mAttribs[ct].type,
                               mAttribs[ct].normalized,
                               mAttribs[ct].stride,
-                              (void *)mAttribs[ct].offset);
+                              mAttribs[ct].ptr + mAttribs[ct].offset);
     }
     state->mLastEnableCount = mCount;
     rsc->checkError("VertexArray::setupGL2 done");
diff --git a/libs/rs/rsVertexArray.h b/libs/rs/rsVertexArray.h
index e5b51d7..7c609b2 100644
--- a/libs/rs/rsVertexArray.h
+++ b/libs/rs/rsVertexArray.h
@@ -37,6 +37,7 @@
     class Attrib {
     public:
         uint32_t buffer;
+        const uint8_t * ptr;
         uint32_t offset;
         uint32_t type;
         uint32_t size;
@@ -51,7 +52,15 @@
 
 
     void clearAll();
-    void setActiveBuffer(uint32_t id) {mActiveBuffer = id;}
+    void setActiveBuffer(uint32_t id) {
+        mActiveBuffer = id;
+        mActivePointer = NULL;
+    }
+    void setActiveBuffer(const void *ptr) {
+        mActiveBuffer = 0;
+        mActivePointer = (const uint8_t *)ptr;
+    }
+
     void add(const Attrib &, uint32_t stride);
     //void addLegacy(uint32_t type, uint32_t size, uint32_t stride, bool normalized, uint32_t offset);
     void add(uint32_t type, uint32_t size, uint32_t stride, bool normalized, uint32_t offset, const char *name);
@@ -63,6 +72,7 @@
 protected:
     void clear(uint32_t index);
     uint32_t mActiveBuffer;
+    const uint8_t * mActivePointer;
     uint32_t mCount;
 
     Attrib mAttribs[RS_MAX_ATTRIBS];