Index: src/gpu/batches/GrMSAAPathRenderer.cpp |
diff --git a/src/gpu/batches/GrMSAAPathRenderer.cpp b/src/gpu/batches/GrMSAAPathRenderer.cpp |
index 2072175ef5ff55462f4b38dae6eec70581ee9c17..887c5273647822e5e6282018d2aa1fad9db80d40 100644 |
--- a/src/gpu/batches/GrMSAAPathRenderer.cpp |
+++ b/src/gpu/batches/GrMSAAPathRenderer.cpp |
@@ -7,7 +7,9 @@ |
#include "GrMSAAPathRenderer.h" |
+#include "GrAuditTrail.h" |
#include "GrBatchFlushState.h" |
+#include "GrClip.h" |
#include "GrDefaultGeoProcFactory.h" |
#include "GrPathStencilSettings.h" |
#include "GrPathUtils.h" |
@@ -566,19 +568,14 @@ private: |
typedef GrVertexBatch INHERITED; |
}; |
-bool GrMSAAPathRenderer::internalDrawPath(GrDrawTarget* target, |
- GrPipelineBuilder* pipelineBuilder, |
+bool GrMSAAPathRenderer::internalDrawPath(GrDrawContext* drawContext, |
+ const GrPaint& paint, |
+ const GrUserStencilSettings* userStencilSettings, |
const GrClip& clip, |
GrColor color, |
const SkMatrix& viewMatrix, |
const SkPath& path, |
bool stencilOnly) { |
- |
- const GrXPFactory* xpFactory = pipelineBuilder->getXPFactory(); |
- SkAutoTUnref<const GrXPFactory> backupXPFactory(SkSafeRef(xpFactory)); |
- // face culling doesn't make sense here |
- SkASSERT(GrPipelineBuilder::kBoth_DrawFace == pipelineBuilder->getDrawFace()); |
- |
int passCount = 0; |
const GrUserStencilSettings* passes[3]; |
GrPipelineBuilder::DrawFace drawFace[3]; |
@@ -643,21 +640,13 @@ bool GrMSAAPathRenderer::internalDrawPath(GrDrawTarget* target, |
} |
SkRect devBounds; |
- GetPathDevBounds(path, pipelineBuilder->getRenderTarget(), viewMatrix, &devBounds); |
+ GetPathDevBounds(path, drawContext->width(), drawContext->height(), viewMatrix, &devBounds); |
for (int p = 0; p < passCount; ++p) { |
- pipelineBuilder->setDrawFace(drawFace[p]); |
- if (passes[p]) { |
- pipelineBuilder->setUserStencil(passes[p]); |
- } |
- |
if (lastPassIsBounds && (p == passCount-1)) { |
- // Reset the XP Factory on pipelineBuilder |
- pipelineBuilder->setXPFactory(backupXPFactory); |
SkRect bounds; |
SkMatrix localMatrix = SkMatrix::I(); |
if (reverse) { |
- SkASSERT(pipelineBuilder->getRenderTarget()); |
// draw over the dev bounds (which will be the whole dst surface for inv fill). |
bounds = devBounds; |
SkMatrix vmi; |
@@ -677,12 +666,18 @@ bool GrMSAAPathRenderer::internalDrawPath(GrDrawTarget* target, |
SkAutoTUnref<GrDrawBatch> batch( |
GrRectBatchFactory::CreateNonAAFill(color, viewM, bounds, nullptr, |
&localMatrix)); |
- target->drawBatch(*pipelineBuilder, clip, batch); |
- } else { |
- if (passCount > 1) { |
- pipelineBuilder->setDisableColorXPFactory(); |
+ |
+ GrPipelineBuilder pipelineBuilder(paint, drawContext->isUnifiedMultisampled()); |
+ pipelineBuilder.setRenderTarget(drawContext->accessRenderTarget()); |
+ pipelineBuilder.setDrawFace(drawFace[p]); |
+ if (passes[p]) { |
+ pipelineBuilder.setUserStencil(passes[p]); |
+ } else { |
+ pipelineBuilder.setUserStencil(userStencilSettings); |
} |
+ drawContext->drawBatch(pipelineBuilder, clip, batch); |
+ } else { |
MSAAPathBatch::Geometry geometry; |
geometry.fColor = color; |
geometry.fPath = path; |
@@ -690,12 +685,23 @@ bool GrMSAAPathRenderer::internalDrawPath(GrDrawTarget* target, |
SkAutoTUnref<MSAAPathBatch> batch(MSAAPathBatch::Create(geometry, viewMatrix, |
devBounds)); |
- if (batch->isValid()) { |
- target->drawBatch(*pipelineBuilder, clip, batch); |
- } |
- else { |
+ if (!batch->isValid()) { |
return false; |
} |
+ |
+ GrPipelineBuilder pipelineBuilder(paint, drawContext->isUnifiedMultisampled()); |
+ pipelineBuilder.setRenderTarget(drawContext->accessRenderTarget()); |
+ pipelineBuilder.setDrawFace(drawFace[p]); |
+ if (passes[p]) { |
+ pipelineBuilder.setUserStencil(passes[p]); |
+ } else { |
+ pipelineBuilder.setUserStencil(userStencilSettings); |
+ } |
+ if (passCount > 1) { |
+ pipelineBuilder.setDisableColorXPFactory(); |
+ } |
+ |
+ drawContext->drawBatch(pipelineBuilder, clip, batch); |
} |
} |
return true; |
@@ -711,7 +717,8 @@ bool GrMSAAPathRenderer::onCanDrawPath(const CanDrawPathArgs& args) const { |
} |
bool GrMSAAPathRenderer::onDrawPath(const DrawPathArgs& args) { |
- GR_AUDIT_TRAIL_AUTO_FRAME(args.fTarget->getAuditTrail(), "GrMSAAPathRenderer::onDrawPath"); |
+ GR_AUDIT_TRAIL_AUTO_FRAME(args.fDrawContext->auditTrail(), |
+ "GrMSAAPathRenderer::onDrawPath"); |
SkPath tmpPath; |
const SkPath* path; |
if (args.fStyle->applies()) { |
@@ -727,8 +734,9 @@ bool GrMSAAPathRenderer::onDrawPath(const DrawPathArgs& args) { |
} else { |
path = args.fPath; |
} |
- return this->internalDrawPath(args.fTarget, |
- args.fPipelineBuilder, |
+ return this->internalDrawPath(args.fDrawContext, |
+ *args.fPaint, |
+ args.fUserStencilSettings, |
*args.fClip, |
args.fColor, |
*args.fViewMatrix, |
@@ -737,11 +745,23 @@ bool GrMSAAPathRenderer::onDrawPath(const DrawPathArgs& args) { |
} |
void GrMSAAPathRenderer::onStencilPath(const StencilPathArgs& args) { |
- GR_AUDIT_TRAIL_AUTO_FRAME(args.fTarget->getAuditTrail(),"GrMSAAPathRenderer::onStencilPath"); |
+ GR_AUDIT_TRAIL_AUTO_FRAME(args.fDrawContext->auditTrail(), |
+ "GrMSAAPathRenderer::onStencilPath"); |
SkASSERT(SkPath::kInverseEvenOdd_FillType != args.fPath->getFillType()); |
SkASSERT(SkPath::kInverseWinding_FillType != args.fPath->getFillType()); |
- this->internalDrawPath(args.fTarget, args.fPipelineBuilder, *args.fClip, GrColor_WHITE, |
- *args.fViewMatrix, *args.fPath, true); |
+ |
+ GrPaint paint; |
+ paint.setXPFactory(GrDisableColorXPFactory::Create()); |
bungeman-skia
2016/06/03 23:57:03
leak
|
+ paint.setAntiAlias(args.fIsAA); |
+ |
+ this->internalDrawPath(args.fDrawContext, |
+ paint, |
+ &GrUserStencilSettings::kUnused, |
+ *args.fClip, |
+ GrColor_WHITE, |
+ *args.fViewMatrix, |
+ *args.fPath, |
+ true); |
} |
/////////////////////////////////////////////////////////////////////////////////////////////////// |