Index: src/gpu/GrClipMaskManager.cpp |
diff --git a/src/gpu/GrClipMaskManager.cpp b/src/gpu/GrClipMaskManager.cpp |
index 83b3b01159b99fd61687f94114be9a0aaa09b447..8a7aac247aaaf8ea45ff892c6391eac97d7406a8 100644 |
--- a/src/gpu/GrClipMaskManager.cpp |
+++ b/src/gpu/GrClipMaskManager.cpp |
@@ -94,13 +94,13 @@ bool GrClipMaskManager::useSWOnlyPath(const ElementList& elements) { |
for (ElementList::Iter iter(elements.headIter()); iter.get(); iter.next()) { |
const Element* element = iter.get(); |
// rects can always be drawn directly w/o using the software path |
- // so only paths need to be checked |
- if (Element::kPath_Type == element->getType() && |
- path_needs_SW_renderer(this->getContext(), fGpu, |
- element->getPath(), |
- stroke, |
- element->isAA())) { |
- return true; |
+ // Skip rrects once we're drawing them directly. |
+ if (Element::kRect_Type != element->getType()) { |
+ SkPath path; |
+ element->asPath(&path); |
+ if (path_needs_SW_renderer(this->getContext(), fGpu, path, stroke, element->isAA())) { |
+ return true; |
+ } |
} |
} |
return false; |
@@ -169,10 +169,11 @@ bool GrClipMaskManager::setupClipping(const GrClipData* clipDataIn, |
return true; |
} |
} |
+ Element::Type type = elements.tail()->getType(); |
+ bool isAA = GR_AA_CLIP && elements.tail()->isAA(); |
SkAutoTUnref<GrEffectRef> effect; |
- if (SkClipStack::Element::kPath_Type == elements.tail()->getType()) { |
+ if (SkClipStack::Element::kPath_Type == type) { |
const SkPath& path = elements.tail()->getPath(); |
- bool isAA = GR_AA_CLIP && elements.tail()->isAA(); |
if (rt->isMultisampled()) { |
// A coverage effect for AA clipping won't play nicely with MSAA. |
if (!isAA) { |
@@ -188,13 +189,12 @@ bool GrClipMaskManager::setupClipping(const GrClipData* clipDataIn, |
GrConvexPolyEffect::kFillNoAA_EdgeType; |
effect.reset(GrConvexPolyEffect::Create(type, path, &offset)); |
} |
- } else if (GR_AA_CLIP && elements.tail()->isAA() && !rt->isMultisampled()) { |
+ } else if (isAA && SkClipStack::Element::kRect_Type == type && !rt->isMultisampled()) { |
// We only handle AA/non-MSAA rects here. Coverage effect AA isn't MSAA friendly and |
// non-AA rect clips are handled by the scissor. |
- SkASSERT(SkClipStack::Element::kRect_Type == elements.tail()->getType()); |
SkRect rect = elements.tail()->getRect(); |
SkVector offset = { SkIntToScalar(-clipDataIn->fOrigin.fX), |
- SkIntToScalar(-clipDataIn->fOrigin.fY) }; |
+ SkIntToScalar(-clipDataIn->fOrigin.fY) }; |
rect.offset(offset); |
effect.reset(GrConvexPolyEffect::CreateForAAFillRect(rect)); |
// This should never fail. |
@@ -332,7 +332,11 @@ bool GrClipMaskManager::drawElement(GrTexture* target, |
drawState->setRenderTarget(target->asRenderTarget()); |
+ // TODO: Draw rrects directly here. |
switch (element->getType()) { |
+ case Element::kEmpty_Type: |
+ SkDEBUGFAIL("Should never get here with an empty element."); |
+ break; |
case Element::kRect_Type: |
// TODO: Do rects directly to the accumulator using a aa-rect GrEffect that covers the |
// entire mask bounds and writes 0 outside the rect. |
@@ -347,28 +351,25 @@ bool GrClipMaskManager::drawElement(GrTexture* target, |
fGpu->drawSimpleRect(element->getRect(), NULL); |
} |
return true; |
- case Element::kPath_Type: { |
- SkTCopyOnFirstWrite<SkPath> path(element->getPath()); |
- if (path->isInverseFillType()) { |
- path.writable()->toggleInverseFillType(); |
+ default: { |
+ SkPath path; |
+ element->asPath(&path); |
+ if (path.isInverseFillType()) { |
+ path.toggleInverseFillType(); |
} |
SkStrokeRec stroke(SkStrokeRec::kFill_InitStyle); |
if (NULL == pr) { |
GrPathRendererChain::DrawType type; |
type = element->isAA() ? GrPathRendererChain::kColorAntiAlias_DrawType : |
GrPathRendererChain::kColor_DrawType; |
- pr = this->getContext()->getPathRenderer(*path, stroke, fGpu, false, type); |
+ pr = this->getContext()->getPathRenderer(path, stroke, fGpu, false, type); |
} |
if (NULL == pr) { |
return false; |
} |
- pr->drawPath(element->getPath(), stroke, fGpu, element->isAA()); |
+ pr->drawPath(path, stroke, fGpu, element->isAA()); |
break; |
} |
- default: |
- // something is wrong if we're trying to draw an empty element. |
- GrCrash("Unexpected element type"); |
- return false; |
} |
return true; |
} |
@@ -379,25 +380,22 @@ bool GrClipMaskManager::canStencilAndDrawElement(GrTexture* target, |
GrDrawState* drawState = fGpu->drawState(); |
drawState->setRenderTarget(target->asRenderTarget()); |
- switch (element->getType()) { |
- case Element::kRect_Type: |
- return true; |
- case Element::kPath_Type: { |
- SkTCopyOnFirstWrite<SkPath> path(element->getPath()); |
- if (path->isInverseFillType()) { |
- path.writable()->toggleInverseFillType(); |
- } |
- SkStrokeRec stroke(SkStrokeRec::kFill_InitStyle); |
- GrPathRendererChain::DrawType type = element->isAA() ? |
- GrPathRendererChain::kStencilAndColorAntiAlias_DrawType : |
- GrPathRendererChain::kStencilAndColor_DrawType; |
- *pr = this->getContext()->getPathRenderer(*path, stroke, fGpu, false, type); |
- return NULL != *pr; |
+ if (Element::kRect_Type == element->getType()) { |
+ return true; |
+ } else { |
+ // We shouldn't get here with an empty clip element. |
+ SkASSERT(Element::kEmpty_Type != element->getType()); |
+ SkPath path; |
+ element->asPath(&path); |
+ if (path.isInverseFillType()) { |
+ path.toggleInverseFillType(); |
} |
- default: |
- // something is wrong if we're trying to draw an empty element. |
- GrCrash("Unexpected element type"); |
- return false; |
+ SkStrokeRec stroke(SkStrokeRec::kFill_InitStyle); |
+ GrPathRendererChain::DrawType type = element->isAA() ? |
+ GrPathRendererChain::kStencilAndColorAntiAlias_DrawType : |
+ GrPathRendererChain::kStencilAndColor_DrawType; |
+ *pr = this->getContext()->getPathRenderer(path, stroke, fGpu, false, type); |
+ return NULL != *pr; |
} |
} |
@@ -700,18 +698,17 @@ bool GrClipMaskManager::createStencilClipMask(int32_t elementsGenID, |
SkRegion::Op op = element->getOp(); |
GrPathRenderer* pr = NULL; |
- SkTCopyOnFirstWrite<SkPath> clipPath; |
+ SkPath clipPath; |
if (Element::kRect_Type == element->getType()) { |
stencilSupport = GrPathRenderer::kNoRestriction_StencilSupport; |
fillInverted = false; |
} else { |
- SkASSERT(Element::kPath_Type == element->getType()); |
- clipPath.init(element->getPath()); |
- fillInverted = clipPath->isInverseFillType(); |
+ element->asPath(&clipPath); |
+ fillInverted = clipPath.isInverseFillType(); |
if (fillInverted) { |
- clipPath.writable()->toggleInverseFillType(); |
+ clipPath.toggleInverseFillType(); |
} |
- pr = this->getContext()->getPathRenderer(*clipPath, |
+ pr = this->getContext()->getPathRenderer(clipPath, |
stroke, |
fGpu, |
false, |
@@ -752,13 +749,12 @@ bool GrClipMaskManager::createStencilClipMask(int32_t elementsGenID, |
*drawState->stencil() = gDrawToStencil; |
fGpu->drawSimpleRect(element->getRect(), NULL); |
} else { |
- SkASSERT(Element::kPath_Type == element->getType()); |
- if (!clipPath->isEmpty()) { |
+ if (!clipPath.isEmpty()) { |
if (canRenderDirectToStencil) { |
*drawState->stencil() = gDrawToStencil; |
- pr->drawPath(*clipPath, stroke, fGpu, false); |
+ pr->drawPath(clipPath, stroke, fGpu, false); |
} else { |
- pr->stencilPath(*clipPath, stroke, fGpu); |
+ pr->stencilPath(clipPath, stroke, fGpu); |
} |
} |
} |
@@ -774,9 +770,8 @@ bool GrClipMaskManager::createStencilClipMask(int32_t elementsGenID, |
SET_RANDOM_COLOR |
fGpu->drawSimpleRect(element->getRect(), NULL); |
} else { |
- SkASSERT(Element::kPath_Type == element->getType()); |
SET_RANDOM_COLOR |
- pr->drawPath(*clipPath, stroke, fGpu, false); |
+ pr->drawPath(clipPath, stroke, fGpu, false); |
} |
} else { |
SET_RANDOM_COLOR |