| Index: src/effects/gradients/SkGradientShader.cpp
|
| diff --git a/src/effects/gradients/SkGradientShader.cpp b/src/effects/gradients/SkGradientShader.cpp
|
| index e486e08a64b95d46ecf650416cc7efeaf4511e1a..8155b1cc61ae7876749a31202a0a5e26e009fe14 100644
|
| --- a/src/effects/gradients/SkGradientShader.cpp
|
| +++ b/src/effects/gradients/SkGradientShader.cpp
|
| @@ -910,8 +910,8 @@ SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
|
| #include "GrInvariantOutput.h"
|
| #include "gl/GrGLContext.h"
|
| #include "glsl/GrGLSLFragmentShaderBuilder.h"
|
| -#include "glsl/GrGLSLProgramBuilder.h"
|
| #include "glsl/GrGLSLProgramDataManager.h"
|
| +#include "glsl/GrGLSLUniformHandler.h"
|
| #include "SkGr.h"
|
|
|
| GrGLGradientEffect::GrGLGradientEffect()
|
| @@ -920,31 +920,32 @@ GrGLGradientEffect::GrGLGradientEffect()
|
|
|
| GrGLGradientEffect::~GrGLGradientEffect() { }
|
|
|
| -void GrGLGradientEffect::emitUniforms(GrGLSLFPBuilder* builder, const GrGradientEffect& ge) {
|
| +void GrGLGradientEffect::emitUniforms(GrGLSLUniformHandler* uniformHandler,
|
| + const GrGradientEffect& ge) {
|
|
|
| if (SkGradientShaderBase::kTwo_GpuColorType == ge.getColorType()) { // 2 Color case
|
| - fColorStartUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| - kVec4f_GrSLType, kDefault_GrSLPrecision,
|
| - "GradientStartColor");
|
| - fColorEndUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| - kVec4f_GrSLType, kDefault_GrSLPrecision,
|
| - "GradientEndColor");
|
| + fColorStartUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility,
|
| + kVec4f_GrSLType, kDefault_GrSLPrecision,
|
| + "GradientStartColor");
|
| + fColorEndUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility,
|
| + kVec4f_GrSLType, kDefault_GrSLPrecision,
|
| + "GradientEndColor");
|
|
|
| } else if (SkGradientShaderBase::kThree_GpuColorType == ge.getColorType()) { // 3 Color Case
|
| - fColorStartUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| - kVec4f_GrSLType, kDefault_GrSLPrecision,
|
| - "GradientStartColor");
|
| - fColorMidUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| - kVec4f_GrSLType, kDefault_GrSLPrecision,
|
| - "GradientMidColor");
|
| - fColorEndUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| - kVec4f_GrSLType, kDefault_GrSLPrecision,
|
| - "GradientEndColor");
|
| + fColorStartUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility,
|
| + kVec4f_GrSLType, kDefault_GrSLPrecision,
|
| + "GradientStartColor");
|
| + fColorMidUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility,
|
| + kVec4f_GrSLType, kDefault_GrSLPrecision,
|
| + "GradientMidColor");
|
| + fColorEndUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility,
|
| + kVec4f_GrSLType, kDefault_GrSLPrecision,
|
| + "GradientEndColor");
|
|
|
| } else { // if not a fast case
|
| - fFSYUni = builder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| - kFloat_GrSLType, kDefault_GrSLPrecision,
|
| - "GradientYCoordFS");
|
| + fFSYUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility,
|
| + kFloat_GrSLType, kDefault_GrSLPrecision,
|
| + "GradientYCoordFS");
|
| }
|
| }
|
|
|
| @@ -1026,8 +1027,8 @@ uint32_t GrGLGradientEffect::GenBaseGradientKey(const GrProcessor& processor) {
|
| return key;
|
| }
|
|
|
| -void GrGLGradientEffect::emitColor(GrGLSLFPBuilder* builder,
|
| - GrGLSLFragmentBuilder* fragBuilder,
|
| +void GrGLGradientEffect::emitColor(GrGLSLFragmentBuilder* fragBuilder,
|
| + GrGLSLUniformHandler* uniformHandler,
|
| const GrGLSLCaps* glslCaps,
|
| const GrGradientEffect& ge,
|
| const char* gradientTValue,
|
| @@ -1036,8 +1037,8 @@ void GrGLGradientEffect::emitColor(GrGLSLFPBuilder* builder,
|
| const TextureSamplerArray& samplers) {
|
| if (SkGradientShaderBase::kTwo_GpuColorType == ge.getColorType()){
|
| fragBuilder->codeAppendf("\tvec4 colorTemp = mix(%s, %s, clamp(%s, 0.0, 1.0));\n",
|
| - builder->getUniformVariable(fColorStartUni).c_str(),
|
| - builder->getUniformVariable(fColorEndUni).c_str(),
|
| + uniformHandler->getUniformVariable(fColorStartUni).c_str(),
|
| + uniformHandler->getUniformVariable(fColorEndUni).c_str(),
|
| gradientTValue);
|
| // Note that we could skip this step if both colors are known to be opaque. Two
|
| // considerations:
|
| @@ -1055,20 +1056,20 @@ void GrGLGradientEffect::emitColor(GrGLSLFPBuilder* builder,
|
| fragBuilder->codeAppendf("\tfloat oneMinus2t = 1.0 - (2.0 * (%s));\n",
|
| gradientTValue);
|
| fragBuilder->codeAppendf("\tvec4 colorTemp = clamp(oneMinus2t, 0.0, 1.0) * %s;\n",
|
| - builder->getUniformVariable(fColorStartUni).c_str());
|
| + uniformHandler->getUniformVariable(fColorStartUni).c_str());
|
| if (!glslCaps->canUseMinAndAbsTogether()) {
|
| // The Tegra3 compiler will sometimes never return if we have
|
| // min(abs(oneMinus2t), 1.0), or do the abs first in a separate expression.
|
| fragBuilder->codeAppend("\tfloat minAbs = abs(oneMinus2t);\n");
|
| fragBuilder->codeAppend("\tminAbs = minAbs > 1.0 ? 1.0 : minAbs;\n");
|
| fragBuilder->codeAppendf("\tcolorTemp += (1.0 - minAbs) * %s;\n",
|
| - builder->getUniformVariable(fColorMidUni).c_str());
|
| + uniformHandler->getUniformVariable(fColorMidUni).c_str());
|
| } else {
|
| fragBuilder->codeAppendf("\tcolorTemp += (1.0 - min(abs(oneMinus2t), 1.0)) * %s;\n",
|
| - builder->getUniformVariable(fColorMidUni).c_str());
|
| + uniformHandler->getUniformVariable(fColorMidUni).c_str());
|
| }
|
| fragBuilder->codeAppendf("\tcolorTemp += clamp(-oneMinus2t, 0.0, 1.0) * %s;\n",
|
| - builder->getUniformVariable(fColorEndUni).c_str());
|
| + uniformHandler->getUniformVariable(fColorEndUni).c_str());
|
| if (GrGradientEffect::kAfterInterp_PremulType == ge.getPremulType()) {
|
| fragBuilder->codeAppend("\tcolorTemp.rgb *= colorTemp.a;\n");
|
| }
|
| @@ -1078,7 +1079,7 @@ void GrGLGradientEffect::emitColor(GrGLSLFPBuilder* builder,
|
| } else {
|
| fragBuilder->codeAppendf("\tvec2 coord = vec2(%s, %s);\n",
|
| gradientTValue,
|
| - builder->getUniformVariable(fFSYUni).c_str());
|
| + uniformHandler->getUniformVariable(fFSYUni).c_str());
|
| fragBuilder->codeAppendf("\t%s = ", outputColor);
|
| fragBuilder->appendTextureLookupAndModulate(inputColor,
|
| samplers[0],
|
|
|