Index: src/gpu/GrDrawTarget.cpp |
diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp |
index e143f90291c5652118598d887fa2201e5c779096..b4142eb40b1e2af0258c3a0bb64ad110e8944485 100644 |
--- a/src/gpu/GrDrawTarget.cpp |
+++ b/src/gpu/GrDrawTarget.cpp |
@@ -321,51 +321,38 @@ static void batch_bounds(SkRect* bounds, const GrBatch* batch) { |
} |
} |
-static inline bool intersect(SkRect* out, const SkRect& a, const SkRect& b) { |
- SkASSERT(a.fLeft <= a.fRight && a.fTop <= a.fBottom); |
- SkASSERT(b.fLeft <= b.fRight && b.fTop <= b.fBottom); |
- out->fLeft = SkTMax(a.fLeft, b.fLeft); |
- out->fTop = SkTMax(a.fTop, b.fTop); |
- out->fRight = SkTMin(a.fRight, b.fRight); |
- out->fBottom = SkTMin(a.fBottom, b.fBottom); |
- return (out->fLeft <= out->fRight && out->fTop <= out->fBottom); |
-} |
- |
void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder, |
GrDrawContext* drawContext, |
const GrClip& clip, |
GrDrawBatch* batch) { |
// Setup clip |
- GrAppliedClip appliedClip; |
SkRect bounds; |
batch_bounds(&bounds, batch); |
- if (!clip.apply(fContext, drawContext, &bounds, |
- pipelineBuilder.isHWAntialias(), pipelineBuilder.hasUserStencilSettings(), |
- &appliedClip)) { |
+ GrAppliedClip appliedClip(bounds); |
+ if (!clip.apply(fContext, drawContext, pipelineBuilder.isHWAntialias(), |
+ pipelineBuilder.hasUserStencilSettings(), &appliedClip)) { |
return; |
} |
// TODO: this is the only remaining usage of the AutoRestoreFragmentProcessorState - remove it |
GrPipelineBuilder::AutoRestoreFragmentProcessorState arfps; |
- if (appliedClip.getClipCoverageFragmentProcessor()) { |
+ if (appliedClip.clipCoverageFragmentProcessor()) { |
arfps.set(&pipelineBuilder); |
- arfps.addCoverageFragmentProcessor(sk_ref_sp(appliedClip.getClipCoverageFragmentProcessor())); |
+ arfps.addCoverageFragmentProcessor(sk_ref_sp(appliedClip.clipCoverageFragmentProcessor())); |
} |
- GrPipeline::CreateArgs args; |
- args.fPipelineBuilder = &pipelineBuilder; |
- args.fDrawContext = drawContext; |
- args.fCaps = this->caps(); |
- args.fScissor = &appliedClip.scissorState(); |
- args.fHasStencilClip = appliedClip.hasStencilClip(); |
if (pipelineBuilder.hasUserStencilSettings() || appliedClip.hasStencilClip()) { |
if (!fResourceProvider->attachStencilAttachment(drawContext->accessRenderTarget())) { |
SkDebugf("ERROR creating stencil attachment. Draw skipped.\n"); |
return; |
} |
} |
+ |
+ GrPipeline::CreateArgs args; |
+ args.fPipelineBuilder = &pipelineBuilder; |
+ args.fDrawContext = drawContext; |
+ args.fCaps = this->caps(); |
batch->getPipelineOptimizations(&args.fOpts); |
- GrScissorState finalScissor; |
if (args.fOpts.fOverrides.fUsePLSDstRead || fClipBatchToBounds) { |
GrGLIRect viewport; |
viewport.fLeft = 0; |
@@ -381,14 +368,9 @@ void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder, |
viewport.fWidth); |
ibounds.fBottom = SkTPin(SkScalarCeilToInt(batch->bounds().fBottom), viewport.fBottom, |
viewport.fHeight); |
- if (appliedClip.scissorState().enabled()) { |
- const SkIRect& scissorRect = appliedClip.scissorState().rect(); |
- if (!ibounds.intersect(scissorRect)) { |
- return; |
- } |
+ if (!appliedClip.addScissor(ibounds)) { |
+ return; |
} |
- finalScissor.set(ibounds); |
- args.fScissor = &finalScissor; |
} |
args.fOpts.fColorPOI.completeCalculations( |
sk_sp_address_as_pointer_address(pipelineBuilder.fColorFragmentProcessors.begin()), |
@@ -396,6 +378,8 @@ void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder, |
args.fOpts.fCoveragePOI.completeCalculations( |
sk_sp_address_as_pointer_address(pipelineBuilder.fCoverageFragmentProcessors.begin()), |
pipelineBuilder.numCoverageFragmentProcessors()); |
+ args.fScissor = &appliedClip.scissorState(); |
+ args.fHasStencilClip = appliedClip.hasStencilClip(); |
if (!this->setupDstReadIfNecessary(pipelineBuilder, drawContext->accessRenderTarget(), |
clip, args.fOpts, |
&args.fDstTexture, batch->bounds())) { |
@@ -410,9 +394,7 @@ void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder, |
SkASSERT(fRenderTarget); |
batch->pipeline()->addDependenciesTo(fRenderTarget); |
#endif |
- SkRect clippedBounds; |
- SkAssertResult(intersect(&clippedBounds, bounds, appliedClip.deviceBounds())); |
- this->recordBatch(batch, clippedBounds); |
+ this->recordBatch(batch, appliedClip.clippedDrawBounds()); |
} |
void GrDrawTarget::stencilPath(GrDrawContext* drawContext, |
@@ -424,16 +406,20 @@ void GrDrawTarget::stencilPath(GrDrawContext* drawContext, |
SkASSERT(path); |
SkASSERT(this->caps()->shaderCaps()->pathRenderingSupport()); |
+ // FIXME: Use path bounds instead of this WAR once |
+ // https://bugs.chromium.org/p/skia/issues/detail?id=5640 is resolved. |
+ SkRect bounds = SkRect::MakeIWH(drawContext->width(), drawContext->height()); |
+ |
// Setup clip |
- GrAppliedClip appliedClip; |
- if (!clip.apply(fContext, drawContext, nullptr, useHWAA, true, &appliedClip)) { |
+ GrAppliedClip appliedClip(bounds); |
+ if (!clip.apply(fContext, drawContext, useHWAA, true, &appliedClip)) { |
return; |
} |
// TODO: respect fClipBatchToBounds if we ever start computing bounds here. |
// Coverage AA does not make sense when rendering to the stencil buffer. The caller should never |
// attempt this in a situation that would require coverage AA. |
- SkASSERT(!appliedClip.getClipCoverageFragmentProcessor()); |
+ SkASSERT(!appliedClip.clipCoverageFragmentProcessor()); |
GrStencilAttachment* stencilAttachment = fResourceProvider->attachStencilAttachment( |
drawContext->accessRenderTarget()); |
@@ -450,7 +436,7 @@ void GrDrawTarget::stencilPath(GrDrawContext* drawContext, |
appliedClip.scissorState(), |
drawContext->accessRenderTarget(), |
path); |
- this->recordBatch(batch, appliedClip.deviceBounds()); |
+ this->recordBatch(batch, appliedClip.clippedDrawBounds()); |
batch->unref(); |
} |