SkVector4 as ctype for half4

Use in GrColorMatrixFragmentProcessor.

Also make GrColorMatrixFragmentProcessor::Make() call
SkMatrix44::set4x4().


9bf803677ea133368178e1eb23e120dd823da151

Bug: skia:8962
Change-Id: I2476f4af03b4e43cc843e6eda28673d1c2454acc
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/217496
Commit-Queue: Brian Osman <brianosman@google.com>
Auto-Submit: Brian Salomon <bsalomon@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
diff --git a/src/gpu/effects/GrColorMatrixFragmentProcessor.fp b/src/gpu/effects/GrColorMatrixFragmentProcessor.fp
index 5bbfda7..f971fb4 100644
--- a/src/gpu/effects/GrColorMatrixFragmentProcessor.fp
+++ b/src/gpu/effects/GrColorMatrixFragmentProcessor.fp
@@ -6,7 +6,7 @@
  */
 
 layout(ctype=SkMatrix44, tracked) in uniform half4x4 m;
-layout(ctype=SkRect, tracked) in uniform half4 v;
+layout(ctype=SkVector4, tracked) in uniform half4 v;
 layout(key) in bool unpremulInput;
 layout(key) in bool clampRGBOutput;
 layout(key) in bool premulOutput;
@@ -46,10 +46,10 @@
             color.fA = input.fA;
         }
         m.mapScalars(color.vec());
-        color.fR += v.fLeft;
-        color.fG += v.fTop;
-        color.fB += v.fRight;
-        color.fA += v.fBottom;
+        color.fR += v.fData[0];
+        color.fG += v.fData[1];
+        color.fB += v.fData[2];
+        color.fA += v.fData[3];
         color.fA = SkTPin(color.fA, 0.f, 1.f);
         if (clampRGBOutput) {
             color.fR = SkTPin(color.fR, 0.f, 1.f);
@@ -66,15 +66,14 @@
 
 @make {
     static std::unique_ptr<GrFragmentProcessor> Make(const float matrix[20], bool unpremulInput, bool clampRGBOutput, bool premulOutput) {
-        const float m[] {
-                matrix[0],  matrix[1],  matrix[2],  matrix[3],
-                matrix[5],  matrix[6],  matrix[7],  matrix[8],
-                matrix[10], matrix[11], matrix[12], matrix[13],
-                matrix[15], matrix[16], matrix[17], matrix[18]
-        };
         SkMatrix44 m44;
-        m44.setRowMajorf(m);
-        SkRect v4 = SkRect::MakeLTRB(matrix[4], matrix[9], matrix[14], matrix[19]);
+        m44.set4x4(
+                matrix[0], matrix[5], matrix[10], matrix[15],
+                matrix[1], matrix[6], matrix[11], matrix[16],
+                matrix[2], matrix[7], matrix[12], matrix[17],
+                matrix[3], matrix[8], matrix[13], matrix[18]
+        );
+        auto v4 = SkVector4(matrix[4], matrix[9], matrix[14], matrix[19]);
         return std::unique_ptr<GrFragmentProcessor>(new GrColorMatrixFragmentProcessor(m44, v4, unpremulInput, clampRGBOutput, premulOutput));
     }
 }
diff --git a/src/gpu/effects/generated/GrColorMatrixFragmentProcessor.cpp b/src/gpu/effects/generated/GrColorMatrixFragmentProcessor.cpp
index c0cf275..2a9c206 100644
--- a/src/gpu/effects/generated/GrColorMatrixFragmentProcessor.cpp
+++ b/src/gpu/effects/generated/GrColorMatrixFragmentProcessor.cpp
@@ -60,15 +60,15 @@
                 mPrev = mValue;
                 pdman.setSkMatrix44(mVar, mValue);
             }
-            const SkRect& vValue = _outer.v;
-            if (vPrev.isEmpty() || vPrev != vValue) {
+            const SkVector4& vValue = _outer.v;
+            if (vPrev != (vValue)) {
                 vPrev = vValue;
-                pdman.set4fv(vVar, 1, reinterpret_cast<const float*>(&vValue));
+                pdman.set4fv(vVar, 1, vValue.fData);
             }
         }
     }
     SkMatrix44 mPrev = SkMatrix44(SkMatrix44::kNaN_Constructor);
-    SkRect vPrev = SkRect::MakeEmpty();
+    SkVector4 vPrev = SkVector4(SK_MScalarNaN, SK_MScalarNaN, SK_MScalarNaN, SK_MScalarNaN);
     UniformHandle mVar;
     UniformHandle vVar;
 };
diff --git a/src/gpu/effects/generated/GrColorMatrixFragmentProcessor.h b/src/gpu/effects/generated/GrColorMatrixFragmentProcessor.h
index 3506e92..a9609aa 100644
--- a/src/gpu/effects/generated/GrColorMatrixFragmentProcessor.h
+++ b/src/gpu/effects/generated/GrColorMatrixFragmentProcessor.h
@@ -27,10 +27,10 @@
             color.fA = input.fA;
         }
         m.mapScalars(color.vec());
-        color.fR += v.fLeft;
-        color.fG += v.fTop;
-        color.fB += v.fRight;
-        color.fA += v.fBottom;
+        color.fR += v.fData[0];
+        color.fG += v.fData[1];
+        color.fB += v.fData[2];
+        color.fA += v.fData[3];
         color.fA = SkTPin(color.fA, 0.f, 1.f);
         if (clampRGBOutput) {
             color.fR = SkTPin(color.fR, 0.f, 1.f);
@@ -46,12 +46,11 @@
 
     static std::unique_ptr<GrFragmentProcessor> Make(const float matrix[20], bool unpremulInput,
                                                      bool clampRGBOutput, bool premulOutput) {
-        const float m[]{matrix[0],  matrix[1],  matrix[2],  matrix[3],  matrix[5],  matrix[6],
-                        matrix[7],  matrix[8],  matrix[10], matrix[11], matrix[12], matrix[13],
-                        matrix[15], matrix[16], matrix[17], matrix[18]};
         SkMatrix44 m44;
-        m44.setRowMajorf(m);
-        SkRect v4 = SkRect::MakeLTRB(matrix[4], matrix[9], matrix[14], matrix[19]);
+        m44.set4x4(matrix[0], matrix[5], matrix[10], matrix[15], matrix[1], matrix[6], matrix[11],
+                   matrix[16], matrix[2], matrix[7], matrix[12], matrix[17], matrix[3], matrix[8],
+                   matrix[13], matrix[18]);
+        auto v4 = SkVector4(matrix[4], matrix[9], matrix[14], matrix[19]);
         return std::unique_ptr<GrFragmentProcessor>(new GrColorMatrixFragmentProcessor(
                 m44, v4, unpremulInput, clampRGBOutput, premulOutput));
     }
@@ -59,14 +58,14 @@
     std::unique_ptr<GrFragmentProcessor> clone() const override;
     const char* name() const override { return "ColorMatrixFragmentProcessor"; }
     SkMatrix44 m;
-    SkRect v;
+    SkVector4 v;
     bool unpremulInput;
     bool clampRGBOutput;
     bool premulOutput;
 
 private:
-    GrColorMatrixFragmentProcessor(SkMatrix44 m, SkRect v, bool unpremulInput, bool clampRGBOutput,
-                                   bool premulOutput)
+    GrColorMatrixFragmentProcessor(SkMatrix44 m, SkVector4 v, bool unpremulInput,
+                                   bool clampRGBOutput, bool premulOutput)
             : INHERITED(kGrColorMatrixFragmentProcessor_ClassID,
                         (OptimizationFlags)kConstantOutputForConstantInput_OptimizationFlag)
             , m(m)
diff --git a/src/sksl/SkSLCPPCodeGenerator.cpp b/src/sksl/SkSLCPPCodeGenerator.cpp
index 1ef7c43..350fcaf 100644
--- a/src/sksl/SkSLCPPCodeGenerator.cpp
+++ b/src/sksl/SkSLCPPCodeGenerator.cpp
@@ -207,6 +207,12 @@
                 fFormatArgs.push_back(cppCode + ".fB");
                 fFormatArgs.push_back(cppCode + ".fA");
                 break;
+            case Layout::CType::kSkVector4:
+                fFormatArgs.push_back(cppCode + ".fData[0]");
+                fFormatArgs.push_back(cppCode + ".fData[1]");
+                fFormatArgs.push_back(cppCode + ".fData[2]");
+                fFormatArgs.push_back(cppCode + ".fData[3]");
+                break;
             case Layout::CType::kSkRect: // fall through
             case Layout::CType::kDefault:
                 fFormatArgs.push_back(cppCode + ".left()");
diff --git a/src/sksl/SkSLCPPUniformCTypes.cpp b/src/sksl/SkSLCPPUniformCTypes.cpp
index 1bd7b4c..2740762 100644
--- a/src/sksl/SkSLCPPUniformCTypes.cpp
+++ b/src/sksl/SkSLCPPUniformCTypes.cpp
@@ -161,6 +161,11 @@
         "${pdman}.set4fv(${uniform}, 1, ${var}.vec())",                            // to gpu
         "{SK_FloatNaN, SK_FloatNaN, SK_FloatNaN, SK_FloatNaN}"),                   // default value
 
+    REGISTER(Layout::CType::kSkVector4, { "half4", "float4", "double4" },
+        "${pdman}.set4fv(${uniform}, 1, ${var}.fData)",                            // to gpu
+        "SkVector4(SK_MScalarNaN, SK_MScalarNaN, SK_MScalarNaN, SK_MScalarNaN)",   // default value
+        "${oldVar} != (${newVar})"),                                               // dirty check
+
     REGISTER(Layout::CType::kSkPoint, { "half2", "float2", "double2" } ,
         "${pdman}.set2f(${uniform}, ${var}.fX, ${var}.fY)",                        // to gpu
         "SkPoint::Make(SK_FloatNaN, SK_FloatNaN)"),                                // default value
diff --git a/src/sksl/SkSLParser.cpp b/src/sksl/SkSLParser.cpp
index 31be959..f9299fc 100644
--- a/src/sksl/SkSLParser.cpp
+++ b/src/sksl/SkSLParser.cpp
@@ -123,6 +123,7 @@
     TOKEN(TRACKED,                      "tracked");
     TOKEN(CTYPE,                        "ctype");
     TOKEN(SKPMCOLOR4F,                  "SkPMColor4f");
+    TOKEN(SKVECTOR4,                    "SkVector4");
     TOKEN(SKRECT,                       "SkRect");
     TOKEN(SKIRECT,                      "SkIRect");
     TOKEN(SKPMCOLOR,                    "SkPMColor");
@@ -738,6 +739,8 @@
             switch (found->second) {
                 case LayoutToken::SKPMCOLOR4F:
                     return Layout::CType::kSkPMColor4f;
+                case LayoutToken::SKVECTOR4:
+                    return Layout::CType::kSkVector4;
                 case LayoutToken::SKRECT:
                     return Layout::CType::kSkRect;
                 case LayoutToken::SKIRECT:
diff --git a/src/sksl/SkSLParser.h b/src/sksl/SkSLParser.h
index dd1898c..9f69ac5 100644
--- a/src/sksl/SkSLParser.h
+++ b/src/sksl/SkSLParser.h
@@ -92,6 +92,7 @@
         TRACKED,
         CTYPE,
         SKPMCOLOR4F,
+        SKVECTOR4,
         SKRECT,
         SKIRECT,
         SKPMCOLOR,
diff --git a/src/sksl/ir/SkSLLayout.h b/src/sksl/ir/SkSLLayout.h
index 30bf99f..9916f47 100644
--- a/src/sksl/ir/SkSLLayout.h
+++ b/src/sksl/ir/SkSLLayout.h
@@ -86,6 +86,7 @@
         kSkIRect,
         kSkPMColor4f,
         kSkPMColor,
+        kSkVector4,
         kSkPoint,
         kSkIPoint,
         kSkMatrix,
@@ -158,6 +159,8 @@
                 return "SkPMColor4f";
             case CType::kSkPMColor:
                 return "SkPMColor";
+            case CType::kSkVector4:
+                return "SkVector4";
             case CType::kSkPoint:
                 return "SkPoint";
             case CType::kSkIPoint: