Reland "Try to avoid vertex colors in Texture/FillRect ops when possible."
This is a reland of e0b989e5e3ab64f3585fe1bf0228e964dad0678c
Original change's description:
> Try to avoid vertex colors in Texture/FillRect ops when possible.
>
> Avoids unnecessary fragment shader color multiplication.
>
> Change-Id: I353d3ca91824ce20c9e9af1c5c84ab9953ddd8ab
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/201004
> Commit-Queue: Brian Salomon <bsalomon@google.com>
> Reviewed-by: Michael Ludwig <michaelludwig@google.com>
Change-Id: I22125cb7058f528cb368ff30c3c26e3d55056e66
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/201222
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/src/gpu/ops/GrQuadPerEdgeAA.cpp b/src/gpu/ops/GrQuadPerEdgeAA.cpp
index 4845b55..cdc49b3 100644
--- a/src/gpu/ops/GrQuadPerEdgeAA.cpp
+++ b/src/gpu/ops/GrQuadPerEdgeAA.cpp
@@ -624,9 +624,7 @@
// Writes four vertices in triangle strip order, including the additional data for local
// coordinates, domain, color, and coverage as needed to satisfy the vertex spec.
static void write_quad(GrVertexWriter* vb, const GrQuadPerEdgeAA::VertexSpec& spec,
- CoverageMode mode, Sk4f coverage,
- SkPMColor4f color4f, bool wideColor,
- const SkRect& domain,
+ CoverageMode mode, Sk4f coverage, SkPMColor4f color4f, const SkRect& domain,
const Vertices& quad) {
static constexpr auto If = GrVertexWriter::If<float>;
@@ -639,8 +637,9 @@
// save color
if (spec.hasVertexColors()) {
+ bool wide = spec.colorType() == GrQuadPerEdgeAA::ColorType::kHalf;
vb->write(GrVertexColor(
- color4f * (mode == CoverageMode::kWithColor ? coverage[i] : 1.f), wideColor));
+ color4f * (mode == CoverageMode::kWithColor ? coverage[i] : 1.f), wide));
}
// save local position
@@ -684,12 +683,21 @@
namespace GrQuadPerEdgeAA {
+ColorType MinColorType(SkPMColor4f color) {
+ if (color == SK_PMColor4fWHITE) {
+ return ColorType::kNone;
+ } else if (color.fitsInBytes()) {
+ return ColorType::kByte;
+ } else {
+ return ColorType::kHalf;
+ }
+}
+
////////////////// Tessellate Implementation
void* Tessellate(void* vertices, const VertexSpec& spec, const GrPerspQuad& deviceQuad,
const SkPMColor4f& color4f, const GrPerspQuad& localQuad, const SkRect& domain,
GrQuadAAFlags aaFlags) {
- bool wideColor = GrQuadPerEdgeAA::ColorType::kHalf == spec.colorType();
CoverageMode mode = get_mode_for_spec(spec);
// Load position data into Sk4fs (always x, y, and load w to avoid branching down the road)
@@ -732,12 +740,12 @@
// applied a mirror, etc. The current 2D case is already adequately fast.
// Write two quads for inner and outer, inner will use the
- write_quad(&vb, spec, mode, maxCoverage, color4f, wideColor, domain, inner);
- write_quad(&vb, spec, mode, 0.f, color4f, wideColor, domain, outer);
+ write_quad(&vb, spec, mode, maxCoverage, color4f, domain, inner);
+ write_quad(&vb, spec, mode, 0.f, color4f, domain, outer);
} else {
// No outsetting needed, just write a single quad with full coverage
SkASSERT(mode == CoverageMode::kNone);
- write_quad(&vb, spec, mode, 1.f, color4f, wideColor, domain, outer);
+ write_quad(&vb, spec, mode, 1.f, color4f, domain, outer);
}
return vb.fPtr;