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;