Add option to add precision to varyings in shader

Also use highp varying on bezier cubics to fix numerical issues for n10 and n4.

BUG=skia:2860
R=bsalomon@google.com

Author: egdaniel@google.com

Review URL: https://codereview.chromium.org/522303004
diff --git a/src/gpu/effects/GrBezierEffect.cpp b/src/gpu/effects/GrBezierEffect.cpp
index 92a11ef..488af15 100644
--- a/src/gpu/effects/GrBezierEffect.cpp
+++ b/src/gpu/effects/GrBezierEffect.cpp
@@ -342,7 +342,7 @@
     const char *vsName, *fsName;
 
     builder->addVarying(kVec4f_GrSLType, "CubicCoeffs",
-                              &vsName, &fsName);
+                              &vsName, &fsName, GrGLShaderVar::kHigh_Precision);
 
     GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder();
     const SkString* attr0Name =
diff --git a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp
index d216a18..fef3691 100644
--- a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp
@@ -195,8 +195,9 @@
 
 void GrGLFragmentShaderBuilder::addVarying(GrSLType type,
                const char* name,
-               const char** fsInName) {
-    fInputs.push_back().set(type, GrGLShaderVar::kVaryingIn_TypeModifier, name);
+               const char** fsInName,
+               GrGLShaderVar::Precision fsPrecision) {
+    fInputs.push_back().set(type, GrGLShaderVar::kVaryingIn_TypeModifier, name, fsPrecision);
     if (fsInName) {
         *fsInName = name;
     }
diff --git a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h
index 0f700bd..b3e0ab0 100644
--- a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h
+++ b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h
@@ -65,7 +65,8 @@
      */
     void addVarying(GrSLType type,
                    const char* name,
-                   const char** fsInName);
+                   const char** fsInName,
+                   GrGLShaderVar::Precision fsPrecision = GrGLShaderVar::kDefault_Precision);
 
     /*
      * Private functions used by GrGLProgramBuilder for compilation
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.cpp b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
index 41b84d8..141442d 100644
--- a/src/gpu/gl/builders/GrGLProgramBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
@@ -343,7 +343,8 @@
 void GrGLFullProgramBuilder::addVarying(GrSLType type,
                                         const char* name,
                                         const char** vsOutName,
-                                        const char** fsInName) {
+                                        const char** fsInName,
+                                        GrGLShaderVar::Precision fsPrecision) {
     fVS.addVarying(type, name, vsOutName);
 
     SkString* fsInputName = fVS.fOutputs.back().accessName();
@@ -355,7 +356,7 @@
        fsInputName = fGS.fOutputs.back().accessName();
     }
 #endif
-    fFS.addVarying(type, fsInputName->c_str(), fsInName);
+    fFS.addVarying(type, fsInputName->c_str(), fsInName, fsPrecision);
 }
 
 GrGLFullProgramBuilder::VaryingHandle
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.h b/src/gpu/gl/builders/GrGLProgramBuilder.h
index d1af63f..00193ef 100644
--- a/src/gpu/gl/builders/GrGLProgramBuilder.h
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.h
@@ -280,7 +280,8 @@
     void addVarying(GrSLType type,
                     const char* name,
                     const char** vsOutName = NULL,
-                    const char** fsInName = NULL);
+                    const char** fsInName = NULL,
+                    GrGLShaderVar::Precision fsPrecision=GrGLShaderVar::kDefault_Precision);
 
     /** Add a separable varying input variable to the current program.
      * A separable varying (fragment shader input) is a varying that can be used also when vertex