re-land of new SkSL precisions

Bug: skia:
Change-Id: Ic1deb3db2cbda6ca45f93dee99832971a36a2119
Reviewed-on: https://skia-review.googlesource.com/47841
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
diff --git a/src/gpu/effects/GrBezierEffect.cpp b/src/gpu/effects/GrBezierEffect.cpp
index aa9a509..5848888 100644
--- a/src/gpu/effects/GrBezierEffect.cpp
+++ b/src/gpu/effects/GrBezierEffect.cpp
@@ -77,7 +77,7 @@
     // emit attributes
     varyingHandler->emitAttributes(gp);
 
-    GrGLSLVertToFrag v(kVec4f_GrSLType);
+    GrGLSLVertToFrag v(kHighFloat4_GrSLType);
     varyingHandler->addVarying("ConicCoeffs", &v, kHigh_GrSLPrecision);
     vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs()->fName);
 
@@ -102,26 +102,18 @@
                          gp.localMatrix(),
                          args.fFPCoordTransformHandler);
 
-    // TODO: this precision check should actually be a check on the number of bits
-    // high and medium provide and the selection of the lowest level that suffices.
-    // Additionally we should assert that the upstream code only lets us get here if
-    // either high or medium provides the required number of bits.
-    GrSLPrecision precision = kHigh_GrSLPrecision;
-    const GrShaderCaps::PrecisionInfo& highP = args.fShaderCaps->getFloatShaderPrecisionInfo(
-                                                             kFragment_GrShaderType,
-                                                             kHigh_GrSLPrecision);
-    if (!highP.supported()) {
-        precision = kMedium_GrSLPrecision;
-    }
+    // TODO: we should check on the number of bits float and half provide and use the smallest one
+    // that suffices. Additionally we should assert that the upstream code only lets us get here if
+    // either float or half provides the required number of bits.
 
-    GrShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, precision);
-    GrShaderVar dklmdx("dklmdx", kVec3f_GrSLType, 0, precision);
-    GrShaderVar dklmdy("dklmdy", kVec3f_GrSLType, 0, precision);
-    GrShaderVar dfdx("dfdx", kFloat_GrSLType, 0, precision);
-    GrShaderVar dfdy("dfdy", kFloat_GrSLType, 0, precision);
-    GrShaderVar gF("gF", kVec2f_GrSLType, 0, precision);
-    GrShaderVar gFM("gFM", kFloat_GrSLType, 0, precision);
-    GrShaderVar func("func", kFloat_GrSLType, 0, precision);
+    GrShaderVar edgeAlpha("edgeAlpha", kHighFloat_GrSLType, 0);
+    GrShaderVar dklmdx("dklmdx", kHighFloat3_GrSLType, 0);
+    GrShaderVar dklmdy("dklmdy", kHighFloat3_GrSLType, 0);
+    GrShaderVar dfdx("dfdx", kHighFloat_GrSLType, 0);
+    GrShaderVar dfdy("dfdy", kHighFloat_GrSLType, 0);
+    GrShaderVar gF("gF", kHighFloat2_GrSLType, 0);
+    GrShaderVar gFM("gFM", kHighFloat_GrSLType, 0);
+    GrShaderVar func("func", kHighFloat_GrSLType, 0);
 
     fragBuilder->declAppend(edgeAlpha);
     fragBuilder->declAppend(dklmdx);
@@ -146,7 +138,8 @@
                                      v.fsIn(), dklmdy.c_str(),
                                      v.fsIn(), dklmdy.c_str(),
                                      v.fsIn(), dklmdy.c_str());
-            fragBuilder->codeAppendf("%s = float2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
+            fragBuilder->codeAppendf("%s = highfloat2(%s, %s);", gF.c_str(), dfdx.c_str(),
+                                     dfdy.c_str());
             fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
                                      gFM.c_str(), gF.c_str(), gF.c_str());
             fragBuilder->codeAppendf("%s = %s.x*%s.x - %s.y*%s.z;",
@@ -175,7 +168,8 @@
                                      v.fsIn(), dklmdy.c_str(),
                                      v.fsIn(), dklmdy.c_str(),
                                      v.fsIn(), dklmdy.c_str());
-            fragBuilder->codeAppendf("%s = float2(%s, %s);", gF.c_str(), dfdx.c_str(), dfdy.c_str());
+            fragBuilder->codeAppendf("%s = highfloat2(%s, %s);", gF.c_str(), dfdx.c_str(),
+                                     dfdy.c_str());
             fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
                                      gFM.c_str(), gF.c_str(), gF.c_str());
             fragBuilder->codeAppendf("%s = %s.x * %s.x - %s.y * %s.z;",
@@ -191,7 +185,7 @@
         case kFillBW_GrProcessorEdgeType: {
             fragBuilder->codeAppendf("%s = %s.x * %s.x - %s.y * %s.z;",
                                      edgeAlpha.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
-            fragBuilder->codeAppendf("%s = float(%s < 0.0);",
+            fragBuilder->codeAppendf("%s = highfloat(%s < 0.0);",
                                      edgeAlpha.c_str(), edgeAlpha.c_str());
             break;
         }
@@ -203,14 +197,13 @@
     if (gp.coverageScale() != 0xff) {
         const char* coverageScale;
         fCoverageScaleUniform = uniformHandler->addUniform(kFragment_GrShaderFlag,
-                                                           kFloat_GrSLType,
-                                                           kHigh_GrSLPrecision,
+                                                           kHighFloat_GrSLType,
                                                            "Coverage",
                                                            &coverageScale);
-        fragBuilder->codeAppendf("%s = float4(%s * %s);",
+        fragBuilder->codeAppendf("%s = half4(%s * %s);",
                                  args.fOutputCoverage, coverageScale, edgeAlpha.c_str());
     } else {
-        fragBuilder->codeAppendf("%s = float4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
+        fragBuilder->codeAppendf("%s = half4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
     }
 }
 
@@ -338,7 +331,7 @@
     // emit attributes
     varyingHandler->emitAttributes(gp);
 
-    GrGLSLVertToFrag v(kVec4f_GrSLType);
+    GrGLSLVertToFrag v(kHalf4_GrSLType);
     varyingHandler->addVarying("HairQuadEdge", &v);
     vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inHairQuadEdge()->fName);
 
@@ -363,13 +356,13 @@
                          gp.localMatrix(),
                          args.fFPCoordTransformHandler);
 
-    fragBuilder->codeAppendf("float edgeAlpha;");
+    fragBuilder->codeAppendf("half edgeAlpha;");
 
     switch (fEdgeType) {
         case kHairlineAA_GrProcessorEdgeType: {
-            fragBuilder->codeAppendf("float2 duvdx = dFdx(%s.xy);", v.fsIn());
-            fragBuilder->codeAppendf("float2 duvdy = dFdy(%s.xy);", v.fsIn());
-            fragBuilder->codeAppendf("float2 gF = float2(2.0 * %s.x * duvdx.x - duvdx.y,"
+            fragBuilder->codeAppendf("half2 duvdx = dFdx(%s.xy);", v.fsIn());
+            fragBuilder->codeAppendf("half2 duvdy = dFdy(%s.xy);", v.fsIn());
+            fragBuilder->codeAppendf("half2 gF = half2(2.0 * %s.x * duvdx.x - duvdx.y,"
                                      "               2.0 * %s.x * duvdy.x - duvdy.y);",
                                      v.fsIn(), v.fsIn());
             fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
@@ -381,9 +374,9 @@
             break;
         }
         case kFillAA_GrProcessorEdgeType: {
-            fragBuilder->codeAppendf("float2 duvdx = dFdx(%s.xy);", v.fsIn());
-            fragBuilder->codeAppendf("float2 duvdy = dFdy(%s.xy);", v.fsIn());
-            fragBuilder->codeAppendf("float2 gF = float2(2.0 * %s.x * duvdx.x - duvdx.y,"
+            fragBuilder->codeAppendf("half2 duvdx = dFdx(%s.xy);", v.fsIn());
+            fragBuilder->codeAppendf("half2 duvdy = dFdy(%s.xy);", v.fsIn());
+            fragBuilder->codeAppendf("half2 gF = half2(2.0 * %s.x * duvdx.x - duvdx.y,"
                                      "               2.0 * %s.x * duvdy.x - duvdy.y);",
                                      v.fsIn(), v.fsIn());
             fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
@@ -397,7 +390,7 @@
         case kFillBW_GrProcessorEdgeType: {
             fragBuilder->codeAppendf("edgeAlpha = (%s.x * %s.x - %s.y);",
                                      v.fsIn(), v.fsIn(), v.fsIn());
-            fragBuilder->codeAppend("edgeAlpha = float(edgeAlpha < 0.0);");
+            fragBuilder->codeAppend("edgeAlpha = half(edgeAlpha < 0.0);");
             break;
         }
         default:
@@ -407,13 +400,13 @@
     if (0xff != gp.coverageScale()) {
         const char* coverageScale;
         fCoverageScaleUniform = uniformHandler->addUniform(kFragment_GrShaderFlag,
-                                                           kFloat_GrSLType,
-                                                           kDefault_GrSLPrecision,
+                                                           kHalf_GrSLType,
                                                            "Coverage",
                                                            &coverageScale);
-        fragBuilder->codeAppendf("%s = float4(%s * edgeAlpha);", args.fOutputCoverage, coverageScale);
+        fragBuilder->codeAppendf("%s = half4(%s * edgeAlpha);", args.fOutputCoverage,
+                                 coverageScale);
     } else {
-        fragBuilder->codeAppendf("%s = float4(edgeAlpha);", args.fOutputCoverage);
+        fragBuilder->codeAppendf("%s = half4(edgeAlpha);", args.fOutputCoverage);
     }
 }
 
@@ -561,25 +554,25 @@
 
     // Setup KLM
     const char* devkLMMatrixName;
-    fDevKLMUniform = uniformHandler->addUniform(kVertex_GrShaderFlag, kMat33f_GrSLType,
-                                                kHigh_GrSLPrecision, "KLM", &devkLMMatrixName);
-    GrGLSLVertToFrag v(kVec3f_GrSLType);
+    fDevKLMUniform = uniformHandler->addUniform(kVertex_GrShaderFlag, kHighFloat3x3_GrSLType, "KLM",
+                                                &devkLMMatrixName);
+    GrGLSLVertToFrag v(kHighFloat3_GrSLType);
     varyingHandler->addVarying("CubicCoeffs", &v, kHigh_GrSLPrecision);
-    vertBuilder->codeAppendf("%s = %s * float3(%s, 1);",
+    vertBuilder->codeAppendf("%s = %s * highfloat3(%s, 1);",
                              v.vsOut(), devkLMMatrixName, gpArgs->fPositionVar.c_str());
 
 
-    GrGLSLVertToFrag gradCoeffs(kVec4f_GrSLType);
+    GrGLSLVertToFrag gradCoeffs(kHighFloat4_GrSLType);
     if (kFillAA_GrProcessorEdgeType == fEdgeType || kHairlineAA_GrProcessorEdgeType == fEdgeType) {
         varyingHandler->addVarying("GradCoeffs", &gradCoeffs, kHigh_GrSLPrecision);
-        vertBuilder->codeAppendf("highp float k = %s[0], l = %s[1], m = %s[2];",
+        vertBuilder->codeAppendf("highfloat k = %s[0], l = %s[1], m = %s[2];",
                                  v.vsOut(), v.vsOut(), v.vsOut());
-        vertBuilder->codeAppendf("highp float2 gk = float2(%s[0][0], %s[1][0]), "
-                                            "gl = float2(%s[0][1], %s[1][1]), "
-                                            "gm = float2(%s[0][2], %s[1][2]);",
+        vertBuilder->codeAppendf("highfloat2 gk = highfloat2(%s[0][0], %s[1][0]), "
+                                            "gl = highfloat2(%s[0][1], %s[1][1]), "
+                                            "gm = highfloat2(%s[0][2], %s[1][2]);",
                                  devkLMMatrixName, devkLMMatrixName, devkLMMatrixName,
                                  devkLMMatrixName, devkLMMatrixName, devkLMMatrixName);
-        vertBuilder->codeAppendf("%s = float4(3 * k * gk, -m * gl - l * gm);",
+        vertBuilder->codeAppendf("%s = highfloat4(3 * k * gk, -m * gl - l * gm);",
                                  gradCoeffs.vsOut());
     }
 
@@ -592,9 +585,9 @@
                          args.fFPCoordTransformHandler);
 
 
-    GrShaderVar edgeAlpha("edgeAlpha", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
-    GrShaderVar gF("gF", kVec2f_GrSLType, 0, kHigh_GrSLPrecision);
-    GrShaderVar func("func", kFloat_GrSLType, 0, kHigh_GrSLPrecision);
+    GrShaderVar edgeAlpha("edgeAlpha", kHighFloat_GrSLType, 0);
+    GrShaderVar gF("gF", kHighFloat2_GrSLType, 0);
+    GrShaderVar func("func", kHighFloat_GrSLType, 0);
 
     fragBuilder->declAppend(edgeAlpha);
     fragBuilder->declAppend(gF);
@@ -638,7 +631,7 @@
             fragBuilder->codeAppendf("%s = %s.x * %s.x * %s.x - %s.y * %s.z;",
                                      edgeAlpha.c_str(), v.fsIn(), v.fsIn(),
                                      v.fsIn(), v.fsIn(), v.fsIn());
-            fragBuilder->codeAppendf("%s = float(%s < 0.0);", edgeAlpha.c_str(), edgeAlpha.c_str());
+            fragBuilder->codeAppendf("%s = half(%s < 0.0);", edgeAlpha.c_str(), edgeAlpha.c_str());
             break;
         }
         default:
@@ -646,7 +639,7 @@
     }
 
 
-    fragBuilder->codeAppendf("%s = float4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
+    fragBuilder->codeAppendf("%s = highfloat4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
 }
 
 void GrGLCubicEffect::GenKey(const GrGeometryProcessor& gp,