Add MSAA and non-aa modes to GrFillRRect Op
Adds a non-aa mode and an MSAA mode that uses the sample mask. Also
adds a new cap to decide whether we prefer this new sample mask Op for
large round rects, or whether it's faster to just continue drawing
them as paths like before.
Bug: skia:
Change-Id: Ic344ace26e7889c312c3040ad345b4d9a717f96d
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/204135
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Chris Dalton <csmartdalton@google.com>
diff --git a/src/gpu/GrRenderTargetContext.cpp b/src/gpu/GrRenderTargetContext.cpp
index 19c7c42..ff3c7c6 100644
--- a/src/gpu/GrRenderTargetContext.cpp
+++ b/src/gpu/GrRenderTargetContext.cpp
@@ -1225,21 +1225,22 @@
AutoCheckFlush acf(this->drawingManager());
GrAAType aaType = this->chooseAAType(aa);
- if (GrAAType::kCoverage == aaType) {
- std::unique_ptr<GrDrawOp> op;
- if (style.isSimpleFill()) {
- op = GrFillRRectOp::Make(fContext, viewMatrix, rrect, *this->caps(), std::move(paint));
- }
- if (!op) {
- assert_alive(paint);
- op = GrOvalOpFactory::MakeRRectOp(fContext, std::move(paint), viewMatrix, rrect, stroke,
- this->caps()->shaderCaps());
- }
- if (op) {
- this->addDrawOp(*clip, std::move(op));
- return;
- }
+ std::unique_ptr<GrDrawOp> op;
+ if (style.isSimpleFill()) {
+ assert_alive(paint);
+ op = GrFillRRectOp::Make(
+ fContext, aaType, viewMatrix, rrect, *this->caps(), std::move(paint));
+ }
+ if (!op && GrAAType::kCoverage == aaType) {
+ assert_alive(paint);
+ op = GrOvalOpFactory::MakeRRectOp(
+ fContext, std::move(paint), viewMatrix, rrect, stroke, this->caps()->shaderCaps());
+
+ }
+ if (op) {
+ this->addDrawOp(*clip, std::move(op));
+ return;
}
assert_alive(paint);
@@ -1630,29 +1631,31 @@
AutoCheckFlush acf(this->drawingManager());
GrAAType aaType = this->chooseAAType(aa);
- if (GrAAType::kCoverage == aaType) {
- std::unique_ptr<GrDrawOp> op;
+
+ std::unique_ptr<GrDrawOp> op;
+ if (style.isSimpleFill()) {
// GrFillRRectOp has special geometry and a fragment-shader branch to conditionally evaluate
// the arc equation. This same special geometry and fragment branch also turn out to be a
// substantial optimization for drawing ovals (namely, by not evaluating the arc equation
// inside the oval's inner diamond). Given these optimizations, it's a clear win to draw
// ovals the exact same way we do round rects.
//
- // However, we still don't draw true circles as round rects, because it can cause perf
- // regressions on some platforms as compared to the dedicated circle Op.
- if (style.isSimpleFill() && oval.height() != oval.width()) {
- op = GrFillRRectOp::Make(
- fContext, viewMatrix, SkRRect::MakeOval(oval), *this->caps(), std::move(paint));
- }
- if (!op) {
+ // However, we still don't draw true circles as round rects in coverage mode, because it can
+ // cause perf regressions on some platforms as compared to the dedicated circle Op.
+ if (GrAAType::kCoverage != aaType || oval.height() != oval.width()) {
assert_alive(paint);
- op = GrOvalOpFactory::MakeOvalOp(fContext, std::move(paint), viewMatrix, oval, style,
- this->caps()->shaderCaps());
+ op = GrFillRRectOp::Make(fContext, aaType, viewMatrix, SkRRect::MakeOval(oval),
+ *this->caps(), std::move(paint));
}
- if (op) {
- this->addDrawOp(clip, std::move(op));
- return;
- }
+ }
+ if (!op && GrAAType::kCoverage == aaType) {
+ assert_alive(paint);
+ op = GrOvalOpFactory::MakeOvalOp(fContext, std::move(paint), viewMatrix, oval, style,
+ this->caps()->shaderCaps());
+ }
+ if (op) {
+ this->addDrawOp(clip, std::move(op));
+ return;
}
assert_alive(paint);