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>
diff --git a/src/gpu/GrSWMaskHelper.cpp b/src/gpu/GrSWMaskHelper.cpp
index d477534..69c254f 100644
--- a/src/gpu/GrSWMaskHelper.cpp
+++ b/src/gpu/GrSWMaskHelper.cpp
@@ -9,8 +9,10 @@
 
 #include "include/gpu/GrRecordingContext.h"
 #include "src/core/SkMatrixProvider.h"
+#include "src/core/SkTaskGroup.h"
 #include "src/gpu/GrBitmapTextureMaker.h"
 #include "src/gpu/GrCaps.h"
+#include "src/gpu/GrDirectContextPriv.h"
 #include "src/gpu/GrProxyProvider.h"
 #include "src/gpu/GrRecordingContextPriv.h"
 #include "src/gpu/GrSurfaceContext.h"
@@ -43,6 +45,96 @@
     return paint;
 }
 
+GrSurfaceProxyView GrSWMaskHelper::MakeTexture(SkIRect bounds,
+                                               GrRecordingContext* context,
+                                               SkBackingFit fit,
+                                               DrawFunc&& draw) {
+    SkTaskGroup* taskGroup = nullptr;
+    if (auto dContext = context->asDirectContext()) {
+        taskGroup = dContext->priv().getTaskGroup();
+    }
+    if (taskGroup) {
+        GrSWMaskHelper* helper = new GrSWMaskHelper(bounds);
+        return helper->threadedExecute(taskGroup, context, fit, std::move(draw));
+    } else {
+        GrSWMaskHelper helper(bounds);
+        return helper.nonThreadedExecute(context, fit, draw);
+    }
+}
+
+GrSurfaceProxyView GrSWMaskHelper::threadedExecute(SkTaskGroup* taskGroup,
+                                                   GrRecordingContext* context,
+                                                   SkBackingFit fit,
+                                                   DrawFunc&& draw) {
+    sk_sp<GrSWMaskHelper> spThis(this);
+    taskGroup->add([spThis, draw{std::move(draw)}]() {
+        if (spThis->allocate()) {
+            draw(spThis.get());
+            spThis->fBitmap.setImmutable();
+        }
+        spThis->fSemaphore.signal();
+    });
+    auto lazy_cb = [spThis{std::move(spThis)}](GrResourceProvider* provider,
+                                               const GrProxyProvider::LazySurfaceDesc& desc) {
+        spThis->fSemaphore.wait();
+        const SkBitmap& mask = spThis->fBitmap;
+        if (!mask.getPixels()) {
+            return GrProxyProvider::LazyCallbackResult();
+        }
+        GrMipLevel mip{mask.getPixels(), mask.pixmap().rowBytes()};
+        GrColorType ct{SkColorTypeToGrColorType(mask.colorType())};
+        sk_sp<GrTexture> tex = provider->createTexture(desc.fDimensions,
+                                                       desc.fFormat,
+                                                       ct,
+                                                       desc.fRenderable,
+                                                       desc.fSampleCnt,
+                                                       desc.fBudgeted,
+                                                       desc.fFit,
+                                                       desc.fProtected,
+                                                       mip);
+        GrProxyProvider::LazyCallbackResult result(std::move(tex));
+        // Callback refs us, we own bitmap, don't release callback.
+        result.fReleaseCallback = false;
+        return result;
+    };
+    const GrCaps* caps = context->priv().caps();
+    GrProxyProvider* proxyProvider = context->priv().proxyProvider();
+
+    GrBackendFormat format = caps->getDefaultBackendFormat(GrColorType::kAlpha_8,
+                                                           GrRenderable::kNo);
+    GrSwizzle swizzle = caps->getReadSwizzle(format, GrColorType::kAlpha_8);
+    sk_sp<GrTextureProxy> p = proxyProvider->createLazyProxy(std::move(lazy_cb),
+                                                             format,
+                                                             fBitmap.dimensions(),
+                                                             GrMipMapped::kNo,
+                                                             GrMipmapStatus::kNotAllocated,
+                                                             GrInternalSurfaceFlags::kNone,
+                                                             fit,
+                                                             SkBudgeted::kYes,
+                                                             GrProtected::kNo,
+                                                             GrProxyProvider::UseAllocator::kYes);
+    return GrSurfaceProxyView(std::move(p), kTopLeft_GrSurfaceOrigin, swizzle);
+}
+
+GrSurfaceProxyView GrSWMaskHelper::nonThreadedExecute(GrRecordingContext* context,
+                                                      SkBackingFit fit,
+                                                      const DrawFunc& draw) {
+    if (!this->allocate()) {
+        return {};
+    }
+    draw(this);
+    fBitmap.setImmutable();
+    GrBitmapTextureMaker maker(context, fBitmap, fit);
+    return maker.view(GrMipmapped::kNo);
+}
+
+GrSWMaskHelper::GrSWMaskHelper(const SkIRect& resultBounds) {
+    // We will need to translate draws so the bound's UL corner is at the origin
+    fTranslate = {-SkIntToScalar(resultBounds.fLeft), -SkIntToScalar(resultBounds.fTop)};
+    SkIRect bounds = SkIRect::MakeWH(resultBounds.width(), resultBounds.height());
+    fBitmap.setInfo(SkImageInfo::MakeA8(bounds.width(), bounds.height()));
+}
+
 /**
  * Draw a single rect element of the clip stack into the accumulation bitmap
  */
@@ -128,33 +220,14 @@
     }
 }
 
-bool GrSWMaskHelper::init(const SkIRect& resultBounds) {
-    // We will need to translate draws so the bound's UL corner is at the origin
-    fTranslate = {-SkIntToScalar(resultBounds.fLeft), -SkIntToScalar(resultBounds.fTop)};
-    SkIRect bounds = SkIRect::MakeWH(resultBounds.width(), resultBounds.height());
-
-    const SkImageInfo bmImageInfo = SkImageInfo::MakeA8(bounds.width(), bounds.height());
-    if (!fPixels->tryAlloc(bmImageInfo)) {
+bool GrSWMaskHelper::allocate() {
+    if (!fBitmap.tryAllocPixels()) {
+        SkDEBUGFAIL("Unable to allocate SW mask.");
         return false;
     }
-    fPixels->erase(0);
 
-    fDraw.fDst      = *fPixels;
-    fRasterClip.setRect(bounds);
+    fDraw.fDst      = fBitmap.pixmap();
+    fRasterClip.setRect(fBitmap.info().bounds());
     fDraw.fRC       = &fRasterClip;
     return true;
 }
-
-GrSurfaceProxyView GrSWMaskHelper::toTextureView(GrRecordingContext* context, SkBackingFit fit) {
-    SkImageInfo ii = SkImageInfo::MakeA8(fPixels->width(), fPixels->height());
-    size_t rowBytes = fPixels->rowBytes();
-
-    SkBitmap bitmap;
-    SkAssertResult(bitmap.installPixels(ii, fPixels->detachPixels(), rowBytes,
-                                        [](void* addr, void* context) { sk_free(addr); },
-                                        nullptr));
-    bitmap.setImmutable();
-
-    GrBitmapTextureMaker maker(context, bitmap, fit);
-    return maker.view(GrMipmapped::kNo);
-}