Chromium Code Reviews| Index: src/gpu/GrDrawTarget.cpp |
| diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp |
| index 0f180dc861b92ced07c2ddc9548564894f7642b0..354f77179d4e789800d883d25992f0b7dfc975b7 100644 |
| --- a/src/gpu/GrDrawTarget.cpp |
| +++ b/src/gpu/GrDrawTarget.cpp |
| @@ -16,6 +16,7 @@ |
| #include "GrRenderTarget.h" |
| #include "GrResourceProvider.h" |
| #include "GrRenderTargetPriv.h" |
| +#include "GrStencilAttachment.h" |
| #include "GrSurfacePriv.h" |
| #include "GrTexture.h" |
| #include "gl/GrGLRenderTarget.h" |
| @@ -235,17 +236,16 @@ void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder, |
| GrDrawBatch* batch, |
| const SkIRect* scissorRect) { |
| // Setup clip |
| - GrPipelineBuilder::AutoRestoreStencil ars; |
| GrAppliedClip clip; |
| if (scissorRect) { |
| SkASSERT(GrClip::kWideOpen_ClipType == pipelineBuilder.clip().clipType()); |
| - if (!fClipMaskManager->setupScissorClip(pipelineBuilder, &ars, *scissorRect, |
| + if (!fClipMaskManager->setupScissorClip(pipelineBuilder, *scissorRect, |
| &batch->bounds(), &clip)) { |
| return; |
| } |
| } else { |
| - if (!fClipMaskManager->setupClipping(pipelineBuilder, &ars, &batch->bounds(), &clip)) { |
| + if (!fClipMaskManager->setupClipping(pipelineBuilder, &batch->bounds(), &clip)) { |
| return; |
| } |
| } |
| @@ -257,7 +257,8 @@ void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder, |
| } |
| GrPipeline::CreateArgs args; |
| - if (!this->installPipelineInDrawBatch(&pipelineBuilder, &clip.scissorState(), batch)) { |
| + if (!this->installPipelineInDrawBatch(&pipelineBuilder, &clip.scissorState(), |
| + clip.hasStencilClip(), batch)) { |
| return; |
| } |
| @@ -269,34 +270,35 @@ void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder, |
| this->recordBatch(batch); |
| } |
|
bsalomon
2016/05/10 14:06:21
nit wrap. Should this be static?
Chris Dalton
2016/05/10 16:39:30
Done. (This function will disappear as soon as we
|
| -void GrDrawTarget::getPathStencilSettingsForFilltype(GrPathRendering::FillType fill, |
| - const GrStencilAttachment* sb, |
| - GrStencilSettings* outStencilSettings) { |
| - static constexpr GrStencilSettings kWindingStencilSettings( |
| - kIncClamp_StencilOp, |
| - kIncClamp_StencilOp, |
| - kAlwaysIfInClip_StencilFunc, |
| - 0xFFFF, 0xFFFF, 0xFFFF |
| +inline const GrUserStencilSettings& get_path_stencil_settings_for_fill(GrPathRendering::FillType fill) { |
| + static constexpr GrUserStencilSettings kWindingStencilSettings( |
| + GrUserStencilSettings::StaticInit< |
| + 0xffff, |
| + GrUserStencilTest::kAlwaysIfInClip, |
| + 0xffff, |
| + GrUserStencilOp::kIncMaybeClamp, // TODO: Use wrap ops for NVPR. |
| + GrUserStencilOp::kIncMaybeClamp, |
| + 0xffff>() |
| ); |
| - static constexpr GrStencilSettings kEvenODdStencilSettings( |
| - kInvert_StencilOp, |
| - kInvert_StencilOp, |
| - kAlwaysIfInClip_StencilFunc, |
| - 0xFFFF, 0xFFFF, 0xFFFF |
| + static constexpr GrUserStencilSettings kEvenOddStencilSettings( |
| + GrUserStencilSettings::StaticInit< |
| + 0xffff, |
| + GrUserStencilTest::kAlwaysIfInClip, |
| + 0xffff, |
| + GrUserStencilOp::kInvert, |
| + GrUserStencilOp::kInvert, |
| + 0xffff>() |
| ); |
| switch (fill) { |
| default: |
| SkFAIL("Unexpected path fill."); |
| case GrPathRendering::kWinding_FillType: |
| - *outStencilSettings = kWindingStencilSettings; |
| - break; |
| + return kWindingStencilSettings; |
| case GrPathRendering::kEvenOdd_FillType: |
| - *outStencilSettings = kEvenODdStencilSettings; |
| - break; |
| + return kEvenOddStencilSettings; |
| } |
| - fClipMaskManager->adjustPathStencilParams(sb, outStencilSettings); |
| } |
| void GrDrawTarget::stencilPath(const GrPipelineBuilder& pipelineBuilder, |
| @@ -308,9 +310,8 @@ void GrDrawTarget::stencilPath(const GrPipelineBuilder& pipelineBuilder, |
| SkASSERT(this->caps()->shaderCaps()->pathRenderingSupport()); |
| // Setup clip |
| - GrPipelineBuilder::AutoRestoreStencil ars; |
| GrAppliedClip clip; |
| - if (!fClipMaskManager->setupClipping(pipelineBuilder, &ars, nullptr, &clip)) { |
| + if (!fClipMaskManager->setupClipping(pipelineBuilder, nullptr, &clip)) { |
| return; |
| } |
| @@ -320,15 +321,16 @@ void GrDrawTarget::stencilPath(const GrPipelineBuilder& pipelineBuilder, |
| arfps.addCoverageFragmentProcessor(clip.clipCoverageFragmentProcessor()); |
| } |
| - // set stencil settings for path |
| - GrStencilSettings stencilSettings; |
| GrRenderTarget* rt = pipelineBuilder.getRenderTarget(); |
| - GrStencilAttachment* sb = fResourceProvider->attachStencilAttachment(rt); |
| - this->getPathStencilSettingsForFilltype(fill, sb, &stencilSettings); |
| + GrStencilAttachment* stencilAttachment = rt->renderTargetPriv().getStencilAttachment(); |
| + SkASSERT(stencilAttachment) |
| GrBatch* batch = GrStencilPathBatch::Create(viewMatrix, |
| pipelineBuilder.isHWAntialias(), |
| - stencilSettings, clip.scissorState(), |
| + get_path_stencil_settings_for_fill(fill), |
| + clip.hasStencilClip(), |
| + stencilAttachment->bits(), |
| + clip.scissorState(), |
| pipelineBuilder.getRenderTarget(), |
| path); |
| this->recordBatch(batch); |
| @@ -343,9 +345,8 @@ void GrDrawTarget::drawPathBatch(const GrPipelineBuilder& pipelineBuilder, |
| // batches. |
| SkASSERT(this->caps()->shaderCaps()->pathRenderingSupport()); |
| - GrPipelineBuilder::AutoRestoreStencil ars; |
| GrAppliedClip clip; |
| - if (!fClipMaskManager->setupClipping(pipelineBuilder, &ars, &batch->bounds(), &clip)) { |
| + if (!fClipMaskManager->setupClipping(pipelineBuilder, &batch->bounds(), &clip)) { |
| return; |
| } |
| @@ -356,14 +357,16 @@ void GrDrawTarget::drawPathBatch(const GrPipelineBuilder& pipelineBuilder, |
| } |
| // Ensure the render target has a stencil buffer and get the stencil settings. |
| - GrStencilSettings stencilSettings; |
| GrRenderTarget* rt = pipelineBuilder.getRenderTarget(); |
| GrStencilAttachment* sb = fResourceProvider->attachStencilAttachment(rt); |
| - this->getPathStencilSettingsForFilltype(batch->fillType(), sb, &stencilSettings); |
| - batch->setStencilSettings(stencilSettings); |
| + // TODO: Move this step into GrDrawPathPath::onPrepare(). |
| + batch->setStencilSettings(get_path_stencil_settings_for_fill(batch->fillType()), |
| + clip.hasStencilClip(), |
| + sb->bits()); |
| GrPipeline::CreateArgs args; |
| - if (!this->installPipelineInDrawBatch(&pipelineBuilder, &clip.scissorState(), batch)) { |
| + if (!this->installPipelineInDrawBatch(&pipelineBuilder, &clip.scissorState(), |
| + clip.hasStencilClip(), batch)) { |
| return; |
| } |
| @@ -547,11 +550,20 @@ void GrDrawTarget::forwardCombine() { |
| bool GrDrawTarget::installPipelineInDrawBatch(const GrPipelineBuilder* pipelineBuilder, |
| const GrScissorState* scissor, |
| + bool hasStencilClip, |
| GrDrawBatch* batch) { |
| GrPipeline::CreateArgs args; |
| args.fPipelineBuilder = pipelineBuilder; |
| args.fCaps = this->caps(); |
| args.fScissor = scissor; |
| + if (pipelineBuilder->hasUserStencilSettings() || hasStencilClip) { |
| + GrRenderTarget* rt = pipelineBuilder->getRenderTarget(); |
| + GrStencilAttachment* sb = fResourceProvider->attachStencilAttachment(rt); |
| + args.fNumStencilBits = sb->bits(); |
| + } else { |
| + args.fNumStencilBits = 0; |
| + } |
| + args.fHasStencilClip = hasStencilClip; |
| batch->getPipelineOptimizations(&args.fOpts); |
| GrScissorState finalScissor; |
| if (args.fOpts.fOverrides.fUsePLSDstRead) { |