| Index: src/gpu/gl/GrGLProgram.cpp
 | 
| ===================================================================
 | 
| --- src/gpu/gl/GrGLProgram.cpp	(revision 8462)
 | 
| +++ src/gpu/gl/GrGLProgram.cpp	(working copy)
 | 
| @@ -705,14 +705,17 @@
 | 
|      GL_CALL(BindAttribLocation(fProgramID,
 | 
|                                 fDesc.fPositionAttributeIndex,
 | 
|                                 builder.positionAttribute().c_str()));
 | 
| -    GL_CALL(BindAttribLocation(fProgramID, fDesc.fColorAttributeIndex, COL_ATTR_NAME));
 | 
| -    GL_CALL(BindAttribLocation(fProgramID, fDesc.fCoverageAttributeIndex, COV_ATTR_NAME));
 | 
| -
 | 
| -    if (fDesc.fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit) {
 | 
| +    if (-1 != fDesc.fLocalCoordAttributeIndex) {
 | 
|          GL_CALL(BindAttribLocation(fProgramID,
 | 
| -                                   fDesc.fLocalCoordsAttributeIndex,
 | 
| +                                   fDesc.fLocalCoordAttributeIndex,
 | 
|                                     builder.localCoordsAttribute().c_str()));
 | 
|      }
 | 
| +    if (-1 != fDesc.fColorAttributeIndex) {
 | 
| +        GL_CALL(BindAttribLocation(fProgramID, fDesc.fColorAttributeIndex, COL_ATTR_NAME));
 | 
| +    }
 | 
| +    if (-1 != fDesc.fCoverageAttributeIndex) {
 | 
| +        GL_CALL(BindAttribLocation(fProgramID, fDesc.fCoverageAttributeIndex, COV_ATTR_NAME));
 | 
| +    }
 | 
|  
 | 
|      const GrGLShaderBuilder::AttributePair* attribEnd = builder.getEffectAttributes().end();
 | 
|      for (const GrGLShaderBuilder::AttributePair* attrib = builder.getEffectAttributes().begin();
 | 
| @@ -826,8 +829,7 @@
 | 
|              const GrEffectStage& stage = drawState.getStage(s);
 | 
|              GrAssert(NULL != stage.getEffect());
 | 
|  
 | 
| -            bool explicitLocalCoords =
 | 
| -                (fDesc.fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit);
 | 
| +            bool explicitLocalCoords = -1 != fDesc.fLocalCoordAttributeIndex;
 | 
|              GrDrawEffect drawEffect(stage, explicitLocalCoords);
 | 
|              fEffects[s]->setData(fUniformManager, drawEffect);
 | 
|              int numSamplers = fUniformHandles.fEffectSamplerUnis[s].count();
 | 
| @@ -847,15 +849,18 @@
 | 
|  void GrGLProgram::setColor(const GrDrawState& drawState,
 | 
|                             GrColor color,
 | 
|                             SharedGLState* sharedState) {
 | 
| -    if (!(drawState.getAttribBindings() & GrDrawState::kColor_AttribBindingsBit)) {
 | 
| +    if (!drawState.hasColorVertexAttribute()) {
 | 
|          switch (fDesc.fColorInput) {
 | 
|              case GrGLProgramDesc::kAttribute_ColorInput:
 | 
| -                if (sharedState->fConstAttribColor != color) {
 | 
| +                GrAssert(-1 != fDesc.fColorAttributeIndex);
 | 
| +                if (sharedState->fConstAttribColor != color ||
 | 
| +                    sharedState->fConstAttribColorIndex != fDesc.fColorAttributeIndex) {
 | 
|                      // OpenGL ES only supports the float varieties of glVertexAttrib
 | 
|                      GrGLfloat c[4];
 | 
|                      GrColorToRGBAFloat(color, c);
 | 
|                      GL_CALL(VertexAttrib4fv(fDesc.fColorAttributeIndex, c));
 | 
|                      sharedState->fConstAttribColor = color;
 | 
| +                    sharedState->fConstAttribColorIndex = fDesc.fColorAttributeIndex;
 | 
|                  }
 | 
|                  break;
 | 
|              case GrGLProgramDesc::kUniform_ColorInput:
 | 
| @@ -868,28 +873,34 @@
 | 
|                      fUniformManager.set4fv(fUniformHandles.fColorUni, 0, 1, c);
 | 
|                      fColor = color;
 | 
|                  }
 | 
| +                sharedState->fConstAttribColorIndex = -1;
 | 
|                  break;
 | 
|              case GrGLProgramDesc::kSolidWhite_ColorInput:
 | 
|              case GrGLProgramDesc::kTransBlack_ColorInput:
 | 
| +                sharedState->fConstAttribColorIndex = -1;
 | 
|                  break;
 | 
|              default:
 | 
|                  GrCrash("Unknown color type.");
 | 
|          }
 | 
| +    } else {
 | 
| +        sharedState->fConstAttribColorIndex = -1;
 | 
|      }
 | 
|  }
 | 
|  
 | 
|  void GrGLProgram::setCoverage(const GrDrawState& drawState,
 | 
|                                GrColor coverage,
 | 
|                                SharedGLState* sharedState) {
 | 
| -    if (!(drawState.getAttribBindings() & GrDrawState::kCoverage_AttribBindingsBit)) {
 | 
| +    if (!drawState.hasCoverageVertexAttribute()) {
 | 
|          switch (fDesc.fCoverageInput) {
 | 
|              case GrGLProgramDesc::kAttribute_ColorInput:
 | 
| -                if (sharedState->fConstAttribCoverage != coverage) {
 | 
| +                if (sharedState->fConstAttribCoverage != coverage ||
 | 
| +                    sharedState->fConstAttribCoverageIndex != fDesc.fCoverageAttributeIndex) {
 | 
|                      // OpenGL ES only supports the float varieties of  glVertexAttrib
 | 
|                      GrGLfloat c[4];
 | 
|                      GrColorToRGBAFloat(coverage, c);
 | 
|                      GL_CALL(VertexAttrib4fv(fDesc.fCoverageAttributeIndex, c));
 | 
|                      sharedState->fConstAttribCoverage = coverage;
 | 
| +                    sharedState->fConstAttribCoverageIndex = fDesc.fCoverageAttributeIndex;
 | 
|                  }
 | 
|                  break;
 | 
|              case GrGLProgramDesc::kUniform_ColorInput:
 | 
| @@ -902,13 +913,17 @@
 | 
|                      fUniformManager.set4fv(fUniformHandles.fCoverageUni, 0, 1, c);
 | 
|                      fCoverage = coverage;
 | 
|                  }
 | 
| +                sharedState->fConstAttribCoverageIndex = -1;
 | 
|                  break;
 | 
|              case GrGLProgramDesc::kSolidWhite_ColorInput:
 | 
|              case GrGLProgramDesc::kTransBlack_ColorInput:
 | 
| +                sharedState->fConstAttribCoverageIndex = -1;
 | 
|                  break;
 | 
|              default:
 | 
|                  GrCrash("Unknown coverage type.");
 | 
|          }
 | 
| +    } else {
 | 
| +        sharedState->fConstAttribCoverageIndex = -1;
 | 
|      }
 | 
|  }
 | 
|  
 | 
| 
 |