aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/ccpr/GrCCPRCoverageProcessor.cpp
diff options
context:
space:
mode:
authorGravatar Chris Dalton <csmartdalton@google.com>2017-10-24 14:16:52 -0600
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-10-25 16:25:15 +0000
commitcc0ab7e3c1072e131d63d46ac5916aafc177fcfe (patch)
tree2859eaf59809a3a6f09158ca4ee9ab524db373e5 /src/gpu/ccpr/GrCCPRCoverageProcessor.cpp
parentc17bf32a1bf2f79a8c4a281c2ad312a3cdb610cd (diff)
Address CCPR TODOs now that we are in device space
Bug: skia: Change-Id: I48619e93108bdbe453155be4f9da821ff0397ee3 Reviewed-on: https://skia-review.googlesource.com/63400 Commit-Queue: Chris Dalton <csmartdalton@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'src/gpu/ccpr/GrCCPRCoverageProcessor.cpp')
-rw-r--r--src/gpu/ccpr/GrCCPRCoverageProcessor.cpp15
1 files changed, 5 insertions, 10 deletions
diff --git a/src/gpu/ccpr/GrCCPRCoverageProcessor.cpp b/src/gpu/ccpr/GrCCPRCoverageProcessor.cpp
index e4cabf75f3..1dc129f2ba 100644
--- a/src/gpu/ccpr/GrCCPRCoverageProcessor.cpp
+++ b/src/gpu/ccpr/GrCCPRCoverageProcessor.cpp
@@ -76,18 +76,13 @@ void GrCCPRCoverageProcessor::Shader::EmitEdgeDistanceEquation(GrGLSLShaderBuild
const char* leftPt,
const char* rightPt,
const char* outputDistanceEquation) {
- // Which quadrant does the vector from left -> right fall into?
- s->codeAppendf("float2 qlr = sign(%s - %s);", rightPt, leftPt);
- s->codeAppend ("float2 d1 = float2(qlr.y, -qlr.x);");
-
s->codeAppendf("float2 n = float2(%s.y - %s.y, %s.x - %s.x);",
rightPt, leftPt, leftPt, rightPt);
- s->codeAppendf("float2 kk = n * float2x2(%s + bloat * d1, %s - bloat * d1);",
- leftPt, leftPt);
- // Clamp for when n=0. wind=0 when n=0 so as long as we don't get Inf or NaN we are fine.
- s->codeAppendf("float scale = 1 / max(kk[0] - kk[1], 1e-30);");
-
- s->codeAppendf("%s = half3(-n, kk[1]) * scale;", outputDistanceEquation);
+ s->codeAppend ("float nwidth = (abs(n.x) + abs(n.y)) * (bloat * 2);");
+ // When nwidth=0, wind must also be 0 (and coverage * wind = 0). So it doesn't matter what we
+ // come up with here as long as it isn't NaN or Inf.
+ s->codeAppend ("n /= (0 != nwidth) ? nwidth : 1;");
+ s->codeAppendf("%s = float3(-n, dot(n, %s) - .5);", outputDistanceEquation, leftPt);
}
int GrCCPRCoverageProcessor::Shader::DefineSoftSampleLocations(GrGLSLPPFragmentBuilder* f,