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>
diff --git a/src/gpu/glsl/GrGLSLGeometryProcessor.cpp b/src/gpu/glsl/GrGLSLGeometryProcessor.cpp
index cb421ad..8ee9bbd 100644
--- a/src/gpu/glsl/GrGLSLGeometryProcessor.cpp
+++ b/src/gpu/glsl/GrGLSLGeometryProcessor.cpp
@@ -11,15 +11,31 @@
 #include "glsl/GrGLSLFragmentShaderBuilder.h"
 #include "glsl/GrGLSLUniformHandler.h"
 #include "glsl/GrGLSLVarying.h"
-#include "glsl/GrGLSLVertexShaderBuilder.h"
+#include "glsl/GrGLSLVertexGeoBuilder.h"
 
 void GrGLSLGeometryProcessor::emitCode(EmitArgs& args) {
-    GrGLSLVertexBuilder* vBuilder = args.fVertBuilder;
     GrGPArgs gpArgs;
     this->onEmitCode(args, &gpArgs);
-    vBuilder->transformToNormalizedDeviceSpace(gpArgs.fPositionVar, args.fRTAdjustName);
-    if (kFloat2_GrSLType == gpArgs.fPositionVar.getType() ||
-        kHalf2_GrSLType == gpArgs.fPositionVar.getType()) {
+    SkASSERT(kFloat2_GrSLType == gpArgs.fPositionVar.getType() ||
+             kFloat3_GrSLType == gpArgs.fPositionVar.getType());
+
+    GrGLSLVertexBuilder* vBuilder = args.fVertBuilder;
+    if (!args.fGP.willUseGeoShader()) {
+        // Emit the vertex position to the hardware in the normalized window coordinates it expects.
+        vBuilder->emitNormalizedSkPosition(gpArgs.fPositionVar.c_str(), args.fRTAdjustName,
+                                           gpArgs.fPositionVar.getType());
+    } else {
+        // Since we have a geometry shader, leave the vertex position in Skia device space for now.
+        // The geometry Shader will operate in device space, and then convert the final positions to
+        // normalized hardware window coordinates under the hood, once everything else has finished.
+        vBuilder->codeAppendf("sk_Position = float4(%s", gpArgs.fPositionVar.c_str());
+        if (kFloat2_GrSLType == gpArgs.fPositionVar.getType()) {
+            vBuilder->codeAppend(", 0");
+        }
+        vBuilder->codeAppend(", 1);");
+    }
+
+    if (kFloat2_GrSLType == gpArgs.fPositionVar.getType()) {
         args.fVaryingHandler->setNoPerspective();
     }
 }