| Index: tests/GLProgramsTest.cpp | 
| diff --git a/tests/GLProgramsTest.cpp b/tests/GLProgramsTest.cpp | 
| index a641fe2314aa7b092ec5d9ba6917a260d5ddf1d2..931789c8ef0213ba5b23abb3293e19e10189c575 100644 | 
| --- a/tests/GLProgramsTest.cpp | 
| +++ b/tests/GLProgramsTest.cpp | 
| @@ -162,6 +162,37 @@ bool GrGLProgramDesc::setRandom(SkRandom* random, | 
| return true; | 
| } | 
|  | 
| +// TODO clean this up, we have to do this to test geometry processors but there has got to be | 
| +// a better way.  In the mean time, we actually fill out these generic vertex attribs below with | 
| +// the correct vertex attribs from the GP.  We have to ensure, however, we don't try to add more | 
| +// than two attributes. | 
| +GrVertexAttrib genericVertexAttribs[] = { | 
| +    { kVec2f_GrVertexAttribType, 0,   kPosition_GrVertexAttribBinding }, | 
| +    { kVec2f_GrVertexAttribType, 0,   kEffect_GrVertexAttribBinding }, | 
| +    { kVec2f_GrVertexAttribType, 0,   kEffect_GrVertexAttribBinding } | 
| +}; | 
| + | 
| +/* | 
| + * convert sl type to vertexattrib type, not a complete implementation, only use for debugging | 
| + */ | 
| +GrVertexAttribType convert_sltype_to_attribtype(GrSLType type) { | 
| +    switch (type) { | 
| +        case kFloat_GrSLType: | 
| +            return kFloat_GrVertexAttribType; | 
| +        case kVec2f_GrSLType: | 
| +            return kVec2f_GrVertexAttribType; | 
| +        case kVec3f_GrSLType: | 
| +            return kVec3f_GrVertexAttribType; | 
| +        case kVec4f_GrSLType: | 
| +            return kVec4f_GrVertexAttribType; | 
| +        default: | 
| +            SkFAIL("Type isn't convertible"); | 
| +            return kFloat_GrVertexAttribType; | 
| +    } | 
| +} | 
| +// TODO end test hack | 
| + | 
| + | 
| bool GrGpuGL::programUnitTest(int maxStages) { | 
|  | 
| GrTextureDesc dummyDesc; | 
| @@ -197,7 +228,6 @@ bool GrGpuGL::programUnitTest(int maxStages) { | 
|  | 
| int currAttribIndex = 1;  // we need to always leave room for position | 
| int currTextureCoordSet = 0; | 
| -        int attribIndices[2] = { 0, 0 }; | 
| GrTexture* dummyTextures[] = {dummyTexture1.get(), dummyTexture2.get()}; | 
|  | 
| int numStages = random.nextULessThan(maxStages + 1); | 
| @@ -220,19 +250,32 @@ bool GrGpuGL::programUnitTest(int maxStages) { | 
| *this->caps(), | 
| dummyTextures)); | 
| SkASSERT(effect); | 
| - | 
| // Only geometryProcessor can use vertex shader | 
| if (!effect->requiresVertexShader()) { | 
| continue; | 
| } | 
|  | 
| -                int numAttribs = effect->numVertexAttribs(); | 
| -                for (int i = 0; i < numAttribs; ++i) { | 
| -                    attribIndices[i] = currAttribIndex++; | 
| -                } | 
| -                GrEffectStage* stage = SkNEW_ARGS(GrEffectStage, | 
| -                                                  (effect.get(), attribIndices[0], attribIndices[1])); | 
| +                GrEffectStage* stage = SkNEW_ARGS(GrEffectStage, (effect.get())); | 
| geometryProcessor.reset(stage); | 
| + | 
| +                // we have to set dummy vertex attribs | 
| +                const GrEffect::VertexAttribArray& v = effect->getVertexAttribs(); | 
| +                int numVertexAttribs = v.count(); | 
| + | 
| +                SkASSERT(GrEffect::kMaxVertexAttribs == 2 && | 
| +                         GrEffect::kMaxVertexAttribs >= numVertexAttribs); | 
| +                size_t runningStride = GrVertexAttribTypeSize(genericVertexAttribs[0].fType); | 
| +                for (int i = 0; i < numVertexAttribs; i++) { | 
| +                    genericVertexAttribs[i + 1].fOffset = runningStride; | 
| +                    genericVertexAttribs[i + 1].fType = | 
| +                            convert_sltype_to_attribtype(v[i].getType()); | 
| +                    runningStride += GrVertexAttribTypeSize(genericVertexAttribs[i + 1].fType); | 
| +                } | 
| + | 
| +                // update the vertex attributes with the ds | 
| +                GrDrawState* ds = this->drawState(); | 
| +                ds->setVertexAttribs<genericVertexAttribs>(numVertexAttribs + 1, runningStride); | 
| +                currAttribIndex = numVertexAttribs + 1; | 
| break; | 
| } | 
| } | 
| @@ -258,8 +301,7 @@ bool GrGpuGL::programUnitTest(int maxStages) { | 
| } | 
| currTextureCoordSet += numTransforms; | 
| } | 
| -            GrEffectStage* stage = SkNEW_ARGS(GrEffectStage, | 
| -                                              (effect.get(), attribIndices[0], attribIndices[1])); | 
| +            GrEffectStage* stage = SkNEW_ARGS(GrEffectStage, (effect.get())); | 
|  | 
| stages[s] = stage; | 
| ++s; | 
| @@ -288,6 +330,9 @@ bool GrGpuGL::programUnitTest(int maxStages) { | 
| if (NULL == program.get()) { | 
| return false; | 
| } | 
| + | 
| +        // We have to reset the drawstate because we might have added a gp | 
| +        this->drawState()->reset(); | 
| } | 
| return true; | 
| } | 
|  |