Rolling back r8466. 

Not reviewed.


git-svn-id: http://skia.googlecode.com/svn/trunk@8467 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tests/GLProgramsTest.cpp b/tests/GLProgramsTest.cpp
index 675d0c1..512f89e 100644
--- a/tests/GLProgramsTest.cpp
+++ b/tests/GLProgramsTest.cpp
@@ -24,30 +24,18 @@
 void GrGLProgramDesc::setRandom(SkMWCRandom* random,
                                 const GrGpuGL* gpu,
                                 const GrTexture* dstTexture,
-                                const GrEffectStage stages[GrDrawState::kNumStages],
-                                int currAttribIndex) {
+                                const GrEffectStage stages[GrDrawState::kNumStages]) {
+    fAttribBindings = 0;
     fEmitsPointSize = random->nextBool();
-
-    fPositionAttributeIndex = 0;
-
-    // if the effects have used up all off the available attributes, 
-    // don't try to use color or coverage attributes as input
-    do {
-        fColorInput = random->nextULessThan(kColorInputCnt);
-    } while (GrDrawState::kMaxVertexAttribCnt <= currAttribIndex && 
-             kAttribute_ColorInput == fColorInput);
-    fColorAttributeIndex = (fColorInput == kAttribute_ColorInput) ? currAttribIndex++ : -1;
-
-    do {
-        fCoverageInput = random->nextULessThan(kColorInputCnt);
-    } while (GrDrawState::kMaxVertexAttribCnt <= currAttribIndex  &&
-             kAttribute_ColorInput == fCoverageInput);
-    fCoverageAttributeIndex = (fCoverageInput == kAttribute_ColorInput) ? currAttribIndex++ : -1;
+    fColorInput = random->nextULessThan(kColorInputCnt);
+    fCoverageInput = random->nextULessThan(kColorInputCnt);
 
     fColorFilterXfermode = random->nextULessThan(SkXfermode::kCoeffModesCnt);
 
     fFirstCoverageStage = random->nextULessThan(GrDrawState::kNumStages);
 
+    fAttribBindings |= random->nextBool() ? GrDrawState::kCoverage_AttribBindingsBit : 0;
+
 #if GR_GL_EXPERIMENTAL_GS
     fExperimentalGS = gpu->caps()->geometryShaderSupport() && random->nextBool();
 #endif
@@ -60,14 +48,18 @@
         fDualSrcOutput = kNone_DualSrcOutput;
     }
 
-    bool useLocalCoords = random->nextBool() && currAttribIndex < GrDrawState::kMaxVertexAttribCnt;
-    fLocalCoordAttributeIndex = useLocalCoords ? currAttribIndex++ : -1;
+    // use separate tex coords?
+    if (random->nextBool()) {
+        fAttribBindings |= GrDrawState::kLocalCoords_AttribBindingsBit;
+    }
 
     bool dstRead = false;
     for (int s = 0; s < GrDrawState::kNumStages; ++s) {
         if (NULL != stages[s].getEffect()) {
             const GrBackendEffectFactory& factory = (*stages[s].getEffect())->getFactory();
-            GrDrawEffect drawEffect(stages[s], useLocalCoords);
+            bool explicitLocalCoords = (fAttribBindings &
+                                        GrDrawState::kLocalCoords_AttribBindingsBit);
+            GrDrawEffect drawEffect(stages[s], explicitLocalCoords);
             fEffectKeys[s] = factory.glEffectKey(drawEffect, gpu->glCaps());
             if ((*stages[s].getEffect())->willReadDst()) {
                 dstRead = true;
@@ -78,6 +70,22 @@
     if (dstRead) {
         this->fDstRead = GrGLShaderBuilder::KeyForDstRead(dstTexture, gpu->glCaps());
     }
+
+    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::kLocalCoords_AttribBindingsBit) {
+        fLocalCoordsAttributeIndex = attributeIndex;
+        ++attributeIndex;
+    }
 }
 
 bool GrGpuGL::programUnitTest(int maxStages) {
@@ -110,7 +118,7 @@
         GrGLProgramDesc pdesc;
         GrEffectStage stages[GrDrawState::kNumStages];
 
-        int currAttribIndex = 1;  // we need to always leave room for position
+        int currAttribIndex = GrDrawState::kAttribIndexCount;
         int attribIndices[2];
         GrTexture* dummyTextures[] = {dummyTexture1.get(), dummyTexture2.get()};
         for (int s = 0; s < maxStages; ++s) {
@@ -123,9 +131,10 @@
                                                                                 dummyTextures));
                 int numAttribs = (*effect)->numVertexAttribs();
 
-                // If adding this effect would exceed the max attrib count then generate a
-                // new random effect. 
-                if (currAttribIndex + numAttribs > GrDrawState::kMaxVertexAttribCnt) {
+                // If adding this effect would cause to exceed the max attrib count then generate a
+                // new random effect. The explanation for why this check is correct is a bit
+                // convoluted and this code will be removed soon.
+                if (currAttribIndex + numAttribs > GrDrawState::kCoverageOverrideAttribIndexValue) {
                     --s;
                     continue;
                 }
@@ -136,8 +145,8 @@
             }
         }
         const GrTexture* dstTexture = random.nextBool() ? dummyTextures[0] : dummyTextures[1];
-        pdesc.setRandom(&random, this, dstTexture, stages, currAttribIndex);
- 
+        pdesc.setRandom(&random, this, dstTexture, stages);
+
         const GrEffectStage* stagePtrs[GrDrawState::kNumStages];
         for (int s = 0; s < GrDrawState::kNumStages; ++s) {
             stagePtrs[s] = &stages[s];