Use views throughout gpu blur code.
Bug: skia:9556
Change-Id: I3988c8112d72d5453cf93e58542eb68b16e67e1c
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/267452
Commit-Queue: Greg Daniel <egdaniel@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/src/gpu/GrBlurUtils.cpp b/src/gpu/GrBlurUtils.cpp
index c28cccf..2bb1edf 100644
--- a/src/gpu/GrBlurUtils.cpp
+++ b/src/gpu/GrBlurUtils.cpp
@@ -39,7 +39,7 @@
const SkMatrix& viewMatrix,
const SkIRect& maskRect,
GrPaint&& paint,
- sk_sp<GrTextureProxy> mask) {
+ GrSurfaceProxyView mask) {
SkMatrix inverse;
if (!viewMatrix.invert(&inverse)) {
return false;
@@ -49,7 +49,7 @@
-SkIntToScalar(maskRect.fTop));
matrix.preConcat(viewMatrix);
paint.addCoverageFragmentProcessor(
- GrTextureEffect::Make(std::move(mask), kUnknown_SkAlphaType, matrix));
+ GrTextureEffect::Make(mask.detachProxy(), kUnknown_SkAlphaType, matrix));
renderTargetContext->fillRectWithLocalMatrix(clip, std::move(paint), GrAA::kNo, SkMatrix::I(),
SkRect::Make(maskRect), inverse);
@@ -74,7 +74,7 @@
auto proxyProvider = context->priv().proxyProvider();
- sk_sp<GrTextureProxy> filteredMask;
+ GrSurfaceProxyView filteredMaskView;
SkStrokeRec::InitStyle fillOrHairline = shape.style().isSimpleHairline()
? SkStrokeRec::kHairline_InitStyle
@@ -82,12 +82,18 @@
if (key.isValid()) {
// TODO: this cache look up is duplicated in draw_shape_with_mask_filter for gpu
- filteredMask = proxyProvider->findOrCreateProxyByUniqueKey(key, GrColorType::kAlpha_8,
- kTopLeft_GrSurfaceOrigin);
+ static const GrSurfaceOrigin kCacheOrigin = kTopLeft_GrSurfaceOrigin;
+ auto filteredMask = proxyProvider->findOrCreateProxyByUniqueKey(key, GrColorType::kAlpha_8,
+ kCacheOrigin);
+ if (filteredMask) {
+ GrSwizzle swizzle = context->priv().caps()->getReadSwizzle(
+ filteredMask->backendFormat(), GrColorType::kAlpha_8);
+ filteredMaskView = GrSurfaceProxyView(std::move(filteredMask), kCacheOrigin, swizzle);
+ }
}
SkIRect drawRect;
- if (filteredMask) {
+ if (filteredMaskView.proxy()) {
SkRect devBounds = shape.bounds();
viewMatrix.mapRect(&devBounds);
@@ -148,11 +154,12 @@
GrBitmapTextureMaker maker(context, bm, GrBitmapTextureMaker::Cached::kNo,
SkBackingFit::kApprox);
- std::tie(filteredMask, std::ignore) = maker.refTextureProxy(GrMipMapped::kNo);
+ auto [filteredMask, grCT] = maker.refTextureProxy(GrMipMapped::kNo);
if (!filteredMask) {
return false;
}
+ // TODO: refTextureProxy should return a view instead of a proxy
SkASSERT(kTopLeft_GrSurfaceOrigin == filteredMask->origin());
drawRect = dstM.fBounds;
@@ -160,10 +167,14 @@
if (key.isValid()) {
proxyProvider->assignUniqueKeyToProxy(key, filteredMask.get());
}
+ GrSwizzle swizzle = context->priv().caps()->getReadSwizzle(filteredMask->backendFormat(),
+ grCT);
+ filteredMaskView = GrSurfaceProxyView(std::move(filteredMask), kTopLeft_GrSurfaceOrigin,
+ swizzle);
}
return draw_mask(renderTargetContext, clipData, viewMatrix, drawRect, std::move(paint),
- std::move(filteredMask));
+ std::move(filteredMaskView));
}
// Create a mask of 'shape' and return the resulting renderTargetContext
@@ -389,41 +400,48 @@
return;
}
- sk_sp<GrTextureProxy> filteredMask;
+ GrSurfaceProxyView filteredMaskView;
GrProxyProvider* proxyProvider = context->priv().proxyProvider();
if (maskKey.isValid()) {
// TODO: this cache look up is duplicated in sw_draw_with_mask_filter for raster
- filteredMask = proxyProvider->findOrCreateProxyByUniqueKey(
- maskKey, GrColorType::kAlpha_8, kTopLeft_GrSurfaceOrigin);
+ static const GrSurfaceOrigin kCacheOrigin = kTopLeft_GrSurfaceOrigin;
+ auto filteredMask = proxyProvider->findOrCreateProxyByUniqueKey(
+ maskKey, GrColorType::kAlpha_8, kCacheOrigin);
+ if (filteredMask) {
+ GrSwizzle swizzle = context->priv().caps()->getReadSwizzle(
+ filteredMask->backendFormat(), GrColorType::kAlpha_8);
+ filteredMaskView = GrSurfaceProxyView(std::move(filteredMask), kCacheOrigin,
+ swizzle);
+ }
}
- if (!filteredMask) {
+ if (!filteredMaskView.proxy()) {
std::unique_ptr<GrRenderTargetContext> maskRTC(create_mask_GPU(
- context,
- maskRect,
- viewMatrix,
- *shape,
- renderTargetContext->numSamples()));
+ context,
+ maskRect,
+ viewMatrix,
+ *shape,
+ renderTargetContext->numSamples()));
if (maskRTC) {
- filteredMask = maskFilter->filterMaskGPU(context,
- maskRTC->asTextureProxyRef(),
- maskRTC->colorInfo().colorType(),
- maskRTC->colorInfo().alphaType(),
- viewMatrix,
- maskRect);
- SkASSERT(kTopLeft_GrSurfaceOrigin == filteredMask->origin());
-
- if (filteredMask && maskKey.isValid()) {
- proxyProvider->assignUniqueKeyToProxy(maskKey, filteredMask.get());
+ filteredMaskView = maskFilter->filterMaskGPU(context,
+ maskRTC->readSurfaceView(),
+ maskRTC->colorInfo().colorType(),
+ maskRTC->colorInfo().alphaType(),
+ viewMatrix,
+ maskRect);
+ if (filteredMaskView.proxy() && maskKey.isValid()) {
+ SkASSERT(filteredMaskView.asTextureProxy());
+ proxyProvider->assignUniqueKeyToProxy(maskKey,
+ filteredMaskView.asTextureProxy());
}
}
}
- if (filteredMask) {
+ if (filteredMaskView.proxy()) {
if (draw_mask(renderTargetContext, clip, viewMatrix, maskRect, std::move(paint),
- std::move(filteredMask))) {
+ std::move(filteredMaskView))) {
// This path is completely drawn
return;
}