| Index: src/gpu/GrContext.cpp
|
| diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
|
| index b0d34fd03933af6e531ca3b4ae78fbd723477cc7..cab4414ae256e1a28813d55ee8957268fbdd0e16 100644
|
| --- a/src/gpu/GrContext.cpp
|
| +++ b/src/gpu/GrContext.cpp
|
| @@ -43,10 +43,6 @@ SK_CONF_DECLARE(bool, c_Defer, "gpu.deferContext", true,
|
|
|
| #define BUFFERED_DRAW (c_Defer ? kYes_BufferedDraw : kNo_BufferedDraw)
|
|
|
| -// When we're using coverage AA but the blend is incompatible (given gpu
|
| -// limitations) should we disable AA or draw wrong?
|
| -#define DISABLE_COVERAGE_AA_FOR_BLEND 1
|
| -
|
| #ifdef SK_DEBUG
|
| // change this to a 1 to see notifications when partial coverage fails
|
| #define GR_DEBUG_PARTIAL_COVERAGE_CHECK 0
|
| @@ -695,14 +691,6 @@ void GrContext::dumpFontCache() const {
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|
| -namespace {
|
| -inline bool disable_coverage_aa_for_blend(GrDrawTarget* target) {
|
| - return DISABLE_COVERAGE_AA_FOR_BLEND && !target->canApplyCoverage();
|
| -}
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -
|
| /* create a triangle strip that strokes the specified triangle. There are 8
|
| unique vertices, but we repreat the last 2 to close up. Alternatively we
|
| could use an indices array, and then only send 8 verts, but not sure that
|
| @@ -746,7 +734,7 @@ static bool apply_aa_to_rect(GrDrawTarget* target,
|
| // TODO: remove this ugliness when we drop the fixed-pipe impl
|
| *useVertexCoverage = false;
|
| if (!target->getDrawState().canTweakAlphaForCoverage()) {
|
| - if (disable_coverage_aa_for_blend(target)) {
|
| + if (target->shouldDisableCoverageAAForBlend()) {
|
| #ifdef SK_DEBUG
|
| //GrPrintf("Turning off AA to correctly apply blend.\n");
|
| #endif
|
| @@ -1034,14 +1022,10 @@ void GrContext::drawRRect(const GrPaint& paint,
|
| AutoCheckFlush acf(this);
|
| GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf);
|
|
|
| - bool useAA = paint.isAntiAlias() &&
|
| - !target->getDrawState().getRenderTarget()->isMultisampled() &&
|
| - !disable_coverage_aa_for_blend(target);
|
| -
|
| - if (!fOvalRenderer->drawSimpleRRect(target, this, useAA, rect, stroke)) {
|
| + if (!fOvalRenderer->drawSimpleRRect(target, this, paint.isAntiAlias(), rect, stroke)) {
|
| SkPath path;
|
| path.addRRect(rect);
|
| - this->internalDrawPath(target, useAA, path, stroke);
|
| + this->internalDrawPath(target, paint.isAntiAlias(), path, stroke);
|
| }
|
| }
|
|
|
| @@ -1058,14 +1042,10 @@ void GrContext::drawOval(const GrPaint& paint,
|
| AutoCheckFlush acf(this);
|
| GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf);
|
|
|
| - bool useAA = paint.isAntiAlias() &&
|
| - !target->getDrawState().getRenderTarget()->isMultisampled() &&
|
| - !disable_coverage_aa_for_blend(target);
|
| -
|
| - if (!fOvalRenderer->drawOval(target, this, useAA, oval, stroke)) {
|
| + if (!fOvalRenderer->drawOval(target, this, paint.isAntiAlias(), oval, stroke)) {
|
| SkPath path;
|
| path.addOval(oval);
|
| - this->internalDrawPath(target, useAA, path, stroke);
|
| + this->internalDrawPath(target, paint.isAntiAlias(), path, stroke);
|
| }
|
| }
|
|
|
| @@ -1091,7 +1071,7 @@ static bool is_nested_rects(GrDrawTarget* target,
|
|
|
| *useVertexCoverage = false;
|
| if (!target->getDrawState().canTweakAlphaForCoverage()) {
|
| - if (disable_coverage_aa_for_blend(target)) {
|
| + if (target->shouldDisableCoverageAAForBlend()) {
|
| return false;
|
| } else {
|
| *useVertexCoverage = true;
|
| @@ -1141,15 +1121,17 @@ void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const SkStrok
|
| AutoRestoreEffects are;
|
| AutoCheckFlush acf(this);
|
| GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf);
|
| + GrDrawState* drawState = target->drawState();
|
|
|
| - bool useAA = paint.isAntiAlias() && !target->getDrawState().getRenderTarget()->isMultisampled();
|
| - if (useAA && stroke.getWidth() < 0 && !path.isConvex()) {
|
| + bool useCoverageAA = paint.isAntiAlias() && !drawState->getRenderTarget()->isMultisampled();
|
| +
|
| + if (useCoverageAA && stroke.getWidth() < 0 && !path.isConvex()) {
|
| // Concave AA paths are expensive - try to avoid them for special cases
|
| bool useVertexCoverage;
|
| SkRect rects[2];
|
|
|
| if (is_nested_rects(target, path, stroke, rects, &useVertexCoverage)) {
|
| - SkMatrix origViewMatrix = target->getDrawState().getViewMatrix();
|
| + SkMatrix origViewMatrix = drawState->getViewMatrix();
|
| GrDrawState::AutoViewMatrixRestore avmr;
|
| if (!avmr.setIdentity(target->drawState())) {
|
| return;
|
| @@ -1167,8 +1149,8 @@ void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const SkStrok
|
| bool isOval = path.isOval(&ovalRect);
|
|
|
| if (!isOval || path.isInverseFillType()
|
| - || !fOvalRenderer->drawOval(target, this, useAA, ovalRect, stroke)) {
|
| - this->internalDrawPath(target, useAA, path, stroke);
|
| + || !fOvalRenderer->drawOval(target, this, paint.isAntiAlias(), ovalRect, stroke)) {
|
| + this->internalDrawPath(target, paint.isAntiAlias(), path, stroke);
|
| }
|
| }
|
|
|
| @@ -1180,15 +1162,14 @@ void GrContext::internalDrawPath(GrDrawTarget* target, bool useAA, const SkPath&
|
| // 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.
|
| - if (disable_coverage_aa_for_blend(target)) {
|
| -#ifdef SK_DEBUG
|
| - //GrPrintf("Turning off AA to correctly apply blend.\n");
|
| -#endif
|
| - useAA = false;
|
| - }
|
| + bool useCoverageAA = useAA &&
|
| + !target->getDrawState().getRenderTarget()->isMultisampled() &&
|
| + !target->shouldDisableCoverageAAForBlend();
|
| +
|
|
|
| - GrPathRendererChain::DrawType type = useAA ? GrPathRendererChain::kColorAntiAlias_DrawType :
|
| - GrPathRendererChain::kColor_DrawType;
|
| + GrPathRendererChain::DrawType type =
|
| + useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType :
|
| + GrPathRendererChain::kColor_DrawType;
|
|
|
| const SkPath* pathPtr = &path;
|
| SkPath tmpPath;
|
| @@ -1198,16 +1179,16 @@ void GrContext::internalDrawPath(GrDrawTarget* target, bool useAA, const SkPath&
|
| GrPathRenderer* pr = this->getPathRenderer(*pathPtr, strokeRec, target, false, type);
|
|
|
| if (NULL == pr) {
|
| - if (!strokeRec.isHairlineStyle()) {
|
| + if (!GrPathRenderer::IsStrokeHairlineOrEquivalent(strokeRec, this->getMatrix(), NULL)) {
|
| // It didn't work the 1st time, so try again with the stroked path
|
| if (strokeRec.applyToPath(&tmpPath, *pathPtr)) {
|
| pathPtr = &tmpPath;
|
| strokeRec.setFillStyle();
|
| + if (pathPtr->isEmpty()) {
|
| + return;
|
| + }
|
| }
|
| }
|
| - if (pathPtr->isEmpty()) {
|
| - return;
|
| - }
|
|
|
| // This time, allow SW renderer
|
| pr = this->getPathRenderer(*pathPtr, strokeRec, target, true, type);
|
| @@ -1220,7 +1201,7 @@ void GrContext::internalDrawPath(GrDrawTarget* target, bool useAA, const SkPath&
|
| return;
|
| }
|
|
|
| - pr->drawPath(*pathPtr, strokeRec, target, useAA);
|
| + pr->drawPath(*pathPtr, strokeRec, target, useCoverageAA);
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|