| Index: src/gpu/GrClipStackClip.cpp
|
| diff --git a/src/gpu/GrClipStackClip.cpp b/src/gpu/GrClipStackClip.cpp
|
| index 4572db5f321303312244b4ef3ec1f85a931cb3cb..d6ad1d90f856c24ce79e7ac01db5a882428b2e77 100644
|
| --- a/src/gpu/GrClipStackClip.cpp
|
| +++ b/src/gpu/GrClipStackClip.cpp
|
| @@ -287,11 +287,14 @@ bool GrClipStackClip::apply(GrContext* context, GrDrawContext* drawContext, bool
|
| return false;
|
| }
|
|
|
| + GrRenderTarget* rt = drawContext->accessRenderTarget();
|
| +
|
| const SkScalar clipX = SkIntToScalar(fOrigin.x()),
|
| clipY = SkIntToScalar(fOrigin.y());
|
|
|
| SkRect clipSpaceDevBounds = devBounds.makeOffset(clipX, clipY);
|
| - const GrReducedClip reducedClip(*fStack, clipSpaceDevBounds);
|
| + const GrReducedClip reducedClip(*fStack, clipSpaceDevBounds,
|
| + rt->renderTargetPriv().maxWindowRectangles());
|
|
|
| if (reducedClip.hasIBounds() &&
|
| !GrClip::IsInsideClip(reducedClip.ibounds(), clipSpaceDevBounds)) {
|
| @@ -300,29 +303,17 @@ bool GrClipStackClip::apply(GrContext* context, GrDrawContext* drawContext, bool
|
| out->addScissor(scissorSpaceIBounds);
|
| }
|
|
|
| + if (!reducedClip.windowRectangles().empty()) {
|
| + out->addWindowRectangles(reducedClip.windowRectangles(), fOrigin,
|
| + GrWindowRectsState::Mode::kExclusive);
|
| + }
|
| +
|
| if (reducedClip.elements().isEmpty()) {
|
| return InitialState::kAllIn == reducedClip.initialState();
|
| }
|
|
|
| SkASSERT(reducedClip.hasIBounds());
|
|
|
| - // Attempt to implement difference clip rects with window rectangles. This will eventually
|
| - // become more comprehensive.
|
| - if (drawContext->accessRenderTarget()->renderTargetPriv().supportsWindowRectangles() &&
|
| - 1 == reducedClip.elements().count() && !reducedClip.requiresAA() &&
|
| - InitialState::kAllIn == reducedClip.initialState()) {
|
| - const Element* element = reducedClip.elements().head();
|
| - SkRegion::Op op = element->getOp();
|
| - if (Element::kRect_Type == element->getType() &&
|
| - (SkRegion::kDifference_Op == op || SkRegion::kXOR_Op == op)) {
|
| - SkIRect window;
|
| - element->getRect().round(&window);
|
| - window.offset(-fOrigin);
|
| - out->addWindowRectangle(window);
|
| - return true;
|
| - }
|
| - }
|
| -
|
| // An element count of 4 was chosen because of the common pattern in Blink of:
|
| // isect RR
|
| // diff RR
|
| @@ -377,12 +368,15 @@ bool GrClipStackClip::apply(GrContext* context, GrDrawContext* drawContext, bool
|
| // use the stencil clip if we can't represent the clip as a rectangle.
|
| // TODO: these need to be swapped over to using a StencilAttachmentProxy
|
| GrStencilAttachment* stencilAttachment =
|
| - context->resourceProvider()->attachStencilAttachment(drawContext->accessRenderTarget());
|
| + context->resourceProvider()->attachStencilAttachment(rt);
|
| if (nullptr == stencilAttachment) {
|
| SkDebugf("WARNING: failed to attach stencil buffer for clip mask. Clip will be ignored.\n");
|
| return true;
|
| }
|
|
|
| + // This relies on the property that a reduced sub-rect of the last clip will contain all the
|
| + // relevant window rectangles that were in the last clip. This subtle requirement will go away
|
| + // after clipping is overhauled.
|
| if (stencilAttachment->mustRenderClip(reducedClip.elementsGenID(), reducedClip.ibounds(),
|
| fOrigin)) {
|
| reducedClip.drawStencilClipMask(context, drawContext, fOrigin);
|
|
|