Draw dmsaa rects with GrFillRRectOp
Bug: skia:11396
Change-Id: I0618e8ecfb3fe8e7539c1d808abf9b879d1d6694
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/386516
Commit-Queue: Chris Dalton <csmartdalton@google.com>
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
diff --git a/src/gpu/ops/GrFillRRectOp.cpp b/src/gpu/ops/GrFillRRectOp.cpp
index ac55987..d6a8cd8 100644
--- a/src/gpu/ops/GrFillRRectOp.cpp
+++ b/src/gpu/ops/GrFillRRectOp.cpp
@@ -35,6 +35,7 @@
GrPaint&&,
const SkMatrix& viewMatrix,
const SkRRect&,
+ const SkRect& localRect,
GrAA);
const char* name() const final { return "GrFillRRectOp"; }
@@ -79,6 +80,7 @@
const SkPMColor4f& paintColor,
const SkMatrix& totalShapeMatrix,
const SkRRect&,
+ const SkRect& localRect,
ProcessorFlags,
const SkRect& devBounds);
@@ -142,6 +144,7 @@
GrPaint&& paint,
const SkMatrix& viewMatrix,
const SkRRect& rrect,
+ const SkRect& localRect,
GrAA aa) {
using Helper = GrSimpleMeshDrawOpHelper;
@@ -151,6 +154,12 @@
return nullptr;
}
+ // We transform into a normalized -1..+1 space to draw the round rect. If the boundaries are too
+ // large, the math can overflow. The caller can fall back on path rendering if this is the case.
+ if (std::max(rrect.height(), rrect.width()) >= 1e6f) {
+ return nullptr;
+ }
+
ProcessorFlags flags = ProcessorFlags::kNone;
// TODO: Support perspective in a follow-on CL. This shouldn't be difficult, since we already
// use HW derivatives. The only trick will be adjusting the AA outset to account for
@@ -183,13 +192,15 @@
devBounds.outset(SkScalarAbs(m.getScaleX()) + SkScalarAbs(m.getSkewX()),
SkScalarAbs(m.getSkewY()) + SkScalarAbs(m.getScaleY()));
- return Helper::FactoryHelper<FillRRectOp>(ctx, std::move(paint), m, rrect, flags, devBounds);
+ return Helper::FactoryHelper<FillRRectOp>(ctx, std::move(paint), m, rrect, localRect, flags,
+ devBounds);
}
FillRRectOp::FillRRectOp(GrProcessorSet* processorSet,
const SkPMColor4f& paintColor,
const SkMatrix& totalShapeMatrix,
const SkRRect& rrect,
+ const SkRect& localRect,
ProcessorFlags processorFlags,
const SkRect& devBounds)
: INHERITED(ClassID())
@@ -198,7 +209,7 @@
? GrAAType::kNone
: GrAAType::kCoverage) // Use analytic AA even if the RT is MSAA.
, fColor(paintColor)
- , fLocalRect(rrect.rect())
+ , fLocalRect(localRect)
, fProcessorFlags(processorFlags & ~(ProcessorFlags::kHasLocalCoords |
ProcessorFlags::kWideColor |
ProcessorFlags::kMSAAEnabled)) {
@@ -766,10 +777,12 @@
GrPaint&& paint,
const SkMatrix& viewMatrix,
const SkRRect& rrect,
+ const SkRect& localRect,
GrAA aa) {
- return FillRRectOp::Make(ctx, std::move(paint), viewMatrix, rrect, aa);
+ return FillRRectOp::Make(ctx, std::move(paint), viewMatrix, rrect, localRect, aa);
}
+
#if GR_TEST_UTILS
#include "src/gpu/GrDrawOpTest.h"
@@ -790,6 +803,7 @@
std::move(paint),
viewMatrix,
rrect,
+ rrect.rect(),
aa);
}