Revert "Migrate uses of deferred proxies to lazy proxies"

This reverts commit 990a0d8b6563941d69aa24ecae847be150ab1128.

Reason for revert: Keeping it. Deferred proxies are uploaded later than lazy and we want that for this use case.

Original change's description:
> Migrate uses of deferred proxies to lazy proxies
>
> A follow-up CL removes the deferred proxies system entirely.
>
> Bug: skia:11288
> Change-Id: Ic5b3ce820ea946f6ae27bd763c0f389caf8863d1
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/366716
> Reviewed-by: Brian Salomon <bsalomon@google.com>
> Commit-Queue: Adlai Holler <adlai@google.com>

TBR=bsalomon@google.com,robertphillips@google.com,adlai@google.com

# Not skipping CQ checks because original CL landed > 1 day ago.

Bug: skia:11288
Change-Id: I9ced532d013805afae3b20baa53cab31cae2b953
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/368797
Reviewed-by: Adlai Holler <adlai@google.com>
Commit-Queue: Adlai Holler <adlai@google.com>
diff --git a/src/gpu/GrSoftwarePathRenderer.cpp b/src/gpu/GrSoftwarePathRenderer.cpp
index 0f43d27..e4dc789 100644
--- a/src/gpu/GrSoftwarePathRenderer.cpp
+++ b/src/gpu/GrSoftwarePathRenderer.cpp
@@ -173,10 +173,27 @@
                   dstRect, invert);
 }
 
+static GrSurfaceProxyView make_deferred_mask_texture_view(GrRecordingContext* context,
+                                                          SkBackingFit fit,
+                                                          SkISize dimensions) {
+    GrProxyProvider* proxyProvider = context->priv().proxyProvider();
+    const GrCaps* caps = context->priv().caps();
+
+    const GrBackendFormat format = caps->getDefaultBackendFormat(GrColorType::kAlpha_8,
+                                                                 GrRenderable::kNo);
+
+    GrSwizzle swizzle = caps->getReadSwizzle(format, GrColorType::kAlpha_8);
+
+    auto proxy =
+            proxyProvider->createProxy(format, dimensions, GrRenderable::kNo, 1, GrMipmapped::kNo,
+                                       fit, SkBudgeted::kYes, GrProtected::kNo);
+    return {std::move(proxy), kTopLeft_GrSurfaceOrigin, swizzle};
+}
+
 namespace {
 
 /**
- * Payload class for use with GrSWMaskHelper. The software path renderer only draws
+ * Payload class for use with GrTDeferredProxyUploader. The software path renderer only draws
  * a single path into the mask texture. This stores all of the information needed by the worker
  * thread's call to drawShape (see below, in onDrawPath).
  */
@@ -190,7 +207,7 @@
             , fAA(aa) {}
 
     const SkIRect& getMaskBounds() const { return fMaskBounds; }
-    const SkMatrix& getViewMatrix() const { return fViewMatrix; }
+    const SkMatrix* getViewMatrix() const { return &fViewMatrix; }
     const GrStyledShape& getShape() const { return fShape; }
     GrAA getAA() const { return fAA; }
 
@@ -309,15 +326,44 @@
     if (!view) {
         SkBackingFit fit = useCache ? SkBackingFit::kExact : SkBackingFit::kApprox;
         GrAA aa = GrAA(GrAAType::kCoverage == args.fAAType);
-        SoftwarePathData data(*boundsForMask, *args.fViewMatrix, *args.fShape, aa);
-        view = GrSWMaskHelper::MakeTexture(data.getMaskBounds(),
-                                           args.fContext,
-                                           fit,
-                                           [data{std::move(data)}](GrSWMaskHelper* helper) {
-            TRACE_EVENT0("skia.gpu", "SW Mask Render");
-            helper->drawShape(data.getShape(), data.getViewMatrix(), SkRegion::kReplace_Op,
-                              data.getAA(), 0xFF);
-        });
+
+        SkTaskGroup* taskGroup = nullptr;
+        if (auto direct = args.fContext->asDirectContext()) {
+            taskGroup = direct->priv().getTaskGroup();
+        }
+
+        if (taskGroup) {
+            view = make_deferred_mask_texture_view(args.fContext, fit, boundsForMask->size());
+            if (!view) {
+                return false;
+            }
+
+            auto uploader = std::make_unique<GrTDeferredProxyUploader<SoftwarePathData>>(
+                    *boundsForMask, *args.fViewMatrix, *args.fShape, aa);
+            GrTDeferredProxyUploader<SoftwarePathData>* uploaderRaw = uploader.get();
+
+            auto drawAndUploadMask = [uploaderRaw] {
+                TRACE_EVENT0("skia.gpu", "Threaded SW Mask Render");
+                GrSWMaskHelper helper(uploaderRaw->getPixels());
+                if (helper.init(uploaderRaw->data().getMaskBounds())) {
+                    helper.drawShape(uploaderRaw->data().getShape(),
+                                     *uploaderRaw->data().getViewMatrix(),
+                                     SkRegion::kReplace_Op, uploaderRaw->data().getAA(), 0xFF);
+                } else {
+                    SkDEBUGFAIL("Unable to allocate SW mask.");
+                }
+                uploaderRaw->signalAndFreeData();
+            };
+            taskGroup->add(std::move(drawAndUploadMask));
+            view.asTextureProxy()->texPriv().setDeferredUploader(std::move(uploader));
+        } else {
+            GrSWMaskHelper helper;
+            if (!helper.init(*boundsForMask)) {
+                return false;
+            }
+            helper.drawShape(*args.fShape, *args.fViewMatrix, SkRegion::kReplace_Op, aa, 0xFF);
+            view = helper.toTextureView(args.fContext, fit);
+        }
 
         if (!view) {
             return false;