Specialize scale+translate transforms for explicitly sampled FPs.

This is to support using YUV->RGB in more places where we would incur a
full 3x3 matrix multiply for each plane in the fragment shader without
this.

Change-Id: I27c2a403429c36662eba91f61b08e5331ec678b5
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/278356
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/src/gpu/GrPathProcessor.cpp b/src/gpu/GrPathProcessor.cpp
index 61c84d2..b365740 100644
--- a/src/gpu/GrPathProcessor.cpp
+++ b/src/gpu/GrPathProcessor.cpp
@@ -62,12 +62,10 @@
                         FPCoordTransformHandler* transformHandler) {
         for (int i = 0; *transformHandler; ++*transformHandler, ++i) {
             auto [coordTransform, fp] = transformHandler->get();
-            GrSLType varyingType =
-                    coordTransform.matrix().hasPerspective() ? kHalf3_GrSLType : kHalf2_GrSLType;
 
             SkString matrix;
-            UniformHandle uniformHandle;
             GrShaderVar fragmentVar;
+            GrShaderVar transformVar;
             if (fp.isSampledWithExplicitCoords()) {
                 if (coordTransform.isNoOp()) {
                     transformHandler->omitCoordsForCurrCoordTransform();
@@ -76,19 +74,25 @@
                     const char* name;
                     SkString strUniName;
                     strUniName.printf("CoordTransformMatrix_%d", i);
-                    fUniformTransform.push_back().fHandle =
-                            uniformHandler
-                                    ->addUniform(kFragment_GrShaderFlag,
-                                                 kFloat3x3_GrSLType,
-                                                 strUniName.c_str(),
-                                                 &name)
-                                    .toIndex();
-                    uniformHandle = fUniformTransform.back().fHandle;
-                    matrix = name;
+                    auto& uni = fUniformTransform.push_back();
+                    if (coordTransform.matrix().isScaleTranslate()) {
+                        uni.fType = kFloat4_GrSLType;
+                    } else {
+                        uni.fType = kFloat3x3_GrSLType;
+                    }
+                    uni.fHandle = uniformHandler
+                                          ->addUniform(kFragment_GrShaderFlag,
+                                                       uni.fType,
+                                                       strUniName.c_str(),
+                                                       &name)
+                                          .toIndex();
+                    transformVar = uniformHandler->getUniformVariable(uni.fHandle);
                 }
             } else {
                 SkString strVaryingName;
                 strVaryingName.printf("TransformedCoord_%d", i);
+                GrSLType varyingType = coordTransform.matrix().hasPerspective() ? kHalf3_GrSLType
+                                                                                : kHalf2_GrSLType;
                 GrGLSLVarying v(varyingType);
 #ifdef SK_GL
                 GrGLVaryingHandler* glVaryingHandler = (GrGLVaryingHandler*)varyingHandler;
@@ -100,8 +104,7 @@
                 matrix = matrix_to_sksl(coordTransform.matrix());
                 fragmentVar = {SkString(v.fsIn()), varyingType};
             }
-            transformHandler->specifyCoordsForCurrCoordTransform(matrix, uniformHandle,
-                                                                 fragmentVar);
+            transformHandler->specifyCoordsForCurrCoordTransform(transformVar, fragmentVar);
         }
     }
 
@@ -124,7 +127,14 @@
                     SkMatrix m = GetTransformMatrix(transform, SkMatrix::I());
                     if (!SkMatrixPriv::CheapEqual(fUniformTransform[u].fCurrentValue, m)) {
                         fUniformTransform[u].fCurrentValue = m;
-                        pd.setSkMatrix(fUniformTransform[u].fHandle.toIndex(), m);
+                        if (fUniformTransform[u].fType == kFloat4_GrSLType) {
+                            float values[4] = {m.getScaleX(), m.getTranslateX(),
+                                               m.getScaleY(), m.getTranslateY()};
+                            pd.set4fv(fUniformTransform[u].fHandle.toIndex(), 1, values);
+                        } else {
+                            SkASSERT(fUniformTransform[u].fType == kFloat3x3_GrSLType);
+                            pd.setSkMatrix(fUniformTransform[u].fHandle.toIndex(), m);
+                        }
                     }
                 }
                 ++u;
@@ -159,6 +169,7 @@
     struct TransformUniform {
         UniformHandle fHandle;
         SkMatrix      fCurrentValue = SkMatrix::InvalidMatrix();
+        GrSLType      fType = kVoid_GrSLType;
     };
 
     SkTArray<TransformVarying, true> fVaryingTransform;