Add RS support for generic attribs as input to vertex programs.
diff --git a/rsProgramVertex.cpp b/rsProgramVertex.cpp
index fe628ca..b207558 100644
--- a/rsProgramVertex.cpp
+++ b/rsProgramVertex.cpp
@@ -116,12 +116,6 @@
 {
     mShader.setTo("");
 
-    for (uint32_t ct=0; ct < mAttribCount; ct++) {
-        mShader.append("attribute vec4 ");
-        mShader.append(mAttribNames[ct]);
-        mShader.append(";\n");
-    }
-
     for (uint32_t ct=0; ct < mUniformCount; ct++) {
         mShader.append("uniform mat4 ");
         mShader.append(mUniformNames[ct]);
@@ -132,8 +126,34 @@
     mShader.append("varying vec4 varTex0;\n");
 
     if (mUserShader.length() > 1) {
+        for (uint32_t ct=0; ct < mInputCount; ct++) {
+            const Element *e = mInputElements[ct].get();
+            for (uint32_t field=0; field < e->getFieldCount(); field++) {
+                const Element *f = e->getField(field);
+
+                // Cannot be complex
+                rsAssert(!f->getFieldCount());
+                switch(f->getComponent().getVectorSize()) {
+                case 1: mShader.append("attribute float ATTRIB_"); break;
+                case 2: mShader.append("attribute vec2 ATTRIB_"); break;
+                case 3: mShader.append("attribute vec3 ATTRIB_"); break;
+                case 4: mShader.append("attribute vec4 ATTRIB_"); break;
+                default:
+                    rsAssert(0);
+                }
+
+                mShader.append(e->getFieldName(field));
+                mShader.append(";\n");
+            }
+        }
         mShader.append(mUserShader);
     } else {
+        for (uint32_t ct=0; ct < mAttribCount; ct++) {
+            mShader.append("attribute vec4 ");
+            mShader.append(mAttribNames[ct]);
+            mShader.append(";\n");
+        }
+
         mShader.append("void main() {\n");
         mShader.append("  gl_Position = uni_MVP * attrib_Position;\n");
         mShader.append("  gl_PointSize = attrib_PointSize.x;\n");