Add new vertex attribute array specification.

This changes the old method of setting vertex layout to a new one where we
specify vertex attribute data separately from attribute bindings (i.e. program
functionality). Attribute data is now set up via an array of generic attribute
types and offsets, and this is mapped to the old program functionality by
setting specific attribute indices. This allows us to create more general 
inputs to shaders.


git-svn-id: http://skia.googlecode.com/svn/trunk@7899 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tests/GLProgramsTest.cpp b/tests/GLProgramsTest.cpp
index 0c660d9..3c9af5c 100644
--- a/tests/GLProgramsTest.cpp
+++ b/tests/GLProgramsTest.cpp
@@ -23,7 +23,7 @@
 void GrGLProgram::Desc::setRandom(SkMWCRandom* random,
                                   const GrGpuGL* gpu,
                                   const GrEffectStage stages[GrDrawState::kNumStages]) {
-    fVertexLayout = 0;
+    fAttribBindings = 0;
     fEmitsPointSize = random->nextBool();
     fColorInput = random->nextULessThan(kColorInputCnt);
     fCoverageInput = random->nextULessThan(kColorInputCnt);
@@ -32,7 +32,7 @@
 
     fFirstCoverageStage = random->nextULessThan(GrDrawState::kNumStages);
 
-    fVertexLayout |= random->nextBool() ? GrDrawState::kCoverage_VertexLayoutBit : 0;
+    fAttribBindings |= random->nextBool() ? GrDrawState::kCoverage_AttribBindingsBit : 0;
 
 #if GR_GL_EXPERIMENTAL_GS
     fExperimentalGS = gpu->getCaps().geometryShaderSupport() && random->nextBool();
@@ -40,7 +40,7 @@
 
     bool edgeAA = random->nextBool();
     if (edgeAA) {
-        fVertexLayout |= GrDrawState::kEdge_VertexLayoutBit;
+        fAttribBindings |= GrDrawState::kEdge_AttribBindingsBit;
         if (gpu->getCaps().shaderDerivativeSupport()) {
             fVertexEdgeType = (GrDrawState::VertexEdgeType)
                               random->nextULessThan(GrDrawState::kVertexEdgeTypeCnt);
@@ -64,11 +64,31 @@
             fEffectKeys[s] = factory.glEffectKey(stages[s], gpu->glCaps());
             // use separate tex coords?
             if (!useOnce && random->nextBool()) {
-                fVertexLayout |= GrDrawState::StageTexCoordVertexLayoutBit(s);
+                fAttribBindings |= GrDrawState::ExplicitTexCoordAttribBindingsBit(s);
                 useOnce = true;
             }
         }
     }
+
+    int attributeIndex = 0;
+    fPositionAttributeIndex = attributeIndex;
+    ++attributeIndex;
+    if (fColorInput || (fAttribBindings & GrDrawState::kColor_AttribBindingsBit)) {
+        fColorAttributeIndex = attributeIndex;
+        ++attributeIndex;
+    }
+    if (fCoverageInput || (fAttribBindings & GrDrawState::kCoverage_AttribBindingsBit)) {
+        fCoverageAttributeIndex = attributeIndex;
+        ++attributeIndex;
+    }
+    if (fAttribBindings & GrDrawState::kEdge_AttribBindingsBit) {
+        fEdgeAttributeIndex = attributeIndex;
+        ++attributeIndex;
+    }
+    if (GrDrawState::AttributesBindExplicitTexCoords(fAttribBindings)) {
+        fTexCoordAttributeIndex = attributeIndex;
+        ++attributeIndex;
+    }
 }
 
 bool GrGpuGL::programUnitTest(int maxStages) {