Index: src/gpu/gl/GrGLProgram.cpp |
=================================================================== |
--- src/gpu/gl/GrGLProgram.cpp (revision 8436) |
+++ src/gpu/gl/GrGLProgram.cpp (working copy) |
@@ -417,9 +417,7 @@ |
bool GrGLProgram::genProgram(const GrEffectStage* stages[]) { |
GrAssert(0 == fProgramID); |
- const GrAttribBindings& attribBindings = fDesc.fAttribBindings; |
- bool hasExplicitLocalCoords = |
- SkToBool(attribBindings & GrDrawState::kLocalCoords_AttribBindingsBit); |
+ bool hasExplicitLocalCoords = -1 != fDesc.fLocalCoordAttributeIndex; |
GrGLShaderBuilder builder(fContext.info(), fUniformManager, hasExplicitLocalCoords); |
#if GR_GL_EXPERIMENTAL_GS |
@@ -705,14 +703,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(); |
@@ -791,8 +792,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.fSamplerUnis[s].count(); |
@@ -812,15 +812,23 @@ |
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; |
+ // Reset const coverage if it previously had the same index as us |
+ if (sharedState->fConstAttribColorIndex == |
+ sharedState->fConstAttribCoverageIndex) { |
+ sharedState->fConstAttribCoverageIndex = -1; |
+ } |
} |
break; |
case GrGLProgramDesc::kUniform_ColorInput: |
@@ -846,15 +854,22 @@ |
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; |
+ // Reset const color if it previously had the same index as us |
+ if (sharedState->fConstAttribCoverageIndex == |
+ sharedState->fConstAttribColorIndex) { |
+ sharedState->fConstAttribColorIndex = -1; |
+ } |
} |
break; |
case GrGLProgramDesc::kUniform_ColorInput: |