Index: src/gpu/gl/GrGLShaderBuilder.cpp |
diff --git a/src/gpu/gl/GrGLShaderBuilder.cpp b/src/gpu/gl/GrGLShaderBuilder.cpp |
index f4ffb4dd2ce2f071743c9c3d08b3edb7abaa4d56..e48295c91eafc489b0da5ff01e2eae7ec648f6cc 100644 |
--- a/src/gpu/gl/GrGLShaderBuilder.cpp |
+++ b/src/gpu/gl/GrGLShaderBuilder.cpp |
@@ -116,8 +116,6 @@ GrGLShaderBuilder::GrGLShaderBuilder(GrGpuGL* gpu, |
, fFSInputs(kVarsPerBlock) |
, fFSOutputs(kMaxFSOutputs) |
, fSetupFragPosition(false) |
- , fKnownColorValue(kNone_GrSLConstantVec) |
- , fKnownCoverageValue(kNone_GrSLConstantVec) |
, fHasCustomColorOutput(false) |
, fHasSecondaryOutput(false) |
, fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.getHeader().fFragPosKey) { |
@@ -180,10 +178,10 @@ GrGLShaderBuilder::GrGLShaderBuilder(GrGpuGL* gpu, |
break; |
} |
case GrGLProgramDesc::kTransBlack_ColorInput: |
- fKnownColorValue = kZeros_GrSLConstantVec; |
+ fInputColor = GrGLSLExpr<4>(0); |
break; |
case GrGLProgramDesc::kSolidWhite_ColorInput: |
- fKnownColorValue = kOnes_GrSLConstantVec; |
+ fInputColor = GrGLSLExpr<4>(1); |
break; |
default: |
GrCrash("Unknown color type."); |
@@ -207,10 +205,10 @@ GrGLShaderBuilder::GrGLShaderBuilder(GrGpuGL* gpu, |
break; |
} |
case GrGLProgramDesc::kTransBlack_ColorInput: |
- fKnownCoverageValue = kZeros_GrSLConstantVec; |
+ fInputCoverage = GrGLSLExpr<4>(0); |
break; |
case GrGLProgramDesc::kSolidWhite_ColorInput: |
- fKnownCoverageValue = kOnes_GrSLConstantVec; |
+ fInputCoverage = GrGLSLExpr<4>(1); |
break; |
default: |
GrCrash("Unknown coverage type."); |
@@ -344,7 +342,7 @@ void GrGLShaderBuilder::fsAppendTextureLookupAndModulate( |
GrSLType varyingType) { |
SkString lookup; |
this->appendTextureLookup(&lookup, sampler, coordName, varyingType); |
- GrGLSLModulatef<4>(&fFSCode, modulation, lookup.c_str()); |
+ fFSCode.append((GrGLSLExpr<4>(modulation) * GrGLSLExpr<4>(lookup)).c_str()); |
} |
GrBackendEffectFactory::EffectKey GrGLShaderBuilder::KeyForTextureAccess( |
@@ -561,14 +559,13 @@ void GrGLShaderBuilder::emitEffects( |
const GrEffectStage* effectStages[], |
const GrBackendEffectFactory::EffectKey effectKeys[], |
int effectCnt, |
- SkString* fsInOutColor, |
- GrSLConstantVec* fsInOutColorKnownValue, |
+ GrGLSLExpr<4>* fsInOutColor, |
SkTArray<GrGLUniformManager::UniformHandle, true>* effectSamplerHandles[], |
GrGLEffect* glEffects[]) { |
bool effectEmitted = false; |
- SkString inColor = *fsInOutColor; |
- SkString outColor; |
+ GrGLSLExpr<4> inColor = *fsInOutColor; |
+ GrGLSLExpr<4> outColor; |
for (int e = 0; e < effectCnt; ++e) { |
SkASSERT(NULL != effectStages[e] && NULL != effectStages[e]->getEffect()); |
@@ -602,15 +599,19 @@ void GrGLShaderBuilder::emitEffects( |
glEffects[e] = effect->getFactory().createGLInstance(drawEffect); |
- if (kZeros_GrSLConstantVec == *fsInOutColorKnownValue) { |
+ if (inColor.isZeros()) { |
+ SkString inColorName; |
// Effects have no way to communicate zeros, they treat an empty string as ones. |
- this->nameVariable(&inColor, '\0', "input"); |
- this->fsCodeAppendf("\tvec4 %s = %s;\n", inColor.c_str(), GrGLSLZerosVecf(4)); |
+ this->nameVariable(&inColorName, '\0', "input"); |
+ this->fsCodeAppendf("\tvec4 %s = %s;\n", inColorName.c_str(), inColor.c_str()); |
+ inColor = inColorName; |
} |
// create var to hold stage result |
- this->nameVariable(&outColor, '\0', "output"); |
- this->fsCodeAppendf("\tvec4 %s;\n", outColor.c_str()); |
+ SkString outColorName; |
+ this->nameVariable(&outColorName, '\0', "output"); |
+ this->fsCodeAppendf("\tvec4 %s;\n", outColorName.c_str()); |
+ outColor = outColorName; |
// Enclose custom code in a block to avoid namespace conflicts |
SkString openBrace; |
@@ -624,7 +625,7 @@ void GrGLShaderBuilder::emitEffects( |
drawEffect, |
effectKeys[e], |
outColor.c_str(), |
- inColor.isEmpty() ? NULL : inColor.c_str(), |
+ inColor.isOnes() ? NULL : inColor.c_str(), |
textureSamplers); |
if (NULL != fVertexBuilder.get()) { |
@@ -633,7 +634,6 @@ void GrGLShaderBuilder::emitEffects( |
this->fsCodeAppend("\t}\n"); |
inColor = outColor; |
- *fsInOutColorKnownValue = kNone_GrSLConstantVec; |
effectEmitted = true; |
} |