| Index: src/gpu/GrClipMaskManager.cpp
|
| diff --git a/src/gpu/GrClipMaskManager.cpp b/src/gpu/GrClipMaskManager.cpp
|
| index 3e802d71356ec5e5957828159c9c0a0cdca198d1..f45533f9807f88318e5dd3392f94b11ce1b66b4c 100644
|
| --- a/src/gpu/GrClipMaskManager.cpp
|
| +++ b/src/gpu/GrClipMaskManager.cpp
|
| @@ -30,7 +30,8 @@ typedef SkClipStack::Element Element;
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // set up the draw state to enable the aa clipping mask. Besides setting up the
|
| // stage matrix this also alters the vertex layout
|
| -static const GrFragmentProcessor* create_fp_for_mask(GrTexture* result, const SkIRect &devBound) {
|
| +static const GrFragmentProcessor* create_fp_for_mask(GrTexture* result, const SkIRect &devBound, GrRenderTarget* dst) {
|
| +
|
| SkMatrix mat;
|
| // We use device coords to compute the texture coordinates. We set our matrix to be a
|
| // translation to the devBound, and then a scaling matrix to normalized coords.
|
| @@ -44,7 +45,7 @@ static const GrFragmentProcessor* create_fp_for_mask(GrTexture* result, const Sk
|
| GrTextureDomain::MakeTexelDomain(result, domainTexels),
|
| GrTextureDomain::kDecal_Mode,
|
| GrTextureParams::kNone_FilterMode,
|
| - kDevice_GrCoordSet);
|
| + kDevice_GrCoordSet, dst);
|
| }
|
|
|
| // Does the path in 'element' require SW rendering? If so, return true (and,
|
| @@ -278,7 +279,8 @@ bool GrClipMaskManager::getAnalyticClipProcessor(const GrReducedClip::ElementLis
|
| bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder,
|
| GrPipelineBuilder::AutoRestoreStencil* ars,
|
| const SkRect* devBounds,
|
| - GrAppliedClip* out) {
|
| + GrAppliedClip* out,
|
| + GrRenderTarget* dst) {
|
| if (kRespectClip_StencilClipMode == fClipMode) {
|
| fClipMode = kIgnoreClip_StencilClipMode;
|
| }
|
| @@ -370,6 +372,7 @@ bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder,
|
|
|
| // If MSAA is enabled we can do everything in the stencil buffer.
|
| if (0 == rt->numStencilSamples() && requiresAA) {
|
| + SkAutoTUnref<GrDrawContext> dc;
|
| SkAutoTUnref<GrTexture> result;
|
|
|
| // The top-left of the mask corresponds to the top-left corner of the bounds.
|
| @@ -391,7 +394,7 @@ bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder,
|
| initialState,
|
| elements,
|
| clipToMaskOffset,
|
| - clipSpaceIBounds));
|
| + clipSpaceIBounds, &dc));
|
| // If createAlphaClipMask fails it means useSWOnlyPath has a bug
|
| SkASSERT(result);
|
| }
|
| @@ -401,7 +404,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, rtSpaceMaskBounds, dst));
|
| this->setPipelineBuilderStencil(pipelineBuilder, ars);
|
| return true;
|
| }
|
| @@ -451,12 +454,16 @@ bool GrClipMaskManager::drawElement(GrPipelineBuilder* pipelineBuilder,
|
| // which ignores color.
|
| GrColor color = GrColor_WHITE;
|
|
|
| + GrPaint paint;
|
| + paint.setAntiAlias(element->isAA());
|
| + GrClip clip;
|
| +
|
| // TODO: Draw rrects directly here.
|
| switch (element->getType()) {
|
| case Element::kEmpty_Type:
|
| SkDEBUGFAIL("Should never get here with an empty element.");
|
| break;
|
| - case Element::kRect_Type:
|
| + case Element::kRect_Type: {
|
| // TODO: Do rects directly to the accumulator using a aa-rect GrProcessor that covers
|
| // the entire mask bounds and writes 0 outside the rect.
|
| if (element->isAA()) {
|
| @@ -470,6 +477,7 @@ bool GrClipMaskManager::drawElement(GrPipelineBuilder* pipelineBuilder,
|
| element->getRect());
|
| }
|
| return true;
|
| + }
|
| default: {
|
| SkPath path;
|
| element->asPath(&path);
|
| @@ -477,6 +485,7 @@ bool GrClipMaskManager::drawElement(GrPipelineBuilder* pipelineBuilder,
|
| path.toggleInverseFillType();
|
| }
|
| GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle);
|
| +
|
| if (nullptr == pr) {
|
| GrPathRendererChain::DrawType type;
|
| type = element->isAA() ? GrPathRendererChain::kColorAntiAlias_DrawType :
|
| @@ -547,7 +556,8 @@ GrTexture* GrClipMaskManager::createAlphaClipMask(int32_t elementsGenID,
|
| GrReducedClip::InitialState initialState,
|
| const GrReducedClip::ElementList& elements,
|
| const SkVector& clipToMaskOffset,
|
| - const SkIRect& clipSpaceIBounds) {
|
| + const SkIRect& clipSpaceIBounds,
|
| + SkAutoTUnref<GrDrawContext>* destDC) {
|
| GrResourceProvider* resourceProvider = this->resourceProvider();
|
| GrUniqueKey key;
|
| GetClipMaskKey(elementsGenID, clipSpaceIBounds, &key);
|
| @@ -562,6 +572,12 @@ GrTexture* GrClipMaskManager::createAlphaClipMask(int32_t elementsGenID,
|
| return nullptr;
|
| }
|
|
|
| + destDC->reset(this->getContext()->drawContext(texture->asRenderTarget()));
|
| + if (!*destDC) {
|
| + texture->unref();
|
| + return NULL;
|
| + }
|
| +
|
| // Set the matrix so that rendered clip elements are transformed to mask space from clip
|
| // space.
|
| const SkMatrix translate = SkMatrix::MakeTrans(clipToMaskOffset.fX, clipToMaskOffset.fY);
|
| @@ -572,10 +588,16 @@ GrTexture* GrClipMaskManager::createAlphaClipMask(int32_t elementsGenID,
|
|
|
| // The scratch texture that we are drawing into can be substantially larger than the mask. Only
|
| // clear the part that we care about.
|
| +#if 1
|
| + (*destDC)->clear(&maskSpaceIBounds,
|
| + GrReducedClip::kAllIn_InitialState == initialState ? 0xffffffff : 0x00000000,
|
| + true);
|
| +#else
|
| fDrawTarget->clear(&maskSpaceIBounds,
|
| GrReducedClip::kAllIn_InitialState == initialState ? 0xffffffff : 0x00000000,
|
| true,
|
| texture->asRenderTarget());
|
| +#endif
|
|
|
| // When we use the stencil in the below loop it is important to have this clip installed.
|
| // The second pass that zeros the stencil buffer renders the rect maskSpaceIBounds so the first
|
| @@ -589,7 +611,6 @@ GrTexture* GrClipMaskManager::createAlphaClipMask(int32_t elementsGenID,
|
| SkRegion::Op op = element->getOp();
|
| bool invert = element->isInverseFilled();
|
| if (invert || SkRegion::kIntersect_Op == op || SkRegion::kReverseDifference_Op == op) {
|
| -
|
| GrPathRenderer* pr = GetPathRenderer(this->getContext(),
|
| texture, translate, element);
|
| if (Element::kRect_Type != element->getType() && !pr) {
|
| @@ -640,9 +661,15 @@ GrTexture* GrClipMaskManager::createAlphaClipMask(int32_t elementsGenID,
|
| 0xffff);
|
| backgroundPipelineBuilder.setStencil(kDrawOutsideElement);
|
|
|
| +#if 0
|
| // The color passed in here does not matter since the coverageSetOpXP won't read it.
|
| fDrawTarget->drawNonAARect(backgroundPipelineBuilder, GrColor_WHITE, translate,
|
| clipSpaceIBounds);
|
| +#else
|
| + GrClip clip;
|
| + GrPaint paint;
|
| + (*destDC)->drawRect(clip, paint, SkMatrix::I(), SkRect::Make(clipSpaceIBounds), NULL);
|
| +#endif
|
| }
|
| } else {
|
| GrPipelineBuilder pipelineBuilder;
|
| @@ -654,6 +681,9 @@ GrTexture* GrClipMaskManager::createAlphaClipMask(int32_t elementsGenID,
|
| }
|
| }
|
|
|
| + // This was written to but will have a unique key
|
| + texture->fException2 = true;
|
| +
|
| return texture.detach();
|
| }
|
|
|
|
|