Index: src/gpu/batches/GrTessellatingPathRenderer.cpp |
diff --git a/src/gpu/batches/GrTessellatingPathRenderer.cpp b/src/gpu/batches/GrTessellatingPathRenderer.cpp |
index e697f78d7218e2a6d36f8c06f3b0fce3ce1c69be..f8f5db3af0da4908d3794220ee79157892977098 100644 |
--- a/src/gpu/batches/GrTessellatingPathRenderer.cpp |
+++ b/src/gpu/batches/GrTessellatingPathRenderer.cpp |
@@ -105,11 +105,14 @@ GrTessellatingPathRenderer::GrTessellatingPathRenderer() { |
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. 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) && |
+ // 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() && |
!args.fStyle->strokeRec().isHairlineStyle() && |
- !args.fStyle->hasNonDashPathEffect() && !args.fAntiAlias && !args.fPath->isConvex(); |
+ !args.fStyle->hasNonDashPathEffect() && |
+ !IsStrokeHairlineOrEquivalent(*args.fStyle, *args.fViewMatrix, nullptr) && |
+ !args.fPath->isConvex(); |
} |
class TessellatingPathBatch : public GrVertexBatch { |
@@ -160,25 +163,25 @@ private: |
int clipBoundsCnt = |
fPath.isInverseFillType() ? sizeof(fClipBounds) / sizeof(uint32_t) : 0; |
int styleDataCnt = GrStyle::KeySize(fStyle, GrStyle::Apply::kPathEffectAndStrokeRec); |
- 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; |
- } |
+ // 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; |
} |
SkPath path; |