diff options
author | Chris Dalton <csmartdalton@google.com> | 2017-10-24 14:16:52 -0600 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-10-25 16:25:15 +0000 |
commit | cc0ab7e3c1072e131d63d46ac5916aafc177fcfe (patch) | |
tree | 2859eaf59809a3a6f09158ca4ee9ab524db373e5 /src/gpu/ccpr/GrCCPRCoverageProcessor.cpp | |
parent | c17bf32a1bf2f79a8c4a281c2ad312a3cdb610cd (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.cpp | 15 |
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, |