Index: src/gpu/GrDrawContext.cpp |
diff --git a/src/gpu/GrDrawContext.cpp b/src/gpu/GrDrawContext.cpp |
index ec26672b37286b5589214ea248bff558a65440c7..9c07211754a885f80e73b4b874e0dcd7cacb4b0f 100644 |
--- a/src/gpu/GrDrawContext.cpp |
+++ b/src/gpu/GrDrawContext.cpp |
@@ -225,6 +225,14 @@ static inline bool rect_contains_inclusive(const SkRect& rect, const SkPoint& po |
point.fY >= rect.fTop && point.fY <= rect.fBottom; |
} |
+static bool view_matrix_ok_for_aa_fill_rect(const SkMatrix& viewMatrix) { |
+ return viewMatrix.preservesRightAngles(); |
+} |
+ |
+static bool should_apply_coverage_aa(const GrPaint& paint, GrRenderTarget* rt) { |
+ return paint.isAntiAlias() && !rt->isUnifiedMultisampled(); |
+} |
+ |
void GrDrawContext::drawRect(const GrClip& clip, |
const GrPaint& paint, |
const SkMatrix& viewMatrix, |
@@ -282,13 +290,13 @@ void GrDrawContext::drawRect(const GrClip& clip, |
} |
GrColor color = paint.getColor(); |
- bool needAA = paint.isAntiAlias() && |
- !pipelineBuilder.getRenderTarget()->isUnifiedMultisampled(); |
+ bool needAA = should_apply_coverage_aa(paint, pipelineBuilder.getRenderTarget()); |
// The fill path can handle rotation but not skew |
// The stroke path needs the rect to remain axis aligned (no rotation or skew) |
// None of our AA draw rect calls can handle perspective yet |
- bool canApplyAA = width >=0 ? viewMatrix.rectStaysRect() : viewMatrix.preservesRightAngles(); |
+ bool canApplyAA = width >=0 ? viewMatrix.rectStaysRect() : |
+ view_matrix_ok_for_aa_fill_rect(viewMatrix); |
if (needAA && canApplyAA) { |
SkASSERT(!viewMatrix.hasPerspective()); |
@@ -333,11 +341,20 @@ void GrDrawContext::fillRectToRect(const GrClip& clip, |
AutoCheckFlush acf(fDrawingManager); |
GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
- this->getDrawTarget()->drawNonAARect(pipelineBuilder, |
- paint.getColor(), |
- viewMatrix, |
- rectToDraw, |
- localRect); |
+ if (should_apply_coverage_aa(paint, fRenderTarget) && |
+ view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
+ SkAutoTUnref<GrDrawBatch> batch(GrAAFillRectBatch::CreateWithLocalRect( |
+ paint.getColor(), viewMatrix, rectToDraw, localRect)); |
+ if (batch) { |
+ this->drawBatch(&pipelineBuilder, batch); |
+ } |
+ } else { |
+ this->getDrawTarget()->drawNonAARect(pipelineBuilder, |
+ paint.getColor(), |
+ viewMatrix, |
+ rectToDraw, |
+ localRect); |
+ } |
} |
void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip, |
@@ -351,11 +368,18 @@ void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip, |
AutoCheckFlush acf(fDrawingManager); |
GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
- this->getDrawTarget()->drawNonAARect(pipelineBuilder, |
- paint.getColor(), |
- viewMatrix, |
- rectToDraw, |
- localMatrix); |
+ if (should_apply_coverage_aa(paint, pipelineBuilder.getRenderTarget()) && |
+ view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
+ SkAutoTUnref<GrDrawBatch> batch(GrAAFillRectBatch::Create( |
+ paint.getColor(), viewMatrix, localMatrix, rectToDraw)); |
+ this->drawBatch(&pipelineBuilder, batch); |
+ } else { |
+ this->getDrawTarget()->drawNonAARect(pipelineBuilder, |
+ paint.getColor(), |
+ viewMatrix, |
+ rectToDraw, |
+ localMatrix); |
+ } |
} |
void GrDrawContext::drawVertices(const GrClip& clip, |
@@ -632,8 +656,7 @@ void GrDrawContext::drawPath(const GrClip& clip, |
GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
if (!strokeInfo.isDashed()) { |
- bool useCoverageAA = paint.isAntiAlias() && |
- !pipelineBuilder.getRenderTarget()->isUnifiedMultisampled(); |
+ bool useCoverageAA = should_apply_coverage_aa(paint, pipelineBuilder.getRenderTarget()); |
if (useCoverageAA && strokeInfo.getWidth() < 0 && !path.isConvex()) { |
// Concave AA paths are expensive - try to avoid them for special cases |