aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/gpu/GrClipMaskManager.cpp102
-rw-r--r--src/gpu/GrClipMaskManager.h24
2 files changed, 54 insertions, 72 deletions
diff --git a/src/gpu/GrClipMaskManager.cpp b/src/gpu/GrClipMaskManager.cpp
index 0d2d5b073e..4aaf57add6 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;
}
diff --git a/src/gpu/GrClipMaskManager.h b/src/gpu/GrClipMaskManager.h
index ef5fbc14d0..8ecba09fba 100644
--- a/src/gpu/GrClipMaskManager.h
+++ b/src/gpu/GrClipMaskManager.h
@@ -85,20 +85,20 @@ private:
// Creates an alpha mask of the clip. The mask is a rasterization of elements through the
// rect specified by clipSpaceIBounds.
- static GrTexture* CreateAlphaClipMask(GrContext*,
- int32_t elementsGenID,
- GrReducedClip::InitialState initialState,
- const GrReducedClip::ElementList& elements,
- const SkVector& clipToMaskOffset,
- const SkIRect& clipSpaceIBounds);
+ static sk_sp<GrTexture> CreateAlphaClipMask(GrContext*,
+ int32_t elementsGenID,
+ GrReducedClip::InitialState initialState,
+ const GrReducedClip::ElementList& elements,
+ const SkVector& clipToMaskOffset,
+ const SkIRect& clipSpaceIBounds);
// Similar to createAlphaClipMask but it rasterizes in SW and uploads to the result texture.
- static GrTexture* CreateSoftwareClipMask(GrContext*,
- int32_t elementsGenID,
- GrReducedClip::InitialState initialState,
- const GrReducedClip::ElementList& elements,
- const SkVector& clipToMaskOffset,
- const SkIRect& clipSpaceIBounds);
+ static sk_sp<GrTexture> CreateSoftwareClipMask(GrContext*,
+ int32_t elementsGenID,
+ GrReducedClip::InitialState initialState,
+ const GrReducedClip::ElementList& elements,
+ const SkVector& clipToMaskOffset,
+ const SkIRect& clipSpaceIBounds);
static bool UseSWOnlyPath(GrContext*,
const GrPipelineBuilder&,