Add a custom GP for GrDrawVerticesOp
That op only used a few features of the default geometry
processor. It was also the only user of SkColor vertex
colors (and the accompanying color space xform).
In GrDrawVerticesOp, this gets rid of flags entirely, and
uses tri-state enums for both local coords and colors.
We used to have a mix of flags, state inferred from other
fields, and explicit fields. I think the new single
representation simplifies the logic.
Change-Id: I9802585d99a71ca50399f5862489d4f2bd8c5052
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/277470
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/src/gpu/GrDefaultGeoProcFactory.cpp b/src/gpu/GrDefaultGeoProcFactory.cpp
index 967fe51..fcbb282 100644
--- a/src/gpu/GrDefaultGeoProcFactory.cpp
+++ b/src/gpu/GrDefaultGeoProcFactory.cpp
@@ -10,7 +10,6 @@
#include "include/core/SkRefCnt.h"
#include "src/core/SkArenaAlloc.h"
#include "src/gpu/GrCaps.h"
-#include "src/gpu/glsl/GrGLSLColorSpaceXformHelper.h"
#include "src/gpu/glsl/GrGLSLFragmentShaderBuilder.h"
#include "src/gpu/glsl/GrGLSLGeometryProcessor.h"
#include "src/gpu/glsl/GrGLSLUniformHandler.h"
@@ -25,11 +24,10 @@
enum GPFlag {
kColorAttribute_GPFlag = 0x1,
- kColorAttributeIsSkColor_GPFlag = 0x2,
- kColorAttributeIsWide_GPFlag = 0x4,
- kLocalCoordAttribute_GPFlag = 0x8,
- kCoverageAttribute_GPFlag = 0x10,
- kCoverageAttributeTweak_GPFlag = 0x20,
+ kColorAttributeIsWide_GPFlag = 0x2,
+ kLocalCoordAttribute_GPFlag = 0x4,
+ kCoverageAttribute_GPFlag = 0x8,
+ kCoverageAttributeTweak_GPFlag = 0x10,
};
class DefaultGeoProc : public GrGeometryProcessor {
@@ -37,13 +35,11 @@
static GrGeometryProcessor* Make(SkArenaAlloc* arena,
uint32_t gpTypeFlags,
const SkPMColor4f& color,
- sk_sp<GrColorSpaceXform> colorSpaceXform,
const SkMatrix& viewMatrix,
const SkMatrix& localMatrix,
bool localCoordsWillBeRead,
uint8_t coverage) {
- return arena->make<DefaultGeoProc>(gpTypeFlags, color, std::move(colorSpaceXform),
- viewMatrix, localMatrix, coverage,
+ return arena->make<DefaultGeoProc>(gpTypeFlags, color, viewMatrix, localMatrix, coverage,
localCoordsWillBeRead);
}
@@ -82,8 +78,7 @@
GrGLSLVarying varying(kHalf4_GrSLType);
varyingHandler->addVarying("color", &varying);
- // There are several optional steps to process the color. Start with the attribute,
- // or with uniform color (in the case of folding coverage into a uniform color):
+ // Start with the attribute or with uniform color
if (gp.hasVertexColor()) {
vertBuilder->codeAppendf("half4 color = %s;", gp.fInColor.name());
} else {
@@ -95,22 +90,6 @@
vertBuilder->codeAppendf("half4 color = %s;", colorUniformName);
}
- // For SkColor, do a red/blue swap, possible color space conversion, and premul
- if (gp.fFlags & kColorAttributeIsSkColor_GPFlag) {
- vertBuilder->codeAppend("color = color.bgra;");
-
- if (gp.fColorSpaceXform) {
- fColorSpaceHelper.emitCode(uniformHandler, gp.fColorSpaceXform.get(),
- kVertex_GrShaderFlag);
- SkString xformedColor;
- vertBuilder->appendColorGamutXform(&xformedColor, "color",
- &fColorSpaceHelper);
- vertBuilder->codeAppendf("color = %s;", xformedColor.c_str());
- }
-
- vertBuilder->codeAppend("color = half4(color.rgb * color.a, color.a);");
- }
-
// Optionally fold coverage into alpha (color).
if (tweakAlpha) {
vertBuilder->codeAppendf("color = color * %s;", gp.fInCoverage.name());
@@ -130,23 +109,15 @@
gp.viewMatrix(),
&fViewMatrixUniform);
- if (gp.fInLocalCoords.isInitialized()) {
- // emit transforms with explicit local coords
- this->emitTransforms(vertBuilder,
- varyingHandler,
- uniformHandler,
- gp.fInLocalCoords.asShaderVar(),
- gp.localMatrix(),
- args.fFPCoordTransformHandler);
- } else {
- // emit transforms with position
- this->emitTransforms(vertBuilder,
- varyingHandler,
- uniformHandler,
- gp.fInPosition.asShaderVar(),
- gp.localMatrix(),
- args.fFPCoordTransformHandler);
- }
+ // emit transforms using either explicit local coords or positions
+ const auto& coordsAttr = gp.fInLocalCoords.isInitialized() ? gp.fInLocalCoords
+ : gp.fInPosition;
+ this->emitTransforms(vertBuilder,
+ varyingHandler,
+ uniformHandler,
+ coordsAttr.asShaderVar(),
+ gp.localMatrix(),
+ args.fFPCoordTransformHandler);
// Setup coverage as pass through
if (gp.hasVertexCoverage() && !tweakAlpha) {
@@ -174,7 +145,6 @@
key |= (def.localCoordsWillBeRead() && def.localMatrix().hasPerspective()) ? 0x100 : 0;
key |= ComputePosKey(def.viewMatrix()) << 20;
b->add32(key);
- b->add32(GrColorSpaceXform::XformKey(def.fColorSpaceXform.get()));
}
void setData(const GrGLSLProgramDataManager& pdman,
@@ -199,8 +169,6 @@
fCoverage = dgp.coverage();
}
this->setTransformDataHelper(dgp.fLocalMatrix, pdman, transformRange);
-
- fColorSpaceHelper.setData(pdman, dgp.fColorSpaceXform.get());
}
private:
@@ -210,7 +178,6 @@
UniformHandle fViewMatrixUniform;
UniformHandle fColorUniform;
UniformHandle fCoverageUniform;
- GrGLSLColorSpaceXformHelper fColorSpaceHelper;
typedef GrGLSLGeometryProcessor INHERITED;
};
@@ -228,7 +195,6 @@
DefaultGeoProc(uint32_t gpTypeFlags,
const SkPMColor4f& color,
- sk_sp<GrColorSpaceXform> colorSpaceXform,
const SkMatrix& viewMatrix,
const SkMatrix& localMatrix,
uint8_t coverage,
@@ -239,8 +205,7 @@
, fLocalMatrix(localMatrix)
, fCoverage(coverage)
, fFlags(gpTypeFlags)
- , fLocalCoordsWillBeRead(localCoordsWillBeRead)
- , fColorSpaceXform(std::move(colorSpaceXform)) {
+ , fLocalCoordsWillBeRead(localCoordsWillBeRead) {
fInPosition = {"inPosition", kFloat2_GrVertexAttribType, kFloat2_GrSLType};
if (fFlags & kColorAttribute_GPFlag) {
fInColor = MakeColorAttribute("inColor",
@@ -266,7 +231,6 @@
uint8_t fCoverage;
uint32_t fFlags;
bool fLocalCoordsWillBeRead;
- sk_sp<GrColorSpaceXform> fColorSpaceXform;
GR_DECLARE_GEOMETRY_PROCESSOR_TEST
@@ -282,9 +246,6 @@
flags |= kColorAttribute_GPFlag;
}
if (d->fRandom->nextBool()) {
- flags |= kColorAttributeIsSkColor_GPFlag;
- }
- if (d->fRandom->nextBool()) {
flags |= kColorAttributeIsWide_GPFlag;
}
if (d->fRandom->nextBool()) {
@@ -300,7 +261,6 @@
return DefaultGeoProc::Make(d->allocator(),
flags,
SkPMColor4f::FromBytes_RGBA(GrRandomColor(d->fRandom)),
- GrTest::TestColorXform(d->fRandom),
GrTest::TestMatrix(d->fRandom),
GrTest::TestMatrix(d->fRandom),
d->fRandom->nextBool(),
@@ -316,8 +276,6 @@
uint32_t flags = 0;
if (Color::kPremulGrColorAttribute_Type == color.fType) {
flags |= kColorAttribute_GPFlag;
- } else if (Color::kUnpremulSkColorAttribute_Type == color.fType) {
- flags |= kColorAttribute_GPFlag | kColorAttributeIsSkColor_GPFlag;
} else if (Color::kPremulWideColorAttribute_Type == color.fType) {
flags |= kColorAttribute_GPFlag | kColorAttributeIsWide_GPFlag;
}
@@ -334,7 +292,6 @@
return DefaultGeoProc::Make(arena,
flags,
color.fColor,
- color.fColorSpaceXform,
viewMatrix,
localCoords.fMatrix ? *localCoords.fMatrix : SkMatrix::I(),
localCoordsWillBeRead,