Index: src/gpu/GrClipMaskManager.cpp |
diff --git a/src/gpu/GrClipMaskManager.cpp b/src/gpu/GrClipMaskManager.cpp |
index 0d2d5b073e7c1cbdd2f2e56019b216c625883e19..4aaf57add6c545054dc2c321613e0f625e6453e4 100644 |
--- a/src/gpu/GrClipMaskManager.cpp |
+++ b/src/gpu/GrClipMaskManager.cpp |
@@ -370,7 +370,7 @@ bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder, |
// If the stencil buffer is multisampled we can use it to do everything. |
if (!rt->isStencilBufferMultisampled() && requiresAA) { |
- SkAutoTUnref<GrTexture> result; |
+ sk_sp<GrTexture> result; |
// The top-left of the mask corresponds to the top-left corner of the bounds. |
SkVector clipToMaskOffset = { |
@@ -381,19 +381,19 @@ bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder, |
if (UseSWOnlyPath(this->getContext(), pipelineBuilder, rt, clipToMaskOffset, elements)) { |
// The clip geometry is complex enough that it will be more efficient to create it |
// entirely in software |
- result.reset(CreateSoftwareClipMask(this->getContext(), |
- genID, |
- initialState, |
- elements, |
- clipToMaskOffset, |
- clipSpaceIBounds)); |
+ result = CreateSoftwareClipMask(this->getContext(), |
+ genID, |
+ initialState, |
+ elements, |
+ clipToMaskOffset, |
+ clipSpaceIBounds); |
} else { |
- result.reset(CreateAlphaClipMask(this->getContext(), |
- genID, |
- initialState, |
- elements, |
- clipToMaskOffset, |
- clipSpaceIBounds)); |
+ result = CreateAlphaClipMask(this->getContext(), |
+ genID, |
+ initialState, |
+ elements, |
+ clipToMaskOffset, |
+ clipSpaceIBounds); |
// If createAlphaClipMask fails it means UseSWOnlyPath has a bug |
SkASSERT(result); |
} |
@@ -403,7 +403,7 @@ bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder, |
// clipSpace bounds. We determine the mask's position WRT to the render target here. |
SkIRect rtSpaceMaskBounds = clipSpaceIBounds; |
rtSpaceMaskBounds.offset(-clip.origin()); |
- out->fClipCoverageFP.reset(create_fp_for_mask(result, rtSpaceMaskBounds)); |
+ out->fClipCoverageFP.reset(create_fp_for_mask(result.get(), rtSpaceMaskBounds)); |
return true; |
} |
// if alpha clip mask creation fails fall through to the non-AA code paths |
@@ -502,42 +502,33 @@ static void GetClipMaskKey(int32_t clipGenID, const SkIRect& bounds, GrUniqueKey |
builder[2] = SkToU16(bounds.fTop) | (SkToU16(bounds.fBottom) << 16); |
} |
-GrTexture* GrClipMaskManager::CreateAlphaClipMask(GrContext* context, |
- int32_t elementsGenID, |
- GrReducedClip::InitialState initialState, |
- const GrReducedClip::ElementList& elements, |
- const SkVector& clipToMaskOffset, |
- const SkIRect& clipSpaceIBounds) { |
+sk_sp<GrTexture> GrClipMaskManager::CreateAlphaClipMask(GrContext* context, |
+ int32_t elementsGenID, |
+ GrReducedClip::InitialState initialState, |
+ const GrReducedClip::ElementList& elements, |
+ const SkVector& clipToMaskOffset, |
+ const SkIRect& clipSpaceIBounds) { |
GrResourceProvider* resourceProvider = context->resourceProvider(); |
GrUniqueKey key; |
GetClipMaskKey(elementsGenID, clipSpaceIBounds, &key); |
if (GrTexture* texture = resourceProvider->findAndRefTextureByUniqueKey(key)) { |
- return texture; |
+ return sk_sp<GrTexture>(texture); |
} |
// There's no texture in the cache. Let's try to allocate it then. |
- GrSurfaceDesc desc; |
- desc.fWidth = clipSpaceIBounds.width(); |
- desc.fHeight = clipSpaceIBounds.height(); |
- desc.fFlags = kRenderTarget_GrSurfaceFlag; |
+ GrPixelConfig config = kRGBA_8888_GrPixelConfig; |
if (context->caps()->isConfigRenderable(kAlpha_8_GrPixelConfig, false)) { |
- desc.fConfig = kAlpha_8_GrPixelConfig; |
- } else { |
- desc.fConfig = kRGBA_8888_GrPixelConfig; |
- } |
- |
- SkAutoTUnref<GrTexture> texture(resourceProvider->createApproxTexture(desc, 0)); |
- if (!texture) { |
- return nullptr; |
+ config = kAlpha_8_GrPixelConfig; |
} |
- texture->resourcePriv().setUniqueKey(key); |
- |
- sk_sp<GrDrawContext> dc(context->drawContext(sk_ref_sp(texture->asRenderTarget()))); |
+ sk_sp<GrDrawContext> dc(context->newDrawContext(SkBackingFit::kApprox, |
+ clipSpaceIBounds.width(), |
+ clipSpaceIBounds.height(), |
+ config)); |
if (!dc) { |
return nullptr; |
} |
- |
+ |
// The texture may be larger than necessary, this rect represents the part of the texture |
// we populate with a rasterization of the clip. |
SkIRect maskSpaceIBounds = SkIRect::MakeWH(clipSpaceIBounds.width(), clipSpaceIBounds.height()); |
@@ -563,17 +554,6 @@ GrTexture* GrClipMaskManager::CreateAlphaClipMask(GrContext* context, |
SkRegion::Op op = element->getOp(); |
bool invert = element->isInverseFilled(); |
if (invert || SkRegion::kIntersect_Op == op || SkRegion::kReverseDifference_Op == op) { |
-#ifdef SK_DEBUG |
- GrPathRenderer* pr = GetPathRenderer(context, |
- texture, translate, element); |
- if (Element::kRect_Type != element->getType() && !pr) { |
- // UseSWOnlyPath should now filter out all cases where gpu-side mask merging would |
- // be performed (i.e., pr would be NULL for a non-rect path). |
- // See https://bug.skia.org/4519 for rationale and details. |
- SkASSERT(0); |
- } |
-#endif |
- |
GrFixedClip clip(maskSpaceIBounds); |
// draw directly into the result with the stencil set to make the pixels affected |
@@ -589,7 +569,6 @@ GrTexture* GrClipMaskManager::CreateAlphaClipMask(GrContext* context, |
); |
if (!stencil_element(dc.get(), clip, &kStencilInElement, |
translate, element)) { |
- texture->resourcePriv().removeUniqueKey(); |
return nullptr; |
} |
@@ -607,7 +586,6 @@ GrTexture* GrClipMaskManager::CreateAlphaClipMask(GrContext* context, |
op, !invert, false, |
translate, |
SkRect::Make(clipSpaceIBounds))) { |
- texture->resourcePriv().removeUniqueKey(); |
return nullptr; |
} |
} else { |
@@ -620,7 +598,10 @@ GrTexture* GrClipMaskManager::CreateAlphaClipMask(GrContext* context, |
} |
} |
- return texture.release(); |
+ sk_sp<GrTexture> texture(dc->asTexture()); |
+ SkASSERT(texture); |
+ texture->resourcePriv().setUniqueKey(key); |
+ return texture; |
} |
//////////////////////////////////////////////////////////////////////////////// |
@@ -807,17 +788,18 @@ bool GrClipMaskManager::createStencilClipMask(GrRenderTarget* rt, |
} |
//////////////////////////////////////////////////////////////////////////////// |
-GrTexture* GrClipMaskManager::CreateSoftwareClipMask(GrContext* context, |
- int32_t elementsGenID, |
- GrReducedClip::InitialState initialState, |
- const GrReducedClip::ElementList& elements, |
- const SkVector& clipToMaskOffset, |
- const SkIRect& clipSpaceIBounds) { |
+sk_sp<GrTexture> GrClipMaskManager::CreateSoftwareClipMask( |
+ GrContext* context, |
+ int32_t elementsGenID, |
+ GrReducedClip::InitialState initialState, |
+ const GrReducedClip::ElementList& elements, |
+ const SkVector& clipToMaskOffset, |
+ const SkIRect& clipSpaceIBounds) { |
GrUniqueKey key; |
GetClipMaskKey(elementsGenID, clipSpaceIBounds, &key); |
GrResourceProvider* resourceProvider = context->resourceProvider(); |
if (GrTexture* texture = resourceProvider->findAndRefTextureByUniqueKey(key)) { |
- return texture; |
+ return sk_sp<GrTexture>(texture); |
} |
// The mask texture may be larger than necessary. We round out the clip space bounds and pin |
@@ -873,13 +855,13 @@ GrTexture* GrClipMaskManager::CreateSoftwareClipMask(GrContext* context, |
desc.fHeight = clipSpaceIBounds.height(); |
desc.fConfig = kAlpha_8_GrPixelConfig; |
- GrTexture* result = context->resourceProvider()->createApproxTexture(desc, 0); |
+ sk_sp<GrTexture> result(context->resourceProvider()->createApproxTexture(desc, 0)); |
if (!result) { |
return nullptr; |
} |
result->resourcePriv().setUniqueKey(key); |
- helper.toTexture(result); |
+ helper.toTexture(result.get()); |
return result; |
} |