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/GrCCPRTriangleShader.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/GrCCPRTriangleShader.cpp')
-rw-r--r-- | src/gpu/ccpr/GrCCPRTriangleShader.cpp | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/src/gpu/ccpr/GrCCPRTriangleShader.cpp b/src/gpu/ccpr/GrCCPRTriangleShader.cpp index 5c50265591..8db3b637e4 100644 --- a/src/gpu/ccpr/GrCCPRTriangleShader.cpp +++ b/src/gpu/ccpr/GrCCPRTriangleShader.cpp @@ -8,8 +8,7 @@ #include "GrCCPRTriangleShader.h" #include "glsl/GrGLSLFragmentShaderBuilder.h" -#include "glsl/GrGLSLGeometryShaderBuilder.h" -#include "glsl/GrGLSLVertexShaderBuilder.h" +#include "glsl/GrGLSLVertexGeoBuilder.h" void GrCCPRTriangleShader::appendInputPointFetch(const GrCCPRCoverageProcessor& proc, GrGLSLShaderBuilder* s, @@ -19,8 +18,8 @@ void GrCCPRTriangleShader::appendInputPointFetch(const GrCCPRCoverageProcessor& SkStringPrintf("%s[%s]", proc.instanceAttrib(), pointId).c_str()); } -void GrCCPRTriangleShader::emitWind(GrGLSLShaderBuilder* s, const char* pts, const char* rtAdjust, - const char* outputWind) const { +void GrCCPRTriangleShader::emitWind(GrGLSLShaderBuilder* s, const char* pts, + const char* outputWind) const { s->codeAppendf("%s = sign(determinant(float2x2(%s[1] - %s[0], %s[2] - %s[0])));", outputWind, pts, pts, pts, pts); } @@ -52,8 +51,7 @@ void GrCCPRTriangleEdgeShader::onEmitFragmentCode(GrGLSLPPFragmentBuilder* f, } void GrCCPRTriangleCornerShader::emitSetupCode(GrGLSLShaderBuilder* s, const char* pts, - const char* cornerId, const char* bloat, - const char* wind, const char* rtAdjust, + const char* cornerId, const char* wind, GeometryVars* vars) const { s->codeAppendf("float2 corner = %s[sk_InvocationID];", pts); vars->fCornerVars.fPoint = "corner"; @@ -87,7 +85,7 @@ void GrCCPRTriangleCornerShader::emitSetupCode(GrGLSLShaderBuilder* s, const cha s->codeAppendf("for (int i = 0; i < 2; ++i) {"); // The X component runs parallel to the edge (i.e. distance to the corner). s->codeAppendf( "float2 n = -vectors[%s > 0 ? i : 1 - i];", wind); - s->codeAppend ( "float nwidth = dot(abs(n), bloat) * 2;"); + s->codeAppend ( "float nwidth = (abs(n.x) + abs(n.y)) * (bloat * 2);"); s->codeAppend ( "n /= nwidth;"); // nwidth != 0 because both vectors != 0. s->codeAppendf( "%s[i][0] = n;", fAABoxMatrices.c_str()); s->codeAppendf( "%s[i][0] = -dot(n, corner) + .5;", fAABoxTranslates.c_str()); @@ -96,7 +94,7 @@ void GrCCPRTriangleCornerShader::emitSetupCode(GrGLSLShaderBuilder* s, const cha // NOTE: if we are back in device space and bloat.x == bloat.y, we will not need to find and // divide by nwidth a second time. s->codeAppend ( "n = (i == 0) ? float2(-n.y, n.x) : float2(n.y, -n.x);"); - s->codeAppend ( "nwidth = dot(abs(n), bloat) * 2;"); + s->codeAppend ( "nwidth = (abs(n.x) + abs(n.y)) * (bloat * 2);"); s->codeAppend ( "n /= nwidth;"); s->codeAppendf( "%s[i][1] = n;", fAABoxMatrices.c_str()); s->codeAppendf( "%s[i][1] = -dot(n, corner) + .5;", fAABoxTranslates.c_str()); |