Index: src/gpu/GrDrawTarget.cpp |
diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp |
index 7166fc7160008159ab4bcc7208fcb6ae8d93f64f..26b271f3b35221665cfff1cc9607f5dd3f51a1fe 100644 |
--- a/src/gpu/GrDrawTarget.cpp |
+++ b/src/gpu/GrDrawTarget.cpp |
@@ -257,8 +257,51 @@ void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder, |
} |
GrPipeline::CreateArgs args; |
- if (!this->installPipelineInDrawBatch(&pipelineBuilder, &clip.scissorState(), |
- clip.hasStencilClip(), batch)) { |
+ args.fPipelineBuilder = &pipelineBuilder; |
+ args.fCaps = this->caps(); |
+ args.fScissor = &clip.scissorState(); |
+ args.fHasStencilClip = clip.hasStencilClip(); |
+ if (pipelineBuilder.hasUserStencilSettings() || clip.hasStencilClip()) { |
+ fResourceProvider->attachStencilAttachment(pipelineBuilder.getRenderTarget()); |
+ } |
+ batch->getPipelineOptimizations(&args.fOpts); |
+ GrScissorState finalScissor; |
+ if (args.fOpts.fOverrides.fUsePLSDstRead) { |
+ GrRenderTarget* rt = pipelineBuilder.getRenderTarget(); |
+ GrGLIRect viewport; |
+ viewport.fLeft = 0; |
+ viewport.fBottom = 0; |
+ viewport.fWidth = rt->width(); |
+ viewport.fHeight = rt->height(); |
+ SkIRect ibounds; |
+ ibounds.fLeft = SkTPin(SkScalarFloorToInt(batch->bounds().fLeft), viewport.fLeft, |
+ viewport.fWidth); |
+ ibounds.fTop = SkTPin(SkScalarFloorToInt(batch->bounds().fTop), viewport.fBottom, |
+ viewport.fHeight); |
+ ibounds.fRight = SkTPin(SkScalarCeilToInt(batch->bounds().fRight), viewport.fLeft, |
+ viewport.fWidth); |
+ ibounds.fBottom = SkTPin(SkScalarCeilToInt(batch->bounds().fBottom), viewport.fBottom, |
+ viewport.fHeight); |
+ if (clip.scissorState().enabled()) { |
+ const SkIRect& scissorRect = clip.scissorState().rect(); |
+ if (!ibounds.intersect(scissorRect)) { |
+ ibounds = scissorRect; |
+ } |
+ } |
+ finalScissor.set(ibounds); |
+ args.fScissor = &finalScissor; |
+ } |
+ args.fOpts.fColorPOI.completeCalculations(pipelineBuilder.fColorFragmentProcessors.begin(), |
+ pipelineBuilder.numColorFragmentProcessors()); |
+ args.fOpts.fCoveragePOI.completeCalculations( |
+ pipelineBuilder.fCoverageFragmentProcessors.begin(), |
+ pipelineBuilder.numCoverageFragmentProcessors()); |
+ if (!this->setupDstReadIfNecessary(pipelineBuilder, args.fOpts, &args.fDstTexture, |
+ batch->bounds())) { |
+ return; |
+ } |
+ |
+ if (!batch->installPipeline(args)) { |
return; |
} |
@@ -270,38 +313,6 @@ void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder, |
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>() |
- ); |
- |
- 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: |
- return kWindingStencilSettings; |
- case GrPathRendering::kEvenOdd_FillType: |
- return kEvenOddStencilSettings; |
- } |
-} |
- |
void GrDrawTarget::stencilPath(const GrPipelineBuilder& pipelineBuilder, |
const SkMatrix& viewMatrix, |
const GrPath* path, |
@@ -327,7 +338,7 @@ void GrDrawTarget::stencilPath(const GrPipelineBuilder& pipelineBuilder, |
GrBatch* batch = GrStencilPathBatch::Create(viewMatrix, |
pipelineBuilder.isHWAntialias(), |
- get_path_stencil_settings_for_fill(fill), |
+ fill, |
clip.hasStencilClip(), |
stencilAttachment->bits(), |
clip.scissorState(), |
@@ -337,42 +348,6 @@ void GrDrawTarget::stencilPath(const GrPipelineBuilder& pipelineBuilder, |
batch->unref(); |
} |
-void GrDrawTarget::drawPathBatch(const GrPipelineBuilder& pipelineBuilder, |
- GrDrawPathBatchBase* batch) { |
- // This looks like drawBatch() but there is an added wrinkle that stencil settings get inserted |
- // after setting up clipping but before onDrawBatch(). TODO: Figure out a better model for |
- // handling stencil settings WRT interactions between pipeline(builder), clipmaskmanager, and |
- // batches. |
- SkASSERT(this->caps()->shaderCaps()->pathRenderingSupport()); |
- |
- GrAppliedClip clip; |
- if (!fClipMaskManager->setupClipping(pipelineBuilder, &batch->bounds(), &clip)) { |
- return; |
- } |
- |
- GrPipelineBuilder::AutoRestoreFragmentProcessorState arfps; |
- if (clip.clipCoverageFragmentProcessor()) { |
- arfps.set(&pipelineBuilder); |
- arfps.addCoverageFragmentProcessor(clip.clipCoverageFragmentProcessor()); |
- } |
- |
- // Ensure the render target has a stencil buffer and get the stencil settings. |
- 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()); |
- |
- GrPipeline::CreateArgs args; |
- if (!this->installPipelineInDrawBatch(&pipelineBuilder, &clip.scissorState(), |
- clip.hasStencilClip(), batch)) { |
- return; |
- } |
- |
- this->recordBatch(batch); |
-} |
- |
void GrDrawTarget::clear(const SkIRect* rect, |
GrColor color, |
bool canIgnoreRect, |
@@ -548,65 +523,6 @@ 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) { |
- GrRenderTarget* rt = pipelineBuilder->getRenderTarget(); |
- GrGLIRect viewport; |
- viewport.fLeft = 0; |
- viewport.fBottom = 0; |
- viewport.fWidth = rt->width(); |
- viewport.fHeight = rt->height(); |
- SkIRect ibounds; |
- ibounds.fLeft = SkTPin(SkScalarFloorToInt(batch->bounds().fLeft), viewport.fLeft, |
- viewport.fWidth); |
- ibounds.fTop = SkTPin(SkScalarFloorToInt(batch->bounds().fTop), viewport.fBottom, |
- viewport.fHeight); |
- ibounds.fRight = SkTPin(SkScalarCeilToInt(batch->bounds().fRight), viewport.fLeft, |
- viewport.fWidth); |
- ibounds.fBottom = SkTPin(SkScalarCeilToInt(batch->bounds().fBottom), viewport.fBottom, |
- viewport.fHeight); |
- if (scissor != nullptr && scissor->enabled()) { |
- if (!ibounds.intersect(scissor->rect())) { |
- ibounds = scissor->rect(); |
- } |
- } |
- finalScissor.set(ibounds); |
- args.fScissor = &finalScissor; |
- } |
- args.fOpts.fColorPOI.completeCalculations(pipelineBuilder->fColorFragmentProcessors.begin(), |
- pipelineBuilder->numColorFragmentProcessors()); |
- args.fOpts.fCoveragePOI.completeCalculations( |
- pipelineBuilder->fCoverageFragmentProcessors.begin(), |
- pipelineBuilder->numCoverageFragmentProcessors()); |
- if (!this->setupDstReadIfNecessary(*pipelineBuilder, args.fOpts, &args.fDstTexture, |
- batch->bounds())) { |
- return false; |
- } |
- |
- if (!batch->installPipeline(args)) { |
- return false; |
- } |
- |
- return true; |
-} |
- |
void GrDrawTarget::clearStencilClip(const SkIRect& rect, bool insideClip, GrRenderTarget* rt) { |
GrBatch* batch = new GrClearStencilClipBatch(rect, insideClip, rt); |
this->recordBatch(batch); |