| Index: src/gpu/batches/GrStencilAndCoverPathRenderer.cpp
|
| diff --git a/src/gpu/batches/GrStencilAndCoverPathRenderer.cpp b/src/gpu/batches/GrStencilAndCoverPathRenderer.cpp
|
| index ddba1c871eb1903f4ba2d01e968345d55a6976cc..1309dedd4c3c073ed60b5bd51ad964d3fb2be81d 100644
|
| --- a/src/gpu/batches/GrStencilAndCoverPathRenderer.cpp
|
| +++ b/src/gpu/batches/GrStencilAndCoverPathRenderer.cpp
|
| @@ -36,7 +36,7 @@ bool GrStencilAndCoverPathRenderer::onCanDrawPath(const CanDrawPathArgs& args) c
|
| if (args.fStyle->hasNonDashPathEffect() || args.fStyle->strokeRec().isHairlineStyle()) {
|
| return false;
|
| }
|
| - if (!args.fIsStencilDisabled) {
|
| + if (args.fHasUserStencilSettings) {
|
| return false;
|
| }
|
| if (args.fAntiAlias) {
|
| @@ -80,7 +80,7 @@ bool GrStencilAndCoverPathRenderer::onDrawPath(const DrawPathArgs& args) {
|
| GrPipelineBuilder* pipelineBuilder = args.fPipelineBuilder;
|
| const SkMatrix& viewMatrix = *args.fViewMatrix;
|
|
|
| - SkASSERT(pipelineBuilder->getStencil().isDisabled());
|
| + SkASSERT(!pipelineBuilder->hasUserStencilSettings());
|
|
|
| if (args.fAntiAlias) {
|
| SkASSERT(pipelineBuilder->getRenderTarget()->isStencilBufferMultisampled());
|
| @@ -90,18 +90,21 @@ bool GrStencilAndCoverPathRenderer::onDrawPath(const DrawPathArgs& args) {
|
| SkAutoTUnref<GrPath> p(get_gr_path(fResourceProvider, path, *args.fStyle));
|
|
|
| if (path.isInverseFillType()) {
|
| - static constexpr GrStencilSettings kInvertedStencilPass(
|
| - kKeep_StencilOp,
|
| - kZero_StencilOp,
|
| - // We know our rect will hit pixels outside the clip and the user bits will be 0
|
| - // outside the clip. So we can't just fill where the user bits are 0. We also need to
|
| - // check that the clip bit is set.
|
| - kEqualIfInClip_StencilFunc,
|
| - 0xffff,
|
| - 0x0000,
|
| - 0xffff);
|
| -
|
| - pipelineBuilder->setStencil(kInvertedStencilPass);
|
| + static constexpr GrUserStencilSettings kInvertedCoverPass(
|
| + GrUserStencilSettings::StaticInit<
|
| + 0x0000,
|
| + // We know our rect will hit pixels outside the clip and the user bits will be 0
|
| + // outside the clip. So we can't just fill where the user bits are 0. We also need
|
| + // to check that the clip bit is set.
|
| + GrUserStencilTest::kEqualIfInClip,
|
| + 0xffff,
|
| + GrUserStencilOp::kKeep,
|
| + GrUserStencilOp::kZero,
|
| + 0xffff>()
|
| + );
|
| +
|
| +
|
| + pipelineBuilder->setUserStencil(&kInvertedCoverPass);
|
|
|
| // fake inverse with a stencil and cover
|
| args.fTarget->stencilPath(*pipelineBuilder, viewMatrix, p, p->getFillType());
|
| @@ -133,20 +136,22 @@ bool GrStencilAndCoverPathRenderer::onDrawPath(const DrawPathArgs& args) {
|
| &invert));
|
| args.fTarget->drawBatch(*pipelineBuilder, batch);
|
| } else {
|
| - static constexpr GrStencilSettings kStencilPass(
|
| - kZero_StencilOp,
|
| - kKeep_StencilOp,
|
| - kNotEqual_StencilFunc,
|
| - 0xffff,
|
| - 0x0000,
|
| - 0xffff);
|
| -
|
| - pipelineBuilder->setStencil(kStencilPass);
|
| + static constexpr GrUserStencilSettings kCoverPass(
|
| + GrUserStencilSettings::StaticInit<
|
| + 0x0000,
|
| + GrUserStencilTest::kNotEqual,
|
| + 0xffff,
|
| + GrUserStencilOp::kZero,
|
| + GrUserStencilOp::kKeep,
|
| + 0xffff>()
|
| + );
|
| +
|
| + pipelineBuilder->setUserStencil(&kCoverPass);
|
| SkAutoTUnref<GrDrawPathBatchBase> batch(
|
| GrDrawPathBatch::Create(viewMatrix, args.fColor, p->getFillType(), p));
|
| args.fTarget->drawPathBatch(*pipelineBuilder, batch);
|
| }
|
|
|
| - pipelineBuilder->stencil()->setDisabled();
|
| + pipelineBuilder->disableUserStencil();
|
| return true;
|
| }
|
|
|