Moving attrib creation to Mesh. Adding arrays as shader inputs.
Removing fixed size arrays.

Change-Id: I0213e403a2f1283dd43f21bea770aeb059561903
diff --git a/libs/rs/rsShaderCache.h b/libs/rs/rsShaderCache.h
index 35ff95b..6b49e5f 100644
--- a/libs/rs/rsShaderCache.h
+++ b/libs/rs/rsShaderCache.h
@@ -41,30 +41,86 @@
     void cleanupAll();
 
     int32_t vtxAttribSlot(const String8 &attrName) const;
-    int32_t vtxUniformSlot(uint32_t a) const {return mCurrent->mVtxUniformSlots[a];}
-    int32_t fragAttribSlot(uint32_t a) const {return mCurrent->mFragAttribSlots[a];}
-    int32_t fragUniformSlot(uint32_t a) const {return mCurrent->mFragUniformSlots[a];}
+    int32_t vtxUniformSlot(uint32_t a) const {return mCurrent->vtxUniforms[a].slot;}
+    uint32_t vtxUniformSize(uint32_t a) const {return mCurrent->vtxUniforms[a].arraySize;}
+    int32_t fragUniformSlot(uint32_t a) const {return mCurrent->fragUniforms[a].slot;}
+    uint32_t fragUniformSize(uint32_t a) const {return mCurrent->fragUniforms[a].arraySize;}
 
 protected:
-    typedef struct {
+    struct UniformQueryData {
+        char *name;
+        uint32_t nameLength;
+        int32_t writtenLength;
+        int32_t arraySize;
+        uint32_t type;
+        UniformQueryData(uint32_t maxName) {
+            name = NULL;
+            nameLength = maxName;
+            if(nameLength > 0 ) {
+                name = new char[nameLength];
+            }
+        }
+        ~UniformQueryData() {
+            if(name != NULL) {
+                delete[] name;
+                name = NULL;
+            }
+        }
+    };
+    struct UniformData {
+        int32_t slot;
+        uint32_t arraySize;
+    };
+    struct AttrData {
+        int32_t slot;
+        const char* name;
+    };
+    struct ProgramEntry {
+        ProgramEntry(uint32_t numVtxAttr, uint32_t numVtxUnis,
+                     uint32_t numFragUnis) : vtx(0), frag(0), program(0), vtxAttrCount(0),
+                                             vtxAttrs(0), vtxUniforms(0), fragUniforms(0) {
+            vtxAttrCount = numVtxAttr;
+            if(numVtxAttr) {
+                vtxAttrs = new AttrData[numVtxAttr];
+            }
+            if(numVtxUnis) {
+                vtxUniforms = new UniformData[numVtxUnis];
+            }
+            if(numFragUnis) {
+                fragUniforms = new UniformData[numFragUnis];
+            }
+        }
+        ~ProgramEntry() {
+            if(vtxAttrs) {
+                delete[] vtxAttrs;
+                vtxAttrs = NULL;
+            }
+            if(vtxUniforms) {
+                delete[] vtxUniforms;
+                vtxUniforms = NULL;
+            }
+            if(fragUniforms) {
+                delete[] fragUniforms;
+                fragUniforms = NULL;
+            }
+        }
         uint32_t vtx;
         uint32_t frag;
         uint32_t program;
         uint32_t vtxAttrCount;
-        const char* mVtxAttribNames[Program::MAX_ATTRIBS];
-        int32_t mVtxAttribSlots[Program::MAX_ATTRIBS];
-        int32_t mVtxUniformSlots[Program::MAX_UNIFORMS];
-        int32_t mFragAttribSlots[Program::MAX_ATTRIBS];
-        int32_t mFragUniformSlots[Program::MAX_UNIFORMS];
-        bool mIsValid;
-    } entry_t;
-    //entry_t *mEntries;
-    Vector<entry_t*> mEntries;
-    entry_t *mCurrent;
+        AttrData *vtxAttrs;
+        UniformData *vtxUniforms;
+        UniformData *fragUniforms;
 
-    /*uint32_t mEntryCount;
-    uint32_t mEntryAllocationCount;*/
+    };
+    Vector<ProgramEntry*> mEntries;
+    ProgramEntry *mCurrent;
 
+    bool hasArrayUniforms(ProgramVertex *vtx, ProgramFragment *frag);
+    void populateUniformData(Program *prog, uint32_t linkedID, UniformData *data);
+    void updateUniformArrayData(Context *rsc, Program *prog, uint32_t linkedID,
+                                UniformData *data, const char* logTag,
+                                UniformQueryData **uniformList, uint32_t uniListSize);
 };