| Index: src/gpu/GrDrawContext.cpp
|
| diff --git a/src/gpu/GrDrawContext.cpp b/src/gpu/GrDrawContext.cpp
|
| index 9c656a6c474d12e6704776096f24e01fa6d00fe3..b5c28190f2daa1b352bb6d0318db84cdba4db45f 100644
|
| --- a/src/gpu/GrDrawContext.cpp
|
| +++ b/src/gpu/GrDrawContext.cpp
|
| @@ -227,10 +227,10 @@
|
|
|
| AutoCheckFlush acf(fDrawingManager);
|
|
|
| + GrPipelineBuilder pipelineBuilder(*paint, fRenderTarget, clip);
|
| SkAutoTUnref<GrDrawBatch> batch(
|
| GrRectBatchFactory::CreateNonAAFill(paint->getColor(), SkMatrix::I(), r, nullptr,
|
| &localMatrix));
|
| - GrPipelineBuilder pipelineBuilder(*paint, fRenderTarget, clip);
|
| this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
|
| }
|
| }
|
| @@ -263,7 +263,7 @@
|
|
|
| AutoCheckFlush acf(fDrawingManager);
|
|
|
| - SkScalar width = !strokeInfo ? -1 : strokeInfo->getWidth();
|
| + SkScalar width = nullptr == strokeInfo ? -1 : strokeInfo->getWidth();
|
|
|
| // Check if this is a full RT draw and can be replaced with a clear. We don't bother checking
|
| // cases where the RT is fully inside a stroke.
|
| @@ -299,13 +299,15 @@
|
| }
|
| }
|
|
|
| - bool snapToPixelCenters = false;
|
| + GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| + GrColor color = paint.getColor();
|
| +
|
| SkAutoTUnref<GrDrawBatch> batch;
|
| if (should_apply_coverage_aa(paint, fRenderTarget)) {
|
| if (width >= 0) {
|
| // The stroke path needs the rect to remain axis aligned (no rotation or skew).
|
| if (viewMatrix.rectStaysRect()) {
|
| - batch.reset(GrRectBatchFactory::CreateAAStroke(paint.getColor(), viewMatrix, rect,
|
| + batch.reset(GrRectBatchFactory::CreateAAStroke(color, viewMatrix, rect,
|
| *strokeInfo));
|
| }
|
| } else {
|
| @@ -313,42 +315,34 @@
|
| if (view_matrix_ok_for_aa_fill_rect(viewMatrix)) {
|
| SkRect devBoundRect;
|
| viewMatrix.mapRect(&devBoundRect, rect);
|
| - batch.reset(GrRectBatchFactory::CreateAAFill(paint.getColor(), viewMatrix, rect,
|
| + batch.reset(GrRectBatchFactory::CreateAAFill(color, viewMatrix, rect,
|
| devBoundRect));
|
| }
|
| }
|
| + if (!batch) {
|
| + SkPath path;
|
| + path.setIsVolatile(true);
|
| + path.addRect(rect);
|
| + this->internalDrawPath(&pipelineBuilder, viewMatrix, color, true, path, *strokeInfo);
|
| + SkASSERT(paint.isAntiAlias());
|
| + return;
|
| + }
|
| } else if (width >= 0) {
|
| // Non-AA hairlines are snapped to pixel centers to make which pixels are hit deterministic
|
| - snapToPixelCenters = (0 == width && !fRenderTarget->isUnifiedMultisampled());
|
| - batch.reset(GrRectBatchFactory::CreateNonAAStroke(paint.getColor(), viewMatrix, rect,
|
| - width, snapToPixelCenters));
|
| + bool snapToPixelCenters = (0 == width && !fRenderTarget->isUnifiedMultisampled());
|
| + batch.reset(GrRectBatchFactory::CreateNonAAStroke(color, viewMatrix, rect, width,
|
| + snapToPixelCenters));
|
|
|
| // Depending on sub-pixel coordinates and the particular GPU, we may lose a corner of
|
| - // hairline rects. We jam all the vertices to pixel centers to avoid this, but not when
|
| - // MSAA is enabled because it can cause ugly artifacts.
|
| + // hairline rects. We jam all the vertices to pixel centers to avoid this, but not when MSAA
|
| + // is enabled because it can cause ugly artifacts.
|
| + pipelineBuilder.setState(GrPipelineBuilder::kSnapVerticesToPixelCenters_Flag,
|
| + snapToPixelCenters);
|
| } else {
|
| // filled BW rect
|
| - batch.reset(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMatrix, rect,
|
| - nullptr, nullptr));
|
| - }
|
| -
|
| - if (batch) {
|
| - GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| -
|
| - if (snapToPixelCenters) {
|
| - pipelineBuilder.setState(GrPipelineBuilder::kSnapVerticesToPixelCenters_Flag,
|
| - snapToPixelCenters);
|
| - }
|
| -
|
| - this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
|
| - return;
|
| - }
|
| -
|
| - SkPath path;
|
| - path.setIsVolatile(true);
|
| - path.addRect(rect);
|
| - this->internalDrawPath(clip, paint, viewMatrix, path,
|
| - strokeInfo ? *strokeInfo : GrStrokeInfo::FillInfo());
|
| + batch.reset(GrRectBatchFactory::CreateNonAAFill(color, viewMatrix, rect, nullptr, nullptr));
|
| + }
|
| + this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
|
| }
|
|
|
| void GrDrawContext::fillRectToRect(const GrClip& clip,
|
| @@ -363,6 +357,7 @@
|
|
|
| AutoCheckFlush acf(fDrawingManager);
|
|
|
| + GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| SkAutoTUnref<GrDrawBatch> batch;
|
| if (should_apply_coverage_aa(paint, fRenderTarget) &&
|
| view_matrix_ok_for_aa_fill_rect(viewMatrix)) {
|
| @@ -374,7 +369,6 @@
|
| }
|
|
|
| if (batch) {
|
| - GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| this->drawBatch(&pipelineBuilder, batch);
|
| }
|
| }
|
| @@ -390,6 +384,8 @@
|
| GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::fillRectWithLocalMatrix");
|
|
|
| AutoCheckFlush acf(fDrawingManager);
|
| +
|
| + GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
|
|
| SkAutoTUnref<GrDrawBatch> batch;
|
| if (should_apply_coverage_aa(paint, fRenderTarget) &&
|
| @@ -400,8 +396,6 @@
|
| batch.reset(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMatrix, rectToDraw,
|
| nullptr, &localMatrix));
|
| }
|
| -
|
| - GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
|
| }
|
|
|
| @@ -422,6 +416,8 @@
|
|
|
| AutoCheckFlush acf(fDrawingManager);
|
|
|
| + GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| +
|
| // TODO clients should give us bounds
|
| SkRect bounds;
|
| if (!bounds.setBoundsCheck(positions, vertexCount)) {
|
| @@ -446,7 +442,6 @@
|
| indexCount, colors, texCoords,
|
| bounds));
|
|
|
| - GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
|
| }
|
|
|
| @@ -465,13 +460,14 @@
|
| GR_AUDIT_TRAIL_AUTO_FRAME(fAuditTrail, "GrDrawContext::drawAtlas");
|
|
|
| AutoCheckFlush acf(fDrawingManager);
|
| -
|
| +
|
| + GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| +
|
| GrDrawAtlasBatch::Geometry geometry;
|
| geometry.fColor = paint.getColor();
|
| SkAutoTUnref<GrDrawBatch> batch(GrDrawAtlasBatch::Create(geometry, viewMatrix, spriteCount,
|
| xform, texRect, colors));
|
|
|
| - GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
|
| }
|
|
|
| @@ -495,16 +491,18 @@
|
|
|
| AutoCheckFlush acf(fDrawingManager);
|
|
|
| + GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| + GrColor color = paint.getColor();
|
| +
|
| if (should_apply_coverage_aa(paint, fRenderTarget)) {
|
| GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps();
|
|
|
| - SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateRRectBatch(paint.getColor(),
|
| + SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateRRectBatch(color,
|
| viewMatrix,
|
| rrect,
|
| strokeInfo,
|
| shaderCaps));
|
| if (batch) {
|
| - GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
|
| return;
|
| }
|
| @@ -513,7 +511,8 @@
|
| SkPath path;
|
| path.setIsVolatile(true);
|
| path.addRRect(rrect);
|
| - this->internalDrawPath(clip, paint, viewMatrix, path, strokeInfo);
|
| + this->internalDrawPath(&pipelineBuilder, viewMatrix, color,
|
| + paint.isAntiAlias(), path, strokeInfo);
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| @@ -536,15 +535,17 @@
|
|
|
| AutoCheckFlush acf(fDrawingManager);
|
|
|
| + GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| + GrColor color = paint.getColor();
|
| +
|
| if (should_apply_coverage_aa(paint, fRenderTarget)) {
|
| GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps();
|
| - SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateOvalBatch(paint.getColor(),
|
| + SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateOvalBatch(color,
|
| viewMatrix,
|
| oval,
|
| strokeInfo,
|
| shaderCaps));
|
| if (batch) {
|
| - GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
|
| return;
|
| }
|
| @@ -553,7 +554,8 @@
|
| SkPath path;
|
| path.setIsVolatile(true);
|
| path.addOval(oval);
|
| - this->internalDrawPath(clip, paint, viewMatrix, path, strokeInfo);
|
| + this->internalDrawPath(&pipelineBuilder, viewMatrix, color,
|
| + paint.isAntiAlias(), path, strokeInfo);
|
| }
|
|
|
| void GrDrawContext::drawImageNine(const GrClip& clip,
|
| @@ -671,8 +673,16 @@
|
| return;
|
| }
|
|
|
| - AutoCheckFlush acf(fDrawingManager);
|
| -
|
| + GrColor color = paint.getColor();
|
| +
|
| + // Note that internalDrawPath may sw-rasterize the path into a scratch texture.
|
| + // Scratch textures can be recycled after they are returned to the texture
|
| + // cache. This presents a potential hazard for buffered drawing. However,
|
| + // the writePixels that uploads to the scratch will perform a flush so we're
|
| + // OK.
|
| + AutoCheckFlush acf(fDrawingManager);
|
| +
|
| + GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| if (should_apply_coverage_aa(paint, fRenderTarget) && !strokeInfo.isDashed()) {
|
| if (strokeInfo.getWidth() < 0 && !path.isConvex()) {
|
| // Concave AA paths are expensive - try to avoid them for special cases
|
| @@ -680,9 +690,7 @@
|
|
|
| if (is_nested_rects(viewMatrix, path, strokeInfo, rects)) {
|
| SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateAAFillNestedRects(
|
| - paint.getColor(), viewMatrix, rects));
|
| -
|
| - GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| + color, viewMatrix, rects));
|
| this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
|
| return;
|
| }
|
| @@ -692,30 +700,25 @@
|
|
|
| if (isOval && !path.isInverseFillType()) {
|
| GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps();
|
| - SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateOvalBatch(paint.getColor(),
|
| + SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateOvalBatch(color,
|
| viewMatrix,
|
| ovalRect,
|
| strokeInfo,
|
| shaderCaps));
|
| if (batch) {
|
| - GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
|
| return;
|
| }
|
| }
|
| }
|
| -
|
| - // Note that internalDrawPath may sw-rasterize the path into a scratch texture.
|
| - // Scratch textures can be recycled after they are returned to the texture
|
| - // cache. This presents a potential hazard for buffered drawing. However,
|
| - // the writePixels that uploads to the scratch will perform a flush so we're
|
| - // OK.
|
| - this->internalDrawPath(clip, paint, viewMatrix, path, strokeInfo);
|
| -}
|
| -
|
| -void GrDrawContext::internalDrawPath(const GrClip& clip,
|
| - const GrPaint& paint,
|
| + this->internalDrawPath(&pipelineBuilder, viewMatrix, color,
|
| + paint.isAntiAlias(), path, strokeInfo);
|
| +}
|
| +
|
| +void GrDrawContext::internalDrawPath(GrPipelineBuilder* pipelineBuilder,
|
| const SkMatrix& viewMatrix,
|
| + GrColor color,
|
| + bool useAA,
|
| const SkPath& path,
|
| const GrStrokeInfo& strokeInfo) {
|
| ASSERT_SINGLE_OWNER
|
| @@ -726,9 +729,10 @@
|
| // the src color (either the input alpha or in the frag shader) to implement
|
| // 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 = should_apply_coverage_aa(paint, fRenderTarget);
|
| - const bool isStencilDisabled = true;
|
| - bool isStencilBufferMSAA = fRenderTarget->isStencilBufferMultisampled();
|
| + bool useCoverageAA = useAA &&
|
| + !pipelineBuilder->getRenderTarget()->isUnifiedMultisampled();
|
| + bool isStencilDisabled = pipelineBuilder->getStencil().isDisabled();
|
| + bool isStencilBufferMSAA = pipelineBuilder->getRenderTarget()->isStencilBufferMultisampled();
|
|
|
| const GrPathRendererChain::DrawType type =
|
| useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType
|
| @@ -801,13 +805,11 @@
|
| return;
|
| }
|
|
|
| - GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| -
|
| GrPathRenderer::DrawPathArgs args;
|
| args.fTarget = this->getDrawTarget();
|
| args.fResourceProvider = fDrawingManager->getContext()->resourceProvider();
|
| - args.fPipelineBuilder = &pipelineBuilder;
|
| - args.fColor = paint.getColor();
|
| + args.fPipelineBuilder = pipelineBuilder;
|
| + args.fColor = color;
|
| args.fViewMatrix = &viewMatrix;
|
| args.fPath = pathPtr;
|
| args.fStroke = strokeInfoPtr;
|
|
|