Chromium Code Reviews| Index: src/gpu/GrDrawContext.cpp |
| diff --git a/src/gpu/GrDrawContext.cpp b/src/gpu/GrDrawContext.cpp |
| index b34111cdfdf39da33aeee8eceeefca5a515e3298..581bf087f28c8ec73d6a5fc5b7fcdf047b6bed7f 100644 |
| --- a/src/gpu/GrDrawContext.cpp |
| +++ b/src/gpu/GrDrawContext.cpp |
| @@ -36,6 +36,7 @@ |
| #define ASSERT_SINGLE_OWNER_PRIV \ |
| SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(fDrawContext->fSingleOwner);) |
| #define RETURN_IF_ABANDONED if (fDrawingManager->wasAbandoned()) { return; } |
| +#define RETURN_IF_ABANDONED_PRIV if (fDrawContext->fDrawingManager->wasAbandoned()) { return; } |
| #define RETURN_FALSE_IF_ABANDONED if (fDrawingManager->wasAbandoned()) { return false; } |
| #define RETURN_FALSE_IF_ABANDONED_PRIV if (fDrawContext->fDrawingManager->wasAbandoned()) { return false; } |
| #define RETURN_NULL_IF_ABANDONED if (fDrawingManager->wasAbandoned()) { return nullptr; } |
| @@ -189,7 +190,7 @@ void GrDrawContext::clear(const SkIRect* rect, |
| GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::clear"); |
| AutoCheckFlush acf(fDrawingManager); |
| - this->getDrawTarget()->clear(rect, color, canIgnoreRect, fRenderTarget.get()); |
| + this->getDrawTarget()->clear(rect, color, canIgnoreRect, this); |
| } |
| @@ -241,7 +242,7 @@ void GrDrawContext::drawPaint(const GrClip& clip, |
| &localMatrix)); |
| GrPipelineBuilder pipelineBuilder(*paint, this->isUnifiedMultisampled()); |
| pipelineBuilder.setRenderTarget(fRenderTarget.get()); |
| - this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| + this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
| } |
| } |
| @@ -322,7 +323,7 @@ void GrDrawContext::drawRect(const GrClip& clip, |
| // Will it blend? |
| GrColor clearColor; |
| if (paint.isConstantBlendedColor(&clearColor)) { |
| - this->getDrawTarget()->clear(nullptr, clearColor, true, fRenderTarget.get()); |
| + this->getDrawTarget()->clear(nullptr, clearColor, true, this); |
| return; |
| } |
| } |
| @@ -364,7 +365,7 @@ void GrDrawContext::drawRect(const GrClip& clip, |
| snapToPixelCenters); |
| } |
| - this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| + this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
| return; |
| } |
| @@ -374,6 +375,52 @@ void GrDrawContext::drawRect(const GrClip& clip, |
| this->internalDrawPath(clip, paint, viewMatrix, path, *style); |
| } |
| +void GrDrawContextPriv::clearStencilClip(const SkIRect& rect, bool insideClip) { |
| + ASSERT_SINGLE_OWNER_PRIV |
| + RETURN_IF_ABANDONED_PRIV |
| + SkDEBUGCODE(fDrawContext->validate();) |
| + GR_AUDIT_TRAIL_AUTO_FRAME(fDrawContext->fAuditTrail, "GrDrawContextPriv::clearStencilClip"); |
| + |
| + AutoCheckFlush acf(fDrawContext->fDrawingManager); |
| + fDrawContext->getDrawTarget()->clearStencilClip(rect, insideClip, |
| + fDrawContext->accessRenderTarget()); |
| +} |
| + |
| +void GrDrawContextPriv::stencilPath(const GrPipelineBuilder& pipelineBuilder, |
| + const GrClip& clip, |
| + const SkMatrix& viewMatrix, |
| + const GrPath* path, |
| + GrPathRendering::FillType fill) { |
| + fDrawContext->getDrawTarget()->stencilPath(pipelineBuilder, fDrawContext, |
| + clip, viewMatrix, path, fill); |
| +} |
| + |
| +void GrDrawContextPriv::stencilRect(const GrFixedClip& clip, |
| + const GrUserStencilSettings* ss, |
| + bool doAA, |
| + const SkMatrix& viewMatrix, |
| + const SkRect& rect) { |
| + ASSERT_SINGLE_OWNER_PRIV |
| + RETURN_IF_ABANDONED_PRIV |
| + SkDEBUGCODE(fDrawContext->validate();) |
| + GR_AUDIT_TRAIL_AUTO_FRAME(fDrawContext->fAuditTrail, "GrDrawContext::stencilRect"); |
| + |
| + AutoCheckFlush acf(fDrawContext->fDrawingManager); |
| + |
| + GrPaint paint; |
| + paint.setAntiAlias(doAA); |
| + paint.setXPFactory(GrDisableColorXPFactory::Create()); |
|
bungeman-skia
2016/06/03 21:11:12
bug: leaks
|
| + |
| + SkAutoTUnref<GrDrawBatch> batch(fDrawContext->getFillRectBatch(paint, viewMatrix, rect)); |
| + SkASSERT(batch); |
| + |
| + GrPipelineBuilder pipelineBuilder(paint, fDrawContext->isUnifiedMultisampled()); |
| + pipelineBuilder.setRenderTarget(fDrawContext->accessRenderTarget()); |
| + pipelineBuilder.setUserStencil(ss); |
| + |
| + fDrawContext->getDrawTarget()->drawBatch(pipelineBuilder, fDrawContext, clip, batch); |
| +} |
| + |
| bool GrDrawContextPriv::drawAndStencilRect(const GrFixedClip& clip, |
| const GrUserStencilSettings* ss, |
| SkRegion::Op op, |
| @@ -398,7 +445,7 @@ bool GrDrawContextPriv::drawAndStencilRect(const GrFixedClip& clip, |
| pipelineBuilder.setRenderTarget(fDrawContext->accessRenderTarget()); |
| pipelineBuilder.setUserStencil(ss); |
| - fDrawContext->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| + fDrawContext->getDrawTarget()->drawBatch(pipelineBuilder, fDrawContext, clip, batch); |
| return true; |
| } |
| @@ -433,7 +480,7 @@ void GrDrawContext::fillRectToRect(const GrClip& clip, |
| if (batch) { |
| GrPipelineBuilder pipelineBuilder(paint, this->isUnifiedMultisampled()); |
| pipelineBuilder.setRenderTarget(fRenderTarget.get()); |
| - this->drawBatch(&pipelineBuilder, clip, batch); |
| + this->drawBatch(pipelineBuilder, clip, batch); |
| } |
| } |
| @@ -461,7 +508,7 @@ void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip, |
| GrPipelineBuilder pipelineBuilder(paint, this->isUnifiedMultisampled()); |
| pipelineBuilder.setRenderTarget(fRenderTarget.get()); |
| - this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| + this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
| } |
| void GrDrawContext::drawVertices(const GrClip& clip, |
| @@ -507,7 +554,7 @@ void GrDrawContext::drawVertices(const GrClip& clip, |
| GrPipelineBuilder pipelineBuilder(paint, this->isUnifiedMultisampled()); |
| pipelineBuilder.setRenderTarget(fRenderTarget.get()); |
| - this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| + this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
| } |
| /////////////////////////////////////////////////////////////////////////////// |
| @@ -533,7 +580,7 @@ void GrDrawContext::drawAtlas(const GrClip& clip, |
| GrPipelineBuilder pipelineBuilder(paint, this->isUnifiedMultisampled()); |
| pipelineBuilder.setRenderTarget(fRenderTarget.get()); |
| - this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| + this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
| } |
| /////////////////////////////////////////////////////////////////////////////// |
| @@ -567,7 +614,7 @@ void GrDrawContext::drawRRect(const GrClip& clip, |
| if (batch) { |
| GrPipelineBuilder pipelineBuilder(paint, this->isUnifiedMultisampled()); |
| pipelineBuilder.setRenderTarget(fRenderTarget.get()); |
| - this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| + this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
| return; |
| } |
| } |
| @@ -693,7 +740,7 @@ void GrDrawContext::drawOval(const GrClip& clip, |
| if (batch) { |
| GrPipelineBuilder pipelineBuilder(paint, this->isUnifiedMultisampled()); |
| pipelineBuilder.setRenderTarget(fRenderTarget.get()); |
| - this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| + this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
| return; |
| } |
| } |
| @@ -724,7 +771,7 @@ void GrDrawContext::drawImageNine(const GrClip& clip, |
| GrPipelineBuilder pipelineBuilder(paint, this->isUnifiedMultisampled()); |
| pipelineBuilder.setRenderTarget(fRenderTarget.get()); |
| - this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| + this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
| } |
| @@ -785,7 +832,7 @@ void GrDrawContext::drawBatch(const GrClip& clip, |
| GrPipelineBuilder pipelineBuilder(paint, this->isUnifiedMultisampled()); |
| pipelineBuilder.setRenderTarget(fRenderTarget.get()); |
| - this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| + this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
| } |
| void GrDrawContext::drawPath(const GrClip& clip, |
| @@ -818,7 +865,7 @@ void GrDrawContext::drawPath(const GrClip& clip, |
| if (batch) { |
| GrPipelineBuilder pipelineBuilder(paint, this->isUnifiedMultisampled()); |
| pipelineBuilder.setRenderTarget(fRenderTarget.get()); |
| - this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| + this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
| } |
| return; |
| } |
| @@ -836,7 +883,7 @@ void GrDrawContext::drawPath(const GrClip& clip, |
| if (batch) { |
| GrPipelineBuilder pipelineBuilder(paint, this->isUnifiedMultisampled()); |
| pipelineBuilder.setRenderTarget(fRenderTarget.get()); |
| - this->getDrawTarget()->drawBatch(pipelineBuilder, clip, batch); |
| + this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
| return; |
| } |
| } |
| @@ -876,7 +923,7 @@ bool GrDrawContextPriv::drawAndStencilPath(const GrFixedClip& clip, |
| // aa. If we have some future driver-mojo path AA that can do the right |
| // thing WRT to the blend then we'll need some query on the PR. |
| bool useCoverageAA = doAA && !fDrawContext->fRenderTarget->isUnifiedMultisampled(); |
| - bool hasUserStencilSettings = (&GrUserStencilSettings::kUnused != ss); |
| + bool hasUserStencilSettings = !ss->isUnused(); |
| bool isStencilBufferMSAA = fDrawContext->fRenderTarget->isStencilBufferMultisampled(); |
| const GrPathRendererChain::DrawType type = |
| @@ -901,14 +948,11 @@ bool GrDrawContextPriv::drawAndStencilPath(const GrFixedClip& clip, |
| GrPaint paint; |
| paint.setCoverageSetOpXPFactory(op, invert); |
| - GrPipelineBuilder pipelineBuilder(paint, fDrawContext->isUnifiedMultisampled()); |
| - pipelineBuilder.setRenderTarget(fDrawContext->accessRenderTarget()); |
| - pipelineBuilder.setUserStencil(ss); |
| - |
| GrPathRenderer::DrawPathArgs args; |
| - args.fTarget = fDrawContext->getDrawTarget(); |
| args.fResourceProvider = fDrawContext->fDrawingManager->getContext()->resourceProvider(); |
| - args.fPipelineBuilder = &pipelineBuilder; |
| + args.fPaint = &paint; |
| + args.fUserStencilSettings = ss; |
| + args.fDrawContext = fDrawContext; |
| args.fClip = &clip; |
| args.fColor = GrColor_WHITE; |
| args.fViewMatrix = &viewMatrix; |
| @@ -1008,13 +1052,11 @@ void GrDrawContext::internalDrawPath(const GrClip& clip, |
| return; |
| } |
| - GrPipelineBuilder pipelineBuilder(paint, this->isUnifiedMultisampled()); |
| - pipelineBuilder.setRenderTarget(fRenderTarget.get()); |
| - |
| GrPathRenderer::DrawPathArgs args; |
| - args.fTarget = this->getDrawTarget(); |
| args.fResourceProvider = fDrawingManager->getContext()->resourceProvider(); |
| - args.fPipelineBuilder = &pipelineBuilder; |
| + args.fPaint = &paint; |
| + args.fUserStencilSettings = &GrUserStencilSettings::kUnused; |
| + args.fDrawContext = this; |
| args.fClip = &clip; |
| args.fColor = paint.getColor(); |
| args.fViewMatrix = &viewMatrix; |
| @@ -1025,12 +1067,12 @@ void GrDrawContext::internalDrawPath(const GrClip& clip, |
| pr->drawPath(args); |
| } |
| -void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, const GrClip& clip, |
| +void GrDrawContext::drawBatch(const GrPipelineBuilder& pipelineBuilder, const GrClip& clip, |
| GrDrawBatch* batch) { |
| ASSERT_SINGLE_OWNER |
| RETURN_IF_ABANDONED |
| SkDEBUGCODE(this->validate();) |
| GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawBatch"); |
| - this->getDrawTarget()->drawBatch(*pipelineBuilder, clip, batch); |
| + this->getDrawTarget()->drawBatch(pipelineBuilder, this, clip, batch); |
| } |