aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/ccpr/GrCCPRTriangleShader.cpp
diff options
context:
space:
mode:
authorGravatar Chris Dalton <csmartdalton@google.com>2017-10-24 10:59:03 -0600
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-10-25 15:59:18 +0000
commitc17bf32a1bf2f79a8c4a281c2ad312a3cdb610cd (patch)
treedaac8294c72cd1bfd370291faf3dbc364460be8e /src/gpu/ccpr/GrCCPRTriangleShader.cpp
parenta045eea29eb79254248d7e2666825a1ca7d23d4e (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.cpp14
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());