| Index: src/gpu/batches/GrTessellatingPathRenderer.cpp
|
| diff --git a/src/gpu/batches/GrTessellatingPathRenderer.cpp b/src/gpu/batches/GrTessellatingPathRenderer.cpp
|
| index f8f5db3af0da4908d3794220ee79157892977098..e697f78d7218e2a6d36f8c06f3b0fce3ce1c69be 100644
|
| --- a/src/gpu/batches/GrTessellatingPathRenderer.cpp
|
| +++ b/src/gpu/batches/GrTessellatingPathRenderer.cpp
|
| @@ -105,14 +105,11 @@
|
| bool GrTessellatingPathRenderer::onCanDrawPath(const CanDrawPathArgs& args) const {
|
| // This path renderer can draw all fill styles, all stroke styles except hairlines, but does
|
| // not do antialiasing. It can do convex and concave paths, but we'll leave the convex ones to
|
| - // simpler algorithms. Similarly, we skip the non-hairlines that can be treated as hairline.
|
| - // An arbitrary path effect could produce a hairline result so we pass on those. We also skip
|
| - // volatile paths since they are not cacheable.
|
| - return !args.fAntiAlias && !args.fPath->isVolatile() &&
|
| + // simpler algorithms. Similary, we skip the non-hairlines that can be treated as hairline.
|
| + // An arbitrary path effect could produce a hairline result so we pass on those.
|
| + return !IsStrokeHairlineOrEquivalent(*args.fStyle, *args.fViewMatrix, nullptr) &&
|
| !args.fStyle->strokeRec().isHairlineStyle() &&
|
| - !args.fStyle->hasNonDashPathEffect() &&
|
| - !IsStrokeHairlineOrEquivalent(*args.fStyle, *args.fViewMatrix, nullptr) &&
|
| - !args.fPath->isConvex();
|
| + !args.fStyle->hasNonDashPathEffect() && !args.fAntiAlias && !args.fPath->isConvex();
|
| }
|
|
|
| class TessellatingPathBatch : public GrVertexBatch {
|
| @@ -163,25 +160,25 @@
|
| int clipBoundsCnt =
|
| fPath.isInverseFillType() ? sizeof(fClipBounds) / sizeof(uint32_t) : 0;
|
| int styleDataCnt = GrStyle::KeySize(fStyle, GrStyle::Apply::kPathEffectAndStrokeRec);
|
| - // We should have excluded anything we wouldn't know how to cache.
|
| - SkASSERT(styleDataCnt >= 0);
|
| - GrUniqueKey::Builder builder(&key, kDomain, 2 + clipBoundsCnt + styleDataCnt);
|
| - builder[0] = fPath.getGenerationID();
|
| - builder[1] = fPath.getFillType();
|
| - // For inverse fills, the tessellation is dependent on clip bounds.
|
| - if (fPath.isInverseFillType()) {
|
| - memcpy(&builder[2], &fClipBounds, sizeof(fClipBounds));
|
| - }
|
| - if (styleDataCnt) {
|
| - GrStyle::WriteKey(&builder[2 + clipBoundsCnt], fStyle,
|
| - GrStyle::Apply::kPathEffectAndStrokeRec, styleScale);
|
| - }
|
| - builder.finish();
|
| - SkAutoTUnref<GrBuffer> cachedVertexBuffer(rp->findAndRefTByUniqueKey<GrBuffer>(key));
|
| - int actualCount;
|
| - if (cache_match(cachedVertexBuffer.get(), tol, &actualCount)) {
|
| - this->drawVertices(target, gp, cachedVertexBuffer.get(), 0, actualCount);
|
| - return;
|
| + if (styleDataCnt >= 0) {
|
| + GrUniqueKey::Builder builder(&key, kDomain, 2 + clipBoundsCnt + styleDataCnt);
|
| + builder[0] = fPath.getGenerationID();
|
| + builder[1] = fPath.getFillType();
|
| + // For inverse fills, the tessellation is dependent on clip bounds.
|
| + if (fPath.isInverseFillType()) {
|
| + memcpy(&builder[2], &fClipBounds, sizeof(fClipBounds));
|
| + }
|
| + if (styleDataCnt) {
|
| + GrStyle::WriteKey(&builder[2 + clipBoundsCnt], fStyle,
|
| + GrStyle::Apply::kPathEffectAndStrokeRec, styleScale);
|
| + }
|
| + builder.finish();
|
| + SkAutoTUnref<GrBuffer> cachedVertexBuffer(rp->findAndRefTByUniqueKey<GrBuffer>(key));
|
| + int actualCount;
|
| + if (cache_match(cachedVertexBuffer.get(), tol, &actualCount)) {
|
| + this->drawVertices(target, gp, cachedVertexBuffer.get(), 0, actualCount);
|
| + return;
|
| + }
|
| }
|
|
|
| SkPath path;
|
|
|