diff options
author | 2017-08-05 19:43:34 +0000 | |
---|---|---|
committer | 2017-08-05 19:43:45 +0000 | |
commit | eb6695904e70f701b660dec72c46a01ab1031b66 (patch) | |
tree | bb7408e473b30100df017c83cc9415b3e1876ecb /src | |
parent | 155e94297a466a4e4c4c3e353359de18ab9720ab (diff) |
Revert "Tiling support for GrGradientEffect kTwo_ColorType/kThree_ColorType"
This reverts commit b86aaeb7b0841c2c23f7b36b0bb0520ce2fb3256.
Reason for revert: Nexus7/Tegra3 crashing on lcdblendmodes
Original change's description:
> Tiling support for GrGradientEffect kTwo_ColorType/kThree_ColorType
>
> Currently only the hard-stop specializations support tiling.
>
> Consolidate the tiling code and expand to kTwo_ColorType,
> kThree_ColorType also.
>
> Change-Id: I0c04997f563a7150a486ccc03f8121099a651c0b
> Reviewed-on: https://skia-review.googlesource.com/30780
> Reviewed-by: Brian Osman <brianosman@google.com>
> Commit-Queue: Florin Malita <fmalita@chromium.org>
TBR=bsalomon@google.com,robertphillips@google.com,brianosman@google.com,fmalita@chromium.org
Change-Id: I89c89c630f206c3a330e4b31aa3834dfbc5cd9e0
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://skia-review.googlesource.com/31244
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Florin Malita <fmalita@chromium.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/shaders/gradients/SkGradientShader.cpp | 92 |
1 files changed, 52 insertions, 40 deletions
diff --git a/src/shaders/gradients/SkGradientShader.cpp b/src/shaders/gradients/SkGradientShader.cpp index 94d6c6dcd9..985e033b45 100644 --- a/src/shaders/gradients/SkGradientShader.cpp +++ b/src/shaders/gradients/SkGradientShader.cpp @@ -1347,11 +1347,13 @@ GrGradientEffect::ColorType GrGradientEffect::determineColorType( } } - if (2 == shader.fColorCount) { - return kTwo_ColorType; - } else if (3 == shader.fColorCount && - close_to_one_half(shader.getRecs()[1].fPos)) { - return kThree_ColorType; + if (SkShader::kClamp_TileMode == shader.getTileMode()) { + if (2 == shader.fColorCount) { + return kTwo_ColorType; + } else if (3 == shader.fColorCount && + close_to_one_half(shader.getRecs()[1].fPos)) { + return kThree_ColorType; + } } return kTexture_ColorType; @@ -1544,31 +1546,6 @@ uint32_t GrGradientEffect::GLSLProcessor::GenBaseGradientKey(const GrProcessor& return key; } -static void emit_clamp_t(GrGLSLFPFragmentBuilder* fragBuilder, - const char* t, - SkShader::TileMode tileMode) { - switch (tileMode) { - case SkShader::kClamp_TileMode: - fragBuilder->codeAppendf("float clamp_t = clamp(%s, 0.0, 1.0);", t); - break; - case SkShader::kRepeat_TileMode: - fragBuilder->codeAppendf("float clamp_t = fract(%s);", t); - break; - case SkShader::kMirror_TileMode: - fragBuilder->codeAppendf("float clamp_t = %s;", t); - // TODO: Is this conditional really useful? Since the client requested kMirror, - // t is likely outside [0,1] most of the time so we might as well always fall through. - fragBuilder->codeAppendf("if (%s < 0.0 || %s > 1.0) {", t, t); - fragBuilder->codeAppendf(" if (mod(floor(%s), 2.0) == 0.0) {", t); - fragBuilder->codeAppendf(" clamp_t = fract(%s);", t); - fragBuilder->codeAppendf(" } else {"); - fragBuilder->codeAppendf(" clamp_t = 1.0 - fract(%s);", t); - fragBuilder->codeAppendf(" }"); - fragBuilder->codeAppendf("}"); - break; - } -} - void GrGradientEffect::GLSLProcessor::emitColor(GrGLSLFPFragmentBuilder* fragBuilder, GrGLSLUniformHandler* uniformHandler, const GrShaderCaps* shaderCaps, @@ -1583,7 +1560,20 @@ void GrGradientEffect::GLSLProcessor::emitColor(GrGLSLFPFragmentBuilder* fragBui const char* colors = uniformHandler->getUniformCStr(fColorsUni); const char* stopT = uniformHandler->getUniformCStr(fHardStopT); - emit_clamp_t(fragBuilder, t, ge.fTileMode); + fragBuilder->codeAppendf("float clamp_t = clamp(%s, 0.0, 1.0);", t); + + // Account for tile mode + if (SkShader::kRepeat_TileMode == ge.fTileMode) { + fragBuilder->codeAppendf("clamp_t = fract(%s);", t); + } else if (SkShader::kMirror_TileMode == ge.fTileMode) { + fragBuilder->codeAppendf("if (%s < 0.0 || %s > 1.0) {", t, t); + fragBuilder->codeAppendf(" if (mod(floor(%s), 2.0) == 0.0) {", t); + fragBuilder->codeAppendf(" clamp_t = fract(%s);", t); + fragBuilder->codeAppendf(" } else {"); + fragBuilder->codeAppendf(" clamp_t = 1.0 - fract(%s);", t); + fragBuilder->codeAppendf(" }"); + fragBuilder->codeAppendf("}"); + } // Calculate color fragBuilder->codeAppend ("float4 start, end;"); @@ -1614,7 +1604,20 @@ void GrGradientEffect::GLSLProcessor::emitColor(GrGLSLFPFragmentBuilder* fragBui const char* t = gradientTValue; const char* colors = uniformHandler->getUniformCStr(fColorsUni); - emit_clamp_t(fragBuilder, t, ge.fTileMode); + fragBuilder->codeAppendf("float clamp_t = clamp(%s, 0.0, 1.0);", t); + + // Account for tile mode + if (SkShader::kRepeat_TileMode == ge.fTileMode) { + fragBuilder->codeAppendf("clamp_t = fract(%s);", t); + } else if (SkShader::kMirror_TileMode == ge.fTileMode) { + fragBuilder->codeAppendf("if (%s < 0.0 || %s > 1.0) {", t, t); + fragBuilder->codeAppendf(" if (mod(floor(%s), 2.0) == 0.0) {", t); + fragBuilder->codeAppendf(" clamp_t = fract(%s);", t); + fragBuilder->codeAppendf(" } else {"); + fragBuilder->codeAppendf(" clamp_t = 1.0 - fract(%s);", t); + fragBuilder->codeAppendf(" }"); + fragBuilder->codeAppendf("}"); + } fragBuilder->codeAppendf("float4 colorTemp = mix(%s[1], %s[2], clamp_t);", colors, colors); @@ -1639,7 +1642,20 @@ void GrGradientEffect::GLSLProcessor::emitColor(GrGLSLFPFragmentBuilder* fragBui const char* t = gradientTValue; const char* colors = uniformHandler->getUniformCStr(fColorsUni); - emit_clamp_t(fragBuilder, t, ge.fTileMode); + fragBuilder->codeAppendf("float clamp_t = clamp(%s, 0.0, 1.0);", t); + + // Account for tile mode + if (SkShader::kRepeat_TileMode == ge.fTileMode) { + fragBuilder->codeAppendf("clamp_t = fract(%s);", t); + } else if (SkShader::kMirror_TileMode == ge.fTileMode) { + fragBuilder->codeAppendf("if (%s < 0.0 || %s > 1.0) {", t, t); + fragBuilder->codeAppendf(" if (mod(floor(%s), 2.0) == 0.0) {", t); + fragBuilder->codeAppendf(" clamp_t = fract(%s);", t); + fragBuilder->codeAppendf(" } else {"); + fragBuilder->codeAppendf(" clamp_t = 1.0 - fract(%s);", t); + fragBuilder->codeAppendf(" }"); + fragBuilder->codeAppendf("}"); + } fragBuilder->codeAppendf("float4 colorTemp = mix(%s[0], %s[1], clamp_t);", colors, colors); @@ -1664,10 +1680,8 @@ void GrGradientEffect::GLSLProcessor::emitColor(GrGLSLFPFragmentBuilder* fragBui const char* t = gradientTValue; const char* colors = uniformHandler->getUniformCStr(fColorsUni); - emit_clamp_t(fragBuilder, t, ge.fTileMode); - - fragBuilder->codeAppendf("float4 colorTemp = mix(%s[0], %s[1], clamp_t);", - colors, colors); + fragBuilder->codeAppendf("float4 colorTemp = mix(%s[0], %s[1], clamp(%s, 0.0, 1.0));", + colors, colors, t); // We could skip this step if both colors are known to be opaque. Two // considerations: @@ -1691,9 +1705,7 @@ void GrGradientEffect::GLSLProcessor::emitColor(GrGLSLFPFragmentBuilder* fragBui const char* t = gradientTValue; const char* colors = uniformHandler->getUniformCStr(fColorsUni); - emit_clamp_t(fragBuilder, t, ge.fTileMode); - - fragBuilder->codeAppendf("float oneMinus2t = 1.0 - (2.0 * clamp_t);"); + fragBuilder->codeAppendf("float oneMinus2t = 1.0 - (2.0 * %s);", t); fragBuilder->codeAppendf("float4 colorTemp = clamp(oneMinus2t, 0.0, 1.0) * %s[0];", colors); if (!shaderCaps->canUseMinAndAbsTogether()) { |