Index: src/gpu/GrDrawTarget.cpp |
diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp |
index f824c8112baefd1784acc9b4fca53de2ec311edc..0f180dc861b92ced07c2ddc9548564894f7642b0 100644 |
--- a/src/gpu/GrDrawTarget.cpp |
+++ b/src/gpu/GrDrawTarget.cpp |
@@ -16,7 +16,6 @@ |
#include "GrRenderTarget.h" |
#include "GrResourceProvider.h" |
#include "GrRenderTargetPriv.h" |
-#include "GrStencilAttachment.h" |
#include "GrSurfacePriv.h" |
#include "GrTexture.h" |
#include "gl/GrGLRenderTarget.h" |
@@ -236,16 +235,17 @@ |
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, *scissorRect, |
+ if (!fClipMaskManager->setupScissorClip(pipelineBuilder, &ars, *scissorRect, |
&batch->bounds(), &clip)) { |
return; |
} |
} else { |
- if (!fClipMaskManager->setupClipping(pipelineBuilder, &batch->bounds(), &clip)) { |
+ if (!fClipMaskManager->setupClipping(pipelineBuilder, &ars, &batch->bounds(), &clip)) { |
return; |
} |
} |
@@ -257,8 +257,7 @@ |
} |
GrPipeline::CreateArgs args; |
- if (!this->installPipelineInDrawBatch(&pipelineBuilder, &clip.scissorState(), |
- clip.hasStencilClip(), batch)) { |
+ if (!this->installPipelineInDrawBatch(&pipelineBuilder, &clip.scissorState(), batch)) { |
return; |
} |
@@ -270,36 +269,34 @@ |
this->recordBatch(batch); |
} |
-inline static 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>() |
+void GrDrawTarget::getPathStencilSettingsForFilltype(GrPathRendering::FillType fill, |
+ const GrStencilAttachment* sb, |
+ GrStencilSettings* outStencilSettings) { |
+ static constexpr GrStencilSettings kWindingStencilSettings( |
+ kIncClamp_StencilOp, |
+ kIncClamp_StencilOp, |
+ kAlwaysIfInClip_StencilFunc, |
+ 0xFFFF, 0xFFFF, 0xFFFF |
); |
- static constexpr GrUserStencilSettings kEvenOddStencilSettings( |
- GrUserStencilSettings::StaticInit< |
- 0xffff, |
- GrUserStencilTest::kAlwaysIfInClip, |
- 0xffff, |
- GrUserStencilOp::kInvert, |
- GrUserStencilOp::kInvert, |
- 0xffff>() |
+ static constexpr GrStencilSettings kEvenODdStencilSettings( |
+ kInvert_StencilOp, |
+ kInvert_StencilOp, |
+ kAlwaysIfInClip_StencilFunc, |
+ 0xFFFF, 0xFFFF, 0xFFFF |
); |
switch (fill) { |
default: |
SkFAIL("Unexpected path fill."); |
case GrPathRendering::kWinding_FillType: |
- return kWindingStencilSettings; |
+ *outStencilSettings = kWindingStencilSettings; |
+ break; |
case GrPathRendering::kEvenOdd_FillType: |
- return kEvenOddStencilSettings; |
- } |
+ *outStencilSettings = kEvenODdStencilSettings; |
+ break; |
+ } |
+ fClipMaskManager->adjustPathStencilParams(sb, outStencilSettings); |
} |
void GrDrawTarget::stencilPath(const GrPipelineBuilder& pipelineBuilder, |
@@ -311,8 +308,9 @@ |
SkASSERT(this->caps()->shaderCaps()->pathRenderingSupport()); |
// Setup clip |
+ GrPipelineBuilder::AutoRestoreStencil ars; |
GrAppliedClip clip; |
- if (!fClipMaskManager->setupClipping(pipelineBuilder, nullptr, &clip)) { |
+ if (!fClipMaskManager->setupClipping(pipelineBuilder, &ars, nullptr, &clip)) { |
return; |
} |
@@ -322,16 +320,15 @@ |
arfps.addCoverageFragmentProcessor(clip.clipCoverageFragmentProcessor()); |
} |
+ // set stencil settings for path |
+ GrStencilSettings stencilSettings; |
GrRenderTarget* rt = pipelineBuilder.getRenderTarget(); |
- GrStencilAttachment* stencilAttachment = rt->renderTargetPriv().getStencilAttachment(); |
- SkASSERT(stencilAttachment) |
+ GrStencilAttachment* sb = fResourceProvider->attachStencilAttachment(rt); |
+ this->getPathStencilSettingsForFilltype(fill, sb, &stencilSettings); |
GrBatch* batch = GrStencilPathBatch::Create(viewMatrix, |
pipelineBuilder.isHWAntialias(), |
- get_path_stencil_settings_for_fill(fill), |
- clip.hasStencilClip(), |
- stencilAttachment->bits(), |
- clip.scissorState(), |
+ stencilSettings, clip.scissorState(), |
pipelineBuilder.getRenderTarget(), |
path); |
this->recordBatch(batch); |
@@ -346,8 +343,9 @@ |
// batches. |
SkASSERT(this->caps()->shaderCaps()->pathRenderingSupport()); |
+ GrPipelineBuilder::AutoRestoreStencil ars; |
GrAppliedClip clip; |
- if (!fClipMaskManager->setupClipping(pipelineBuilder, &batch->bounds(), &clip)) { |
+ if (!fClipMaskManager->setupClipping(pipelineBuilder, &ars, &batch->bounds(), &clip)) { |
return; |
} |
@@ -358,16 +356,14 @@ |
} |
// Ensure the render target has a stencil buffer and get the stencil settings. |
+ GrStencilSettings stencilSettings; |
GrRenderTarget* rt = pipelineBuilder.getRenderTarget(); |
GrStencilAttachment* sb = fResourceProvider->attachStencilAttachment(rt); |
- // TODO: Move this step into GrDrawPathPath::onPrepare(). |
- batch->setStencilSettings(get_path_stencil_settings_for_fill(batch->fillType()), |
- clip.hasStencilClip(), |
- sb->bits()); |
+ this->getPathStencilSettingsForFilltype(batch->fillType(), sb, &stencilSettings); |
+ batch->setStencilSettings(stencilSettings); |
GrPipeline::CreateArgs args; |
- if (!this->installPipelineInDrawBatch(&pipelineBuilder, &clip.scissorState(), |
- clip.hasStencilClip(), batch)) { |
+ if (!this->installPipelineInDrawBatch(&pipelineBuilder, &clip.scissorState(), batch)) { |
return; |
} |
@@ -551,20 +547,11 @@ |
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) { |