aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Florin Malita <fmalita@chromium.org>2017-08-05 19:43:34 +0000
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-08-05 19:43:45 +0000
commiteb6695904e70f701b660dec72c46a01ab1031b66 (patch)
treebb7408e473b30100df017c83cc9415b3e1876ecb /src
parent155e94297a466a4e4c4c3e353359de18ab9720ab (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.cpp92
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()) {