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