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);
 }