More robust attribute binding
Adding attribute and uniform debug logging.
Checking to see if aniso filtering is available.

Change-Id: I2ed9d166ed7ff3df971d7af18b7a33f4e3ade928
diff --git a/libs/rs/rsShaderCache.h b/libs/rs/rsShaderCache.h
index df99ccc..312c251 100644
--- a/libs/rs/rsShaderCache.h
+++ b/libs/rs/rsShaderCache.h
@@ -40,22 +40,22 @@
 
     void cleanupAll();
 
-    int32_t vtxAttribSlot(uint32_t a) const {return mCurrent->mVtxAttribSlots[a];}
+    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];}
-    bool isUserVertexProgram() const {return mCurrent->mUserVertexProgram;}
 
 protected:
     typedef struct {
         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 mUserVertexProgram;
         bool mIsValid;
     } entry_t;
     entry_t *mEntries;