| Index: src/gpu/GrDrawContext.cpp
|
| diff --git a/src/gpu/GrDrawContext.cpp b/src/gpu/GrDrawContext.cpp
|
| index e5064f0454af37db684260a4cdfdf6746a6b8eaf..628b4b2fb2fd4cdeaadd8916dab97a3159d69061 100644
|
| --- a/src/gpu/GrDrawContext.cpp
|
| +++ b/src/gpu/GrDrawContext.cpp
|
| @@ -229,10 +229,10 @@ void GrDrawContext::drawPaint(const GrClip& clip,
|
|
|
| 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);
|
| }
|
| }
|
| @@ -265,7 +265,7 @@ void GrDrawContext::drawRect(const GrClip& clip,
|
|
|
| AutoCheckFlush acf(fDrawingManager);
|
|
|
| - SkScalar width = nullptr == strokeInfo ? -1 : strokeInfo->getWidth();
|
| + SkScalar width = !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.
|
| @@ -301,15 +301,13 @@ void GrDrawContext::drawRect(const GrClip& clip,
|
| }
|
| }
|
|
|
| - GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| - GrColor color = paint.getColor();
|
| -
|
| + bool snapToPixelCenters = false;
|
| 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(color, viewMatrix, rect,
|
| + batch.reset(GrRectBatchFactory::CreateAAStroke(paint.getColor(), viewMatrix, rect,
|
| *strokeInfo));
|
| }
|
| } else {
|
| @@ -317,34 +315,42 @@ void GrDrawContext::drawRect(const GrClip& clip,
|
| if (view_matrix_ok_for_aa_fill_rect(viewMatrix)) {
|
| SkRect devBoundRect;
|
| viewMatrix.mapRect(&devBoundRect, rect);
|
| - batch.reset(GrRectBatchFactory::CreateAAFill(color, viewMatrix, rect,
|
| + batch.reset(GrRectBatchFactory::CreateAAFill(paint.getColor(), 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
|
| - bool snapToPixelCenters = (0 == width && !fRenderTarget->isUnifiedMultisampled());
|
| - batch.reset(GrRectBatchFactory::CreateNonAAStroke(color, viewMatrix, rect, width,
|
| - snapToPixelCenters));
|
| + snapToPixelCenters = (0 == width && !fRenderTarget->isUnifiedMultisampled());
|
| + batch.reset(GrRectBatchFactory::CreateNonAAStroke(paint.getColor(), 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.
|
| - pipelineBuilder.setState(GrPipelineBuilder::kSnapVerticesToPixelCenters_Flag,
|
| - snapToPixelCenters);
|
| + // 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.
|
| } else {
|
| // filled BW rect
|
| - batch.reset(GrRectBatchFactory::CreateNonAAFill(color, viewMatrix, rect, nullptr, nullptr));
|
| + batch.reset(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMatrix, rect,
|
| + nullptr, nullptr));
|
| }
|
| - this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
|
| +
|
| + 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());
|
| }
|
|
|
| void GrDrawContext::fillRectToRect(const GrClip& clip,
|
| @@ -359,7 +365,6 @@ void GrDrawContext::fillRectToRect(const GrClip& clip,
|
|
|
| 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)) {
|
| @@ -371,6 +376,7 @@ void GrDrawContext::fillRectToRect(const GrClip& clip,
|
| }
|
|
|
| if (batch) {
|
| + GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| this->drawBatch(&pipelineBuilder, batch);
|
| }
|
| }
|
| @@ -387,8 +393,6 @@ void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip,
|
|
|
| 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)) {
|
| @@ -398,6 +402,8 @@ void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip,
|
| batch.reset(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMatrix, rectToDraw,
|
| nullptr, &localMatrix));
|
| }
|
| +
|
| + GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
|
| }
|
|
|
| @@ -418,8 +424,6 @@ void GrDrawContext::drawVertices(const GrClip& clip,
|
|
|
| AutoCheckFlush acf(fDrawingManager);
|
|
|
| - GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| -
|
| // TODO clients should give us bounds
|
| SkRect bounds;
|
| if (!bounds.setBoundsCheck(positions, vertexCount)) {
|
| @@ -444,6 +448,7 @@ void GrDrawContext::drawVertices(const GrClip& clip,
|
| indexCount, colors, texCoords,
|
| bounds));
|
|
|
| + GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
|
| }
|
|
|
| @@ -462,14 +467,13 @@ void GrDrawContext::drawAtlas(const GrClip& clip,
|
| 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);
|
| }
|
|
|
| @@ -493,18 +497,16 @@ void GrDrawContext::drawRRect(const GrClip& clip,
|
|
|
| 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(color,
|
| + SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateRRectBatch(paint.getColor(),
|
| viewMatrix,
|
| rrect,
|
| strokeInfo,
|
| shaderCaps));
|
| if (batch) {
|
| + GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
|
| return;
|
| }
|
| @@ -513,8 +515,7 @@ void GrDrawContext::drawRRect(const GrClip& clip,
|
| SkPath path;
|
| path.setIsVolatile(true);
|
| path.addRRect(rrect);
|
| - this->internalDrawPath(&pipelineBuilder, viewMatrix, color,
|
| - paint.isAntiAlias(), path, strokeInfo);
|
| + this->internalDrawPath(clip, paint, viewMatrix, path, strokeInfo);
|
| }
|
|
|
| bool GrDrawContext::drawFilledDRRect(const GrClip& clip,
|
| @@ -600,8 +601,7 @@ void GrDrawContext::drawDRRect(const GrClip& clip,
|
| path.setFillType(SkPath::kEvenOdd_FillType);
|
|
|
| GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| - this->internalDrawPath(&pipelineBuilder, viewMatrix, paint.getColor(),
|
| - paint.isAntiAlias(), path, GrStrokeInfo::FillInfo());
|
| + this->internalDrawPath(clip, paint, viewMatrix, path, GrStrokeInfo::FillInfo());
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| @@ -624,17 +624,15 @@ void GrDrawContext::drawOval(const GrClip& clip,
|
|
|
| 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(color,
|
| + SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateOvalBatch(paint.getColor(),
|
| viewMatrix,
|
| oval,
|
| strokeInfo,
|
| shaderCaps));
|
| if (batch) {
|
| + GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
|
| return;
|
| }
|
| @@ -643,8 +641,7 @@ void GrDrawContext::drawOval(const GrClip& clip,
|
| SkPath path;
|
| path.setIsVolatile(true);
|
| path.addOval(oval);
|
| - this->internalDrawPath(&pipelineBuilder, viewMatrix, color,
|
| - paint.isAntiAlias(), path, strokeInfo);
|
| + this->internalDrawPath(clip, paint, viewMatrix, path, strokeInfo);
|
| }
|
|
|
| void GrDrawContext::drawImageNine(const GrClip& clip,
|
| @@ -762,16 +759,8 @@ void GrDrawContext::drawPath(const GrClip& clip,
|
| return;
|
| }
|
|
|
| - 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
|
| @@ -779,7 +768,9 @@ void GrDrawContext::drawPath(const GrClip& clip,
|
|
|
| if (is_nested_rects(viewMatrix, path, strokeInfo, rects)) {
|
| SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateAAFillNestedRects(
|
| - color, viewMatrix, rects));
|
| + paint.getColor(), viewMatrix, rects));
|
| +
|
| + GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
|
| return;
|
| }
|
| @@ -789,25 +780,30 @@ void GrDrawContext::drawPath(const GrClip& clip,
|
|
|
| if (isOval && !path.isInverseFillType()) {
|
| GrShaderCaps* shaderCaps = fContext->caps()->shaderCaps();
|
| - SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateOvalBatch(color,
|
| + SkAutoTUnref<GrDrawBatch> batch(GrOvalRenderer::CreateOvalBatch(paint.getColor(),
|
| viewMatrix,
|
| ovalRect,
|
| strokeInfo,
|
| shaderCaps));
|
| if (batch) {
|
| + GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| this->getDrawTarget()->drawBatch(pipelineBuilder, batch);
|
| return;
|
| }
|
| }
|
| }
|
| - this->internalDrawPath(&pipelineBuilder, viewMatrix, color,
|
| - paint.isAntiAlias(), path, strokeInfo);
|
| +
|
| + // 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(GrPipelineBuilder* pipelineBuilder,
|
| +void GrDrawContext::internalDrawPath(const GrClip& clip,
|
| + const GrPaint& paint,
|
| const SkMatrix& viewMatrix,
|
| - GrColor color,
|
| - bool useAA,
|
| const SkPath& path,
|
| const GrStrokeInfo& strokeInfo) {
|
| ASSERT_SINGLE_OWNER
|
| @@ -818,10 +814,9 @@ void GrDrawContext::internalDrawPath(GrPipelineBuilder* pipelineBuilder,
|
| // 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 = useAA &&
|
| - !pipelineBuilder->getRenderTarget()->isUnifiedMultisampled();
|
| - bool isStencilDisabled = pipelineBuilder->getStencil().isDisabled();
|
| - bool isStencilBufferMSAA = pipelineBuilder->getRenderTarget()->isStencilBufferMultisampled();
|
| + bool useCoverageAA = should_apply_coverage_aa(paint, fRenderTarget);
|
| + const bool isStencilDisabled = true;
|
| + bool isStencilBufferMSAA = fRenderTarget->isStencilBufferMultisampled();
|
|
|
| const GrPathRendererChain::DrawType type =
|
| useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType
|
| @@ -894,11 +889,13 @@ void GrDrawContext::internalDrawPath(GrPipelineBuilder* pipelineBuilder,
|
| return;
|
| }
|
|
|
| + GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip);
|
| +
|
| GrPathRenderer::DrawPathArgs args;
|
| args.fTarget = this->getDrawTarget();
|
| args.fResourceProvider = fDrawingManager->getContext()->resourceProvider();
|
| - args.fPipelineBuilder = pipelineBuilder;
|
| - args.fColor = color;
|
| + args.fPipelineBuilder = &pipelineBuilder;
|
| + args.fColor = paint.getColor();
|
| args.fViewMatrix = &viewMatrix;
|
| args.fPath = pathPtr;
|
| args.fStroke = strokeInfoPtr;
|
|
|