| 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;
|
| }
|
|
|
|
|