| Index: src/gpu/GrClipMaskManager.cpp
|
| diff --git a/src/gpu/GrClipMaskManager.cpp b/src/gpu/GrClipMaskManager.cpp
|
| index ff00a94f5aaebee244e3269da47199ff454a05c7..e25f991ab4bc1daeb8bea805ddb41d48cf72df6d 100644
|
| --- a/src/gpu/GrClipMaskManager.cpp
|
| +++ b/src/gpu/GrClipMaskManager.cpp
|
| @@ -50,7 +50,8 @@ static const GrFragmentProcessor* create_fp_for_mask(GrTexture* result, const Sk
|
| // optionally, set 'prOut' to NULL. If not, return false (and, optionally, set
|
| // 'prOut' to the non-SW path renderer that will do the job).
|
| static bool path_needs_SW_renderer(GrContext* context,
|
| - const GrPipelineBuilder& pipelineBuilder,
|
| + bool isStencilDisabled,
|
| + const GrRenderTarget* rt,
|
| const SkMatrix& viewMatrix,
|
| const Element* element,
|
| GrPathRenderer** prOut,
|
| @@ -87,8 +88,10 @@ static bool path_needs_SW_renderer(GrContext* context,
|
| }
|
|
|
| // the 'false' parameter disallows use of the SW path renderer
|
| - GrPathRenderer* pr = context->getPathRenderer(pipelineBuilder, viewMatrix, path,
|
| - stroke, false, type);
|
| + GrPathRenderer* pr = context->getPathRenderer(viewMatrix, path,
|
| + stroke, false, type,
|
| + isStencilDisabled,
|
| + rt->isStencilBufferMultisampled());
|
| if (prOut) {
|
| *prOut = pr;
|
| }
|
| @@ -100,16 +103,15 @@ static bool path_needs_SW_renderer(GrContext* context,
|
| // alpha mask simultaneously. If so and the element is a path a compatible path renderer is
|
| // also returned.
|
| static bool can_stencil_and_draw_element(GrContext* context,
|
| - GrPipelineBuilder* pipelineBuilder,
|
| GrTexture* texture,
|
| const SkMatrix& viewMatrix,
|
| const SkClipStack::Element* element,
|
| GrPathRenderer** pr) {
|
| - pipelineBuilder->setRenderTarget(texture->asRenderTarget());
|
| -
|
| static const bool kNeedsStencil = true;
|
| + static const bool kStencilIsDisabled = true;
|
| return !path_needs_SW_renderer(context,
|
| - *pipelineBuilder,
|
| + kStencilIsDisabled,
|
| + texture->asRenderTarget(),
|
| viewMatrix,
|
| element,
|
| pr,
|
| @@ -129,6 +131,7 @@ GrContext* GrClipMaskManager::getContext() { return fDrawTarget->cmmAccess().con
|
| * entire clip should be rendered in SW and then uploaded en masse to the gpu.
|
| */
|
| bool GrClipMaskManager::useSWOnlyPath(const GrPipelineBuilder& pipelineBuilder,
|
| + const GrRenderTarget* rt,
|
| const SkVector& clipToMaskOffset,
|
| const GrReducedClip::ElementList& elements) {
|
| // TODO: generalize this function so that when
|
| @@ -147,8 +150,8 @@ bool GrClipMaskManager::useSWOnlyPath(const GrPipelineBuilder& pipelineBuilder,
|
| bool needsStencil = invert ||
|
| SkRegion::kIntersect_Op == op || SkRegion::kReverseDifference_Op == op;
|
|
|
| - if (path_needs_SW_renderer(this->getContext(), pipelineBuilder, translate,
|
| - element, nullptr, needsStencil)) {
|
| + if (path_needs_SW_renderer(this->getContext(), pipelineBuilder.getStencil().isDisabled(),
|
| + rt, translate, element, nullptr, needsStencil)) {
|
| return true;
|
| }
|
| }
|
| @@ -358,7 +361,7 @@ bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder,
|
| SkIntToScalar(-clipSpaceIBounds.fTop)
|
| };
|
|
|
| - if (this->useSWOnlyPath(pipelineBuilder, clipToMaskOffset, elements)) {
|
| + if (this->useSWOnlyPath(pipelineBuilder, rt, clipToMaskOffset, elements)) {
|
| // The clip geometry is complex enough that it will be more efficient to create it
|
| // entirely in software
|
| result.reset(this->createSoftwareClipMask(genID,
|
| @@ -424,7 +427,8 @@ bool GrClipMaskManager::drawElement(GrPipelineBuilder* pipelineBuilder,
|
| const SkClipStack::Element* element,
|
| GrPathRenderer* pr) {
|
|
|
| - pipelineBuilder->setRenderTarget(target->asRenderTarget());
|
| + GrRenderTarget* rt = target->asRenderTarget();
|
| + pipelineBuilder->setRenderTarget(rt);
|
|
|
| // The color we use to draw does not matter since we will always be using a GrCoverageSetOpXP
|
| // which ignores color.
|
| @@ -460,8 +464,10 @@ bool GrClipMaskManager::drawElement(GrPipelineBuilder* pipelineBuilder,
|
| GrPathRendererChain::DrawType type;
|
| type = element->isAA() ? GrPathRendererChain::kColorAntiAlias_DrawType :
|
| GrPathRendererChain::kColor_DrawType;
|
| - pr = this->getContext()->getPathRenderer(*pipelineBuilder, viewMatrix,
|
| - path, stroke, false, type);
|
| + pr = this->getContext()->getPathRenderer(viewMatrix,
|
| + path, stroke, false, type,
|
| + pipelineBuilder->getStencil().isDisabled(),
|
| + rt->isStencilBufferMultisampled());
|
| }
|
| if (nullptr == pr) {
|
| return false;
|
| @@ -606,8 +612,11 @@ GrTexture* GrClipMaskManager::createAlphaClipMask(int32_t elementsGenID,
|
| GrPipelineBuilder pipelineBuilder;
|
|
|
| pipelineBuilder.setClip(clip);
|
| + pipelineBuilder.setRenderTarget(texture->asRenderTarget());
|
| +
|
| + SkASSERT(pipelineBuilder.getStencil().isDisabled());
|
| GrPathRenderer* pr = nullptr;
|
| - bool useTemp = !can_stencil_and_draw_element(this->getContext(), &pipelineBuilder,
|
| + bool useTemp = !can_stencil_and_draw_element(this->getContext(),
|
| texture, translate, element, &pr);
|
|
|
| // useSWOnlyPath should now filter out all cases where gpu-side mask merging is
|
| @@ -786,12 +795,16 @@ bool GrClipMaskManager::createStencilClipMask(GrRenderTarget* rt,
|
| if (fillInverted) {
|
| clipPath.toggleInverseFillType();
|
| }
|
| - pr = this->getContext()->getPathRenderer(pipelineBuilder,
|
| - viewMatrix,
|
| +
|
| + SkASSERT(pipelineBuilder.getStencil().isDisabled());
|
| +
|
| + pr = this->getContext()->getPathRenderer(viewMatrix,
|
| clipPath,
|
| stroke,
|
| false,
|
| GrPathRendererChain::kStencilOnly_DrawType,
|
| + true,
|
| + rt->isStencilBufferMultisampled(),
|
| &stencilSupport);
|
| if (nullptr == pr) {
|
| return false;
|
|
|