diff options
author | 2017-10-24 10:59:03 -0600 | |
---|---|---|
committer | 2017-10-25 15:59:18 +0000 | |
commit | c17bf32a1bf2f79a8c4a281c2ad312a3cdb610cd (patch) | |
tree | daac8294c72cd1bfd370291faf3dbc364460be8e /src/gpu/ccpr/GrCCPRQuadraticShader.cpp | |
parent | a045eea29eb79254248d7e2666825a1ca7d23d4e (diff) |
Convert geometry shaders to operate in Skia device space
Defers the transformation to normalized window coordinates until after
the geometry shader. Merges vertex and a geometry shader builders into
a single compilation unit with a common base class. Updates CCPR
geometry shaders accordingly.
Bug: skia:
Change-Id: If93c90e978b1fdc7120febd05cfb05810fd496b5
Reviewed-on: https://skia-review.googlesource.com/62980
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Chris Dalton <csmartdalton@google.com>
Diffstat (limited to 'src/gpu/ccpr/GrCCPRQuadraticShader.cpp')
-rw-r--r-- | src/gpu/ccpr/GrCCPRQuadraticShader.cpp | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/src/gpu/ccpr/GrCCPRQuadraticShader.cpp b/src/gpu/ccpr/GrCCPRQuadraticShader.cpp index 44e9b7e8c9..126dae15cd 100644 --- a/src/gpu/ccpr/GrCCPRQuadraticShader.cpp +++ b/src/gpu/ccpr/GrCCPRQuadraticShader.cpp @@ -17,13 +17,12 @@ void GrCCPRQuadraticShader::appendInputPointFetch(const GrCCPRCoverageProcessor& SkStringPrintf("%s.x + %s", proc.instanceAttrib(), pointId).c_str()); } -void GrCCPRQuadraticShader::emitWind(GrGLSLShaderBuilder* s, const char* pts, const char* rtAdjust, +void GrCCPRQuadraticShader::emitWind(GrGLSLShaderBuilder* s, const char* pts, const char* outputWind) const { s->codeAppendf("float area_times_2 = determinant(float2x2(%s[1] - %s[0], %s[2] - %s[0]));", pts, pts, pts, pts); // Drop curves that are nearly flat, in favor of the higher quality triangle antialiasing. - s->codeAppendf("if (2 * abs(area_times_2) < length((%s[2] - %s[0]) * %s.zx)) {", - pts, pts, rtAdjust); + s->codeAppendf("if (2 * abs(area_times_2) < length(%s[2] - %s[0])) {", pts, pts); #ifndef SK_BUILD_FOR_MAC s->codeAppend ( "return;"); #else @@ -35,8 +34,7 @@ void GrCCPRQuadraticShader::emitWind(GrGLSLShaderBuilder* s, const char* pts, co } void GrCCPRQuadraticShader::emitSetupCode(GrGLSLShaderBuilder* s, const char* pts, - const char* segmentId, const char* bloat, - const char* wind, const char* rtAdjust, + const char* segmentId, const char* wind, GeometryVars* vars) const { s->declareGlobal(fCanonicalMatrix); s->codeAppendf("%s = float3x3(0.0, 0, 1, " @@ -47,16 +45,17 @@ void GrCCPRQuadraticShader::emitSetupCode(GrGLSLShaderBuilder* s, const char* pt "%s[2], 1));", fCanonicalMatrix.c_str(), pts, pts, pts); + // TODO: remove in followup CL. s->declareGlobal(fCanonicalDerivatives); - s->codeAppendf("%s = float2x2(%s) * float2x2(%s.x, 0, 0, %s.z);", - fCanonicalDerivatives.c_str(), fCanonicalMatrix.c_str(), rtAdjust, rtAdjust); + s->codeAppendf("%s = float2x2(%s);", + fCanonicalDerivatives.c_str(), fCanonicalMatrix.c_str()); s->declareGlobal(fEdgeDistanceEquation); s->codeAppendf("float2 edgept0 = %s[%s > 0 ? 2 : 0];", pts, wind); s->codeAppendf("float2 edgept1 = %s[%s > 0 ? 0 : 2];", pts, wind); Shader::EmitEdgeDistanceEquation(s, "edgept0", "edgept1", fEdgeDistanceEquation.c_str()); - this->onEmitSetupCode(s, pts, segmentId, rtAdjust, vars); + this->onEmitSetupCode(s, pts, segmentId, vars); } GrCCPRQuadraticShader::WindHandling @@ -75,8 +74,7 @@ GrCCPRQuadraticShader::onEmitVaryings(GrGLSLVaryingHandler* varyingHandler, SkSt } void GrCCPRQuadraticHullShader::onEmitSetupCode(GrGLSLShaderBuilder* s, const char* pts, - const char* /*wedgeId*/, const char* /*rtAdjust*/, - GeometryVars* vars) const { + const char* /*wedgeId*/, GeometryVars* vars) const { // Find the T value whose tangent is halfway between the tangents at the endpionts. s->codeAppendf("float2 tan0 = %s[1] - %s[0];", pts, pts); s->codeAppendf("float2 tan1 = %s[2] - %s[1];", pts, pts); @@ -109,11 +107,11 @@ void GrCCPRQuadraticHullShader::onEmitFragmentCode(GrGLSLPPFragmentBuilder* f, } void GrCCPRQuadraticCornerShader::onEmitSetupCode(GrGLSLShaderBuilder* s, const char* pts, - const char* cornerId, const char* rtAdjust, - GeometryVars* vars) const { + const char* cornerId, GeometryVars* vars) const { + // TODO: remove in followup CL. s->declareGlobal(fEdgeDistanceDerivatives); - s->codeAppendf("%s = %s.xy * %s.xz;", - fEdgeDistanceDerivatives.c_str(), fEdgeDistanceEquation.c_str(), rtAdjust); + s->codeAppendf("%s = %s.xy;", + fEdgeDistanceDerivatives.c_str(), fEdgeDistanceEquation.c_str()); s->codeAppendf("float2 corner = %s[%s * 2];", pts, cornerId); vars->fCornerVars.fPoint = "corner"; |