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/glsl/GrGLSLBlend.cpp b/src/gpu/glsl/GrGLSLBlend.cpp
index 34df0df..254f481 100644
--- a/src/gpu/glsl/GrGLSLBlend.cpp
+++ b/src/gpu/glsl/GrGLSLBlend.cpp
@@ -50,7 +50,7 @@
     fsBuilder->codeAppendf("%s.%c = %s.%c * (1.0 - %s.a);",
                            final, component, src, component, dst);
     fsBuilder->codeAppend("} else {");
-    fsBuilder->codeAppendf("float d = %s.a - %s.%c;", src, src, component);
+    fsBuilder->codeAppendf("half d = %s.a - %s.%c;", src, src, component);
     fsBuilder->codeAppend("if (0.0 == d) {");
     fsBuilder->codeAppendf("%s.%c = %s.a * %s.a + %s.%c * (1.0 - %s.a) + %s.%c * (1.0 - %s.a);",
                            final, component, src, dst, src, component, dst, dst, component,
@@ -84,7 +84,7 @@
     fsBuilder->codeAppendf("%s.%c = %s.%c * (1.0 - %s.a);",
                            final, component, dst, component, src);
     fsBuilder->codeAppend("} else {");
-    fsBuilder->codeAppendf("float d = max(0.0, %s.a - (%s.a - %s.%c) * %s.a / (%s.%c %s));",
+    fsBuilder->codeAppendf("half d = max(0.0, %s.a - (%s.a - %s.%c) * %s.a / (%s.%c %s));",
                            dst, dst, dst, component, src, src, component, divisorGuard);
     fsBuilder->codeAppendf("%s.%c = %s.a * d + %s.%c * (1.0 - %s.a) + %s.%c * (1.0 - %s.a);",
                            final, component, src, src, component, dst, dst, component, src);
@@ -114,11 +114,11 @@
     // else if (4D < Da)
     fsBuilder->codeAppendf("} else if (4.0 * %s.%c <= %s.a) {",
                            dst, component, dst);
-    fsBuilder->codeAppendf("float DSqd = %s.%c * %s.%c;",
+    fsBuilder->codeAppendf("half DSqd = %s.%c * %s.%c;",
                            dst, component, dst, component);
-    fsBuilder->codeAppendf("float DCub = DSqd * %s.%c;", dst, component);
-    fsBuilder->codeAppendf("float DaSqd = %s.a * %s.a;", dst, dst);
-    fsBuilder->codeAppendf("float DaCub = DaSqd * %s.a;", dst);
+    fsBuilder->codeAppendf("half DCub = DSqd * %s.%c;", dst, component);
+    fsBuilder->codeAppendf("half DaSqd = %s.a * %s.a;", dst, dst);
+    fsBuilder->codeAppendf("half DaCub = DaSqd * %s.a;", dst);
     // (Da^3 (-S)+Da^2 (S-D (3 Sa-6 S-1))+12 Da D^2 (Sa-2 S)-16 D^3 (Sa-2 S))/Da^2
     fsBuilder->codeAppendf("%s.%c ="
                            "(DaSqd*(%s.%c - %s.%c * (3.0*%s.a - 6.0*%s.%c - 1.0)) +"
@@ -144,10 +144,10 @@
     // Emit a helper that gets the luminance of a color.
     SkString getFunction;
     GrShaderVar getLumArgs[] = {
-        GrShaderVar("color", kVec3f_GrSLType),
+        GrShaderVar("color", kHalf3_GrSLType),
     };
-    SkString getLumBody("return dot(float3(0.3, 0.59, 0.11), color);");
-    fsBuilder->emitFunction(kFloat_GrSLType,
+    SkString getLumBody("return dot(highfloat3(0.3, 0.59, 0.11), color);");
+    fsBuilder->emitFunction(kHalf_GrSLType,
                             "luminance",
                             SK_ARRAY_COUNT(getLumArgs), getLumArgs,
                             getLumBody.c_str(),
@@ -155,27 +155,27 @@
 
     // Emit the set luminance function.
     GrShaderVar setLumArgs[] = {
-        GrShaderVar("hueSat", kVec3f_GrSLType),
-        GrShaderVar("alpha", kFloat_GrSLType),
-        GrShaderVar("lumColor", kVec3f_GrSLType),
+        GrShaderVar("hueSat", kHalf3_GrSLType),
+        GrShaderVar("alpha", kHalf_GrSLType),
+        GrShaderVar("lumColor", kHalf3_GrSLType),
     };
     SkString setLumBody;
-    setLumBody.printf("float diff = %s(lumColor - hueSat);", getFunction.c_str());
-    setLumBody.append("float3 outColor = hueSat + diff;");
-    setLumBody.appendf("float outLum = %s(outColor);", getFunction.c_str());
-    setLumBody.append("float minComp = min(min(outColor.r, outColor.g), outColor.b);"
-                      "float maxComp = max(max(outColor.r, outColor.g), outColor.b);"
+    setLumBody.printf("half diff = %s(lumColor - hueSat);", getFunction.c_str());
+    setLumBody.append("half3 outColor = hueSat + diff;");
+    setLumBody.appendf("half outLum = %s(outColor);", getFunction.c_str());
+    setLumBody.append("half minComp = min(min(outColor.r, outColor.g), outColor.b);"
+                      "half maxComp = max(max(outColor.r, outColor.g), outColor.b);"
                       "if (minComp < 0.0 && outLum != minComp) {"
-                      "outColor = outLum + ((outColor - float3(outLum, outLum, outLum)) * outLum) /"
+                      "outColor = outLum + ((outColor - half3(outLum, outLum, outLum)) * outLum) /"
                       "(outLum - minComp);"
                       "}"
                       "if (maxComp > alpha && maxComp != outLum) {"
                       "outColor = outLum +"
-                      "((outColor - float3(outLum, outLum, outLum)) * (alpha - outLum)) /"
+                      "((outColor - half3(outLum, outLum, outLum)) * (alpha - outLum)) /"
                       "(maxComp - outLum);"
                       "}"
                       "return outColor;");
-    fsBuilder->emitFunction(kVec3f_GrSLType,
+    fsBuilder->emitFunction(kHalf3_GrSLType,
                             "set_luminance",
                             SK_ARRAY_COUNT(setLumArgs), setLumArgs,
                             setLumBody.c_str(),
@@ -188,11 +188,11 @@
 static void add_sat_function(GrGLSLFragmentBuilder* fsBuilder, SkString* setSatFunction) {
     // Emit a helper that gets the saturation of a color
     SkString getFunction;
-    GrShaderVar getSatArgs[] = { GrShaderVar("color", kVec3f_GrSLType) };
+    GrShaderVar getSatArgs[] = { GrShaderVar("color", kHalf3_GrSLType) };
     SkString getSatBody;
     getSatBody.printf("return max(max(color.r, color.g), color.b) - "
                       "min(min(color.r, color.g), color.b);");
-    fsBuilder->emitFunction(kFloat_GrSLType,
+    fsBuilder->emitFunction(kHalf_GrSLType,
                             "saturation",
                             SK_ARRAY_COUNT(getSatArgs), getSatArgs,
                             getSatBody.c_str(),
@@ -204,33 +204,33 @@
     // adjusted min, mid, and max inputs, respectively.
     SkString helperFunction;
     GrShaderVar helperArgs[] = {
-        GrShaderVar("minComp", kFloat_GrSLType),
-        GrShaderVar("midComp", kFloat_GrSLType),
-        GrShaderVar("maxComp", kFloat_GrSLType),
-        GrShaderVar("sat", kFloat_GrSLType),
+        GrShaderVar("minComp", kHalf_GrSLType),
+        GrShaderVar("midComp", kHalf_GrSLType),
+        GrShaderVar("maxComp", kHalf_GrSLType),
+        GrShaderVar("sat", kHalf_GrSLType),
     };
     static const char kHelperBody[] = "if (minComp < maxComp) {"
-        "float3 result;"
+        "half3 result;"
         "result.r = 0.0;"
         "result.g = sat * (midComp - minComp) / (maxComp - minComp);"
         "result.b = sat;"
         "return result;"
         "} else {"
-        "return float3(0, 0, 0);"
+        "return half3(0, 0, 0);"
         "}";
-    fsBuilder->emitFunction(kVec3f_GrSLType,
+    fsBuilder->emitFunction(kHalf3_GrSLType,
                             "set_saturation_helper",
                             SK_ARRAY_COUNT(helperArgs), helperArgs,
                             kHelperBody,
                             &helperFunction);
 
     GrShaderVar setSatArgs[] = {
-        GrShaderVar("hueLumColor", kVec3f_GrSLType),
-        GrShaderVar("satColor", kVec3f_GrSLType),
+        GrShaderVar("hueLumColor", kHalf3_GrSLType),
+        GrShaderVar("satColor", kHalf3_GrSLType),
     };
     const char* helpFunc = helperFunction.c_str();
     SkString setSatBody;
-    setSatBody.appendf("float sat = %s(satColor);"
+    setSatBody.appendf("half sat = %s(satColor);"
                        "if (hueLumColor.r <= hueLumColor.g) {"
                        "if (hueLumColor.g <= hueLumColor.b) {"
                        "hueLumColor.rgb = %s(hueLumColor.r, hueLumColor.g, hueLumColor.b, sat);"
@@ -249,7 +249,7 @@
                        "return hueLumColor;",
                        getFunction.c_str(), helpFunc, helpFunc, helpFunc, helpFunc,
                        helpFunc, helpFunc);
-    fsBuilder->emitFunction(kVec3f_GrSLType,
+    fsBuilder->emitFunction(kHalf3_GrSLType,
                             "set_saturation",
                             SK_ARRAY_COUNT(setSatArgs), setSatArgs,
                             setSatBody.c_str(),
@@ -330,7 +330,7 @@
             SkString setSat, setLum;
             add_sat_function(fsBuilder, &setSat);
             add_lum_function(fsBuilder, &setLum);
-            fsBuilder->codeAppendf("float4 dstSrcAlpha = %s * %s.a;",
+            fsBuilder->codeAppendf("half4 dstSrcAlpha = %s * %s.a;",
                                    dstColor, srcColor);
             fsBuilder->codeAppendf("%s.rgb = %s(%s(%s.rgb * %s.a, dstSrcAlpha.rgb),"
                                    "dstSrcAlpha.a, dstSrcAlpha.rgb);",
@@ -345,7 +345,7 @@
             SkString setSat, setLum;
             add_sat_function(fsBuilder, &setSat);
             add_lum_function(fsBuilder, &setLum);
-            fsBuilder->codeAppendf("float4 dstSrcAlpha = %s * %s.a;",
+            fsBuilder->codeAppendf("half4 dstSrcAlpha = %s * %s.a;",
                                    dstColor, srcColor);
             fsBuilder->codeAppendf("%s.rgb = %s(%s(dstSrcAlpha.rgb, %s.rgb * %s.a),"
                                    "dstSrcAlpha.a, dstSrcAlpha.rgb);",
@@ -359,7 +359,7 @@
             //  SetLum(S * Da, Sa* Da, D * Sa) + (1 - Sa) * D + (1 - Da) * S
             SkString setLum;
             add_lum_function(fsBuilder, &setLum);
-            fsBuilder->codeAppendf("float4 srcDstAlpha = %s * %s.a;",
+            fsBuilder->codeAppendf("half4 srcDstAlpha = %s * %s.a;",
                                    srcColor, dstColor);
             fsBuilder->codeAppendf("%s.rgb = %s(srcDstAlpha.rgb, srcDstAlpha.a, %s.rgb * %s.a);",
                                    outputColor, setLum.c_str(), dstColor, srcColor);
@@ -371,7 +371,7 @@
             //  SetLum(D * Sa, Sa* Da, S * Da) + (1 - Sa) * D + (1 - Da) * S
             SkString setLum;
             add_lum_function(fsBuilder, &setLum);
-            fsBuilder->codeAppendf("float4 srcDstAlpha = %s * %s.a;",
+            fsBuilder->codeAppendf("half4 srcDstAlpha = %s * %s.a;",
                                    srcColor, dstColor);
             fsBuilder->codeAppendf("%s.rgb = %s(%s.rgb * %s.a, srcDstAlpha.a, srcDstAlpha.rgb);",
                                    outputColor, setLum.c_str(), dstColor, srcColor);
@@ -406,13 +406,13 @@
                 fsBuilder->codeAppendf(" * %s", srcColorName);
                 break;
             case SkBlendModeCoeff::kISC:
-                fsBuilder->codeAppendf(" * (float4(1.0) - %s)", srcColorName);
+                fsBuilder->codeAppendf(" * (half4(1.0) - %s)", srcColorName);
                 break;
             case SkBlendModeCoeff::kDC:
                 fsBuilder->codeAppendf(" * %s", dstColorName);
                 break;
             case SkBlendModeCoeff::kIDC:
-                fsBuilder->codeAppendf(" * (float4(1.0) - %s)", dstColorName);
+                fsBuilder->codeAppendf(" * (half4(1.0) - %s)", dstColorName);
                 break;
             case SkBlendModeCoeff::kSA:
                 fsBuilder->codeAppendf(" * %s.a", srcColorName);
@@ -453,7 +453,7 @@
                                                 false);
         // append dst blend
         if(!append_porterduff_term(fsBuilder, dstCoeff, dstColor, srcColor, dstColor, didAppend)) {
-            fsBuilder->codeAppend("float4(0, 0, 0, 0)");
+            fsBuilder->codeAppend("half4(0, 0, 0, 0)");
         }
         if (clamp) {
             fsBuilder->codeAppend(", 0, 1);");
@@ -505,7 +505,7 @@
                                             false);
     // append dst blend
     if(!append_porterduff_term(fsBuilder, dstCoeff, dstColor, srcColor, dstColor, didAppend)) {
-        fsBuilder->codeAppend("float4(0, 0, 0, 0)");
+        fsBuilder->codeAppend("half4(0, 0, 0, 0)");
     }
     fsBuilder->codeAppend(";");
 }