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: