diff --git a/src/gpu/ccpr/GrCCAtlas.cpp b/src/gpu/ccpr/GrCCAtlas.cpp
index 94a37e8..4eeddea 100644
--- a/src/gpu/ccpr/GrCCAtlas.cpp
+++ b/src/gpu/ccpr/GrCCAtlas.cpp
@@ -137,9 +137,39 @@
     fUserBatchID = id;
 }
 
+static uint32_t next_atlas_unique_id() {
+    static int32_t nextID;
+    return sk_atomic_inc(&nextID);
+}
+
+const GrUniqueKey& GrCCAtlas::getOrAssignUniqueKey(GrOnFlushResourceProvider* onFlushRP) {
+    static const GrUniqueKey::Domain kAtlasDomain = GrUniqueKey::GenerateDomain();
+
+    if (!fUniqueKey.isValid()) {
+        GrUniqueKey::Builder builder(&fUniqueKey, kAtlasDomain, 1, "CCPR Atlas");
+        builder[0] = next_atlas_unique_id();
+        builder.finish();
+
+        if (fTextureProxy->priv().isInstantiated()) {
+            onFlushRP->assignUniqueKeyToProxy(fUniqueKey, fTextureProxy.get());
+        }
+    }
+    return fUniqueKey;
+}
+
+sk_sp<GrCCAtlas::CachedAtlasInfo> GrCCAtlas::refOrMakeCachedAtlasInfo() {
+    if (!fCachedAtlasInfo) {
+        fCachedAtlasInfo = sk_make_sp<CachedAtlasInfo>();
+    }
+    return fCachedAtlasInfo;
+}
+
 sk_sp<GrRenderTargetContext> GrCCAtlas::makeRenderTargetContext(
         GrOnFlushResourceProvider* onFlushRP) {
     SkASSERT(!fTextureProxy->priv().isInstantiated());  // This method should only be called once.
+    // Caller should have cropped any paths to the destination render target instead of asking for
+    // an atlas larger than maxRenderTargetSize.
+    SkASSERT(SkTMax(fHeight, fWidth) <= fMaxTextureSize);
     SkASSERT(fMaxTextureSize <= onFlushRP->caps()->maxRenderTargetSize());
 
     sk_sp<GrRenderTargetContext> rtc =
@@ -150,6 +180,10 @@
         return nullptr;
     }
 
+    if (fUniqueKey.isValid()) {
+        onFlushRP->assignUniqueKeyToProxy(fUniqueKey, fTextureProxy.get());
+    }
+
     SkIRect clearRect = SkIRect::MakeSize(fDrawBounds);
     rtc->clear(&clearRect, 0, GrRenderTargetContext::CanClearFullscreen::kYes);
     return rtc;
diff --git a/src/gpu/ccpr/GrCCAtlas.h b/src/gpu/ccpr/GrCCAtlas.h
index 6d82728..76d2a98 100644
--- a/src/gpu/ccpr/GrCCAtlas.h
+++ b/src/gpu/ccpr/GrCCAtlas.h
@@ -9,6 +9,8 @@
 #define GrCCAtlas_DEFINED
 
 #include "GrAllocator.h"
+#include "GrNonAtomicRef.h"
+#include "GrResourceKey.h"
 #include "GrTypes.h"
 #include "GrTypesPriv.h"
 #include "SkRefCnt.h"
@@ -18,6 +20,7 @@
 class GrRenderTargetContext;
 class GrTextureProxy;
 struct SkIPoint16;
+struct SkIRect;
 
 /**
  * This class implements a dynamic size GrRectanizer that grows until it reaches the implementation-
@@ -58,6 +61,22 @@
     void setUserBatchID(int id);
     int getUserBatchID() const { return fUserBatchID; }
 
+    // Manages a unique resource cache key that gets assigned to the atlas texture. The unique key
+    // does not get assigned to the texture proxy until it is instantiated.
+    const GrUniqueKey& getOrAssignUniqueKey(GrOnFlushResourceProvider*);
+    const GrUniqueKey& uniqueKey() const { return fUniqueKey; }
+
+    // An object for simple bookkeeping on the atlas texture once it has a unique key. In practice,
+    // we use it to track the percentage of the original atlas pixels that could still ever
+    // potentially be reused (i.e., those which still represent an extant path). When the percentage
+    // of useful pixels drops below 50%, the entire texture is purged from the resource cache.
+    struct CachedAtlasInfo : public GrNonAtomicRef<CachedAtlasInfo> {
+        int fNumPathPixels = 0;
+        int fNumInvalidatedPathPixels = 0;
+        bool fIsPurgedFromResourceCache = false;
+    };
+    sk_sp<CachedAtlasInfo> refOrMakeCachedAtlasInfo();
+
     // Instantiates our texture proxy for the atlas and returns a pre-cleared GrRenderTargetContext
     // that the caller may use to render the content. After this call, it is no longer valid to call
     // addRect(), setUserBatchID(), or this method again.
@@ -74,6 +93,12 @@
     SkISize fDrawBounds = {0, 0};
 
     int fUserBatchID;
+
+    // Not every atlas will have a unique key -- a mainline CCPR one won't if we don't stash any
+    // paths, and only the first atlas in the stack is eligible to be stashed.
+    GrUniqueKey fUniqueKey;
+
+    sk_sp<CachedAtlasInfo> fCachedAtlasInfo;
     sk_sp<GrTextureProxy> fTextureProxy;
 };
 
diff --git a/src/gpu/ccpr/GrCCClipPath.cpp b/src/gpu/ccpr/GrCCClipPath.cpp
index 61d58d4..8629cc2 100644
--- a/src/gpu/ccpr/GrCCClipPath.cpp
+++ b/src/gpu/ccpr/GrCCClipPath.cpp
@@ -48,15 +48,15 @@
     fAccessRect = accessRect;
 }
 
-void GrCCClipPath::accountForOwnPath(GrCCPerFlushResourceSpecs* resourceSpecs) const {
+void GrCCClipPath::accountForOwnPath(GrCCPerFlushResourceSpecs* specs) const {
     SkASSERT(this->isInitialized());
 
-    ++resourceSpecs->fNumClipPaths;
-    resourceSpecs->fParsingPathStats.statPath(fDeviceSpacePath);
+    ++specs->fNumClipPaths;
+    specs->fRenderedPathStats.statPath(fDeviceSpacePath);
 
     SkIRect ibounds;
     if (ibounds.intersect(fAccessRect, fPathDevIBounds)) {
-        resourceSpecs->fAtlasSpecs.accountForSpace(ibounds.width(), ibounds.height());
+        specs->fRenderedAtlasSpecs.accountForSpace(ibounds.width(), ibounds.height());
     }
 }
 
diff --git a/src/gpu/ccpr/GrCCDrawPathsOp.cpp b/src/gpu/ccpr/GrCCDrawPathsOp.cpp
index c38dd76..ad078b2 100644
--- a/src/gpu/ccpr/GrCCDrawPathsOp.cpp
+++ b/src/gpu/ccpr/GrCCDrawPathsOp.cpp
@@ -7,7 +7,6 @@
 
 #include "GrCCDrawPathsOp.h"
 
-#include "GrGpuCommandBuffer.h"
 #include "GrMemoryPool.h"
 #include "GrOpFlushState.h"
 #include "ccpr/GrCCPerFlushResources.h"
@@ -24,23 +23,30 @@
 }
 
 std::unique_ptr<GrCCDrawPathsOp> GrCCDrawPathsOp::Make(GrContext*, const SkIRect& clipIBounds,
-                                                       const SkMatrix& m, const SkPath& path,
+                                                       const SkMatrix& m, const GrShape& shape,
                                                        const SkRect& devBounds, GrPaint&& paint) {
+    bool canStashPathMask = true;
     SkIRect looseClippedIBounds;
     devBounds.roundOut(&looseClippedIBounds);  // GrCCPathParser might find slightly tighter bounds.
-    if (!looseClippedIBounds.intersect(clipIBounds)) {
-        return nullptr;
+    if (!clipIBounds.contains(looseClippedIBounds)) {
+        canStashPathMask = false;
+        if (!looseClippedIBounds.intersect(clipIBounds)) {
+            return nullptr;
+        }
     }
-    return std::unique_ptr<GrCCDrawPathsOp>(
-                   new GrCCDrawPathsOp(looseClippedIBounds, m, path, devBounds, std::move(paint)));
+    return std::unique_ptr<GrCCDrawPathsOp>(new GrCCDrawPathsOp(looseClippedIBounds, m, shape,
+                                                                canStashPathMask, devBounds,
+                                                                std::move(paint)));
 }
 
 GrCCDrawPathsOp::GrCCDrawPathsOp(const SkIRect& looseClippedIBounds, const SkMatrix& m,
-                                 const SkPath& path, const SkRect& devBounds, GrPaint&& paint)
+                                 const GrShape& shape, bool canStashPathMask,
+                                 const SkRect& devBounds, GrPaint&& paint)
         : GrDrawOp(ClassID())
         , fViewMatrixIfUsingLocalCoords(has_coord_transforms(paint) ? m : SkMatrix::I())
         , fSRGBFlags(GrPipeline::SRGBFlagsFromPaint(paint))
-        , fDraws({looseClippedIBounds, m, path, paint.getColor(), nullptr})
+        , fDraws({looseClippedIBounds, m, shape, paint.getColor(), nullptr, nullptr, {0, 0},
+                  canStashPathMask, nullptr})
         , fProcessors(std::move(paint)) {  // Paint must be moved after fetching its color above.
     SkDEBUGCODE(fBaseInstance = -1);
     // FIXME: intersect with clip bounds to (hopefully) improve batching.
@@ -55,18 +61,24 @@
     }
 }
 
+GrCCDrawPathsOp::SingleDraw::~SingleDraw() {
+    if (fCacheEntry) {
+        // All currFlushAtlas references must be reset back to null before the flush is finished.
+        fCacheEntry->setCurrFlushAtlas(nullptr);
+    }
+}
+
 GrDrawOp::RequiresDstTexture GrCCDrawPathsOp::finalize(const GrCaps& caps,
                                                        const GrAppliedClip* clip,
                                                        GrPixelConfigIsClamped dstIsClamped) {
-    // There should only be one single path draw in this Op right now.
-    SkASSERT(1 == fNumDraws);
+    SkASSERT(1 == fNumDraws);  // There should only be one single path draw in this Op right now.
     GrProcessorSet::Analysis analysis =
             fProcessors.finalize(fDraws.head().fColor, GrProcessorAnalysisCoverage::kSingleChannel,
                                  clip, false, caps, dstIsClamped, &fDraws.head().fColor);
-    return analysis.requiresDstTexture() ? RequiresDstTexture::kYes : RequiresDstTexture::kNo;
+    return RequiresDstTexture(analysis.requiresDstTexture());
 }
 
-bool GrCCDrawPathsOp::onCombineIfPossible(GrOp* op, const GrCaps& caps) {
+bool GrCCDrawPathsOp::onCombineIfPossible(GrOp* op, const GrCaps&) {
     GrCCDrawPathsOp* that = op->cast<GrCCDrawPathsOp>();
     SkASSERT(fOwningPerOpListPaths);
     SkASSERT(fNumDraws);
@@ -93,50 +105,158 @@
     fOwningPerOpListPaths = owningPerOpListPaths;
 }
 
-void GrCCDrawPathsOp::accountForOwnPaths(GrCCPerFlushResourceSpecs* resourceSpecs) const {
-    for (const GrCCDrawPathsOp::SingleDraw& draw : fDraws) {
-        ++resourceSpecs->fNumRenderedPaths;
-        resourceSpecs->fParsingPathStats.statPath(draw.fPath);
-        resourceSpecs->fAtlasSpecs.accountForSpace(draw.fLooseClippedIBounds.width(),
+void GrCCDrawPathsOp::accountForOwnPaths(GrCCPathCache* pathCache,
+                                         GrOnFlushResourceProvider* onFlushRP,
+                                         const GrUniqueKey& stashedAtlasKey,
+                                         GrCCPerFlushResourceSpecs* specs) {
+    using CreateIfAbsent = GrCCPathCache::CreateIfAbsent;
+    using MaskTransform = GrCCPathCache::MaskTransform;
+
+    for (SingleDraw& draw : fDraws) {
+        SkASSERT(!draw.fCacheEntry);
+
+        SkPath path;
+        draw.fShape.asPath(&path);
+
+        MaskTransform m(draw.fMatrix, &draw.fCachedMaskShift);
+        draw.fCacheEntry = pathCache->find(draw.fShape, m, CreateIfAbsent(draw.fCanStashPathMask));
+        if (auto cacheEntry = draw.fCacheEntry.get()) {
+            SkASSERT(!cacheEntry->currFlushAtlas());  // Shouldn't be set until setupResources().
+            if (cacheEntry->atlasKey().isValid()) {
+                // Does the path already exist in a cached atlas?
+                if (cacheEntry->hasCachedAtlas() &&
+                    (draw.fCachedAtlasProxy = onFlushRP->findOrCreateProxyByUniqueKey(
+                                                     cacheEntry->atlasKey(),
+                                                     GrCCAtlas::kTextureOrigin))) {
+                    ++specs->fNumCachedPaths;
+                    continue;
+                }
+
+                // Does the path exist in the atlas that we stashed away from last flush? If so we
+                // can copy it into a new 8-bit atlas and keep it in the resource cache.
+                if (stashedAtlasKey.isValid() && stashedAtlasKey == cacheEntry->atlasKey()) {
+                    SkASSERT(!cacheEntry->hasCachedAtlas());
+                    ++specs->fNumCopiedPaths;
+                    specs->fCopyPathStats.statPath(path);
+                    specs->fCopyAtlasSpecs.accountForSpace(cacheEntry->width(),
+                                                           cacheEntry->height());
+                    continue;
+                }
+
+                // Whatever atlas the path used to reside in, it no longer exists.
+                cacheEntry->resetAtlasKeyAndInfo();
+            }
+
+            if (!draw.fCanStashPathMask) {
+                // No point in keeping this cache entry around anymore if we aren't going to try and
+                // stash the the rendered path mask after flush.
+                draw.fCacheEntry = nullptr;
+                pathCache->evict(cacheEntry);
+            }
+        }
+
+        ++specs->fNumRenderedPaths;
+        specs->fRenderedPathStats.statPath(path);
+        specs->fRenderedAtlasSpecs.accountForSpace(draw.fLooseClippedIBounds.width(),
                                                    draw.fLooseClippedIBounds.height());
     }
 }
 
-void GrCCDrawPathsOp::setupResources(GrCCPerFlushResources* resources,
-                                     GrOnFlushResourceProvider* onFlushRP) {
-    const GrCCAtlas* currentAtlas = nullptr;
+void GrCCDrawPathsOp::setupResources(GrOnFlushResourceProvider* onFlushRP,
+                                     GrCCPerFlushResources* resources, DoCopiesToCache doCopies) {
+    using DoEvenOddFill = GrCCPathProcessor::DoEvenOddFill;
     SkASSERT(fNumDraws > 0);
     SkASSERT(-1 == fBaseInstance);
     fBaseInstance = resources->nextPathInstanceIdx();
 
-    for (const SingleDraw& draw : fDraws) {
-        // renderPathInAtlas gives us two tight bounding boxes: one in device space, as well as a
-        // second one rotated an additional 45 degrees. The path vertex shader uses these two
-        // bounding boxes to generate an octagon that circumscribes the path.
+    for (SingleDraw& draw : fDraws) {
+        SkPath path;
+        draw.fShape.asPath(&path);
+
+        auto doEvenOddFill = DoEvenOddFill(SkPath::kEvenOdd_FillType == path.getFillType());
+        SkASSERT(SkPath::kEvenOdd_FillType == path.getFillType() ||
+                 SkPath::kWinding_FillType == path.getFillType());
+
+        if (auto cacheEntry = draw.fCacheEntry.get()) {
+            // Does the path already exist in a cached atlas texture?
+            if (auto proxy = draw.fCachedAtlasProxy.get()) {
+                SkASSERT(!cacheEntry->currFlushAtlas());
+                this->recordInstance(proxy, resources->nextPathInstanceIdx());
+                resources->appendDrawPathInstance().set(*cacheEntry, draw.fCachedMaskShift,
+                                                        draw.fColor);
+                continue;
+            }
+
+            // Have we already encountered this path during the flush? (i.e. was the same SkPath
+            // drawn more than once during the same flush, with a compatible matrix?)
+            if (auto atlas = cacheEntry->currFlushAtlas()) {
+                this->recordInstance(atlas->textureProxy(), resources->nextPathInstanceIdx());
+                resources->appendDrawPathInstance().set(
+                        *cacheEntry, draw.fCachedMaskShift, draw.fColor,
+                        cacheEntry->hasCachedAtlas() ? DoEvenOddFill::kNo : doEvenOddFill);
+                continue;
+            }
+
+            // If the cache entry still has a valid atlas key at this point, it means the path
+            // exists in the atlas that we stashed away from last flush. Copy it into a permanent
+            // 8-bit atlas in the resource cache.
+            if (DoCopiesToCache::kYes == doCopies && cacheEntry->atlasKey().isValid()) {
+                SkIVector newOffset;
+                GrCCAtlas* atlas =
+                        resources->copyPathToCachedAtlas(*cacheEntry, doEvenOddFill, &newOffset);
+                cacheEntry->updateToCachedAtlas(atlas->getOrAssignUniqueKey(onFlushRP),
+                                                newOffset, atlas->refOrMakeCachedAtlasInfo());
+                this->recordInstance(atlas->textureProxy(), resources->nextPathInstanceIdx());
+                resources->appendDrawPathInstance().set(*cacheEntry, draw.fCachedMaskShift,
+                                                        draw.fColor);
+                // Remember this atlas in case we encounter the path again during the same flush.
+                cacheEntry->setCurrFlushAtlas(atlas);
+                continue;
+            }
+        }
+
+        // Render the raw path into a coverage count atlas. renderPathInAtlas() gives us two tight
+        // bounding boxes: One in device space, as well as a second one rotated an additional 45
+        // degrees. The path vertex shader uses these two bounding boxes to generate an octagon that
+        // circumscribes the path.
+        SkASSERT(!draw.fCachedAtlasProxy);
         SkRect devBounds, devBounds45;
+        SkIRect devIBounds;
         SkIVector devToAtlasOffset;
-        const GrCCAtlas* atlas = resources->renderPathInAtlas(draw.fLooseClippedIBounds,
-                                                              draw.fMatrix, draw.fPath, &devBounds,
-                                                              &devBounds45, &devToAtlasOffset);
-        if (!atlas) {
-            SkDEBUGCODE(++fNumSkippedInstances);
+        if (auto atlas = resources->renderPathInAtlas(draw.fLooseClippedIBounds, draw.fMatrix, path,
+                                                      &devBounds, &devBounds45, &devIBounds,
+                                                      &devToAtlasOffset)) {
+            this->recordInstance(atlas->textureProxy(), resources->nextPathInstanceIdx());
+            resources->appendDrawPathInstance().set(devBounds, devBounds45, devToAtlasOffset,
+                                                    draw.fColor, doEvenOddFill);
+            if (draw.fCacheEntry && draw.fCanStashPathMask &&
+                resources->nextAtlasToStash() == atlas) {
+                const GrUniqueKey& atlasKey =
+                        resources->nextAtlasToStash()->getOrAssignUniqueKey(onFlushRP);
+                draw.fCacheEntry->initAsStashedAtlas(atlasKey, devToAtlasOffset, devBounds,
+                                                     devBounds45, devIBounds,
+                                                     draw.fCachedMaskShift);
+                // Remember this atlas in case we encounter the path again during the same flush.
+                draw.fCacheEntry->setCurrFlushAtlas(atlas);
+            }
             continue;
         }
-        if (currentAtlas != atlas) {
-            if (currentAtlas) {
-                this->recordInstanceRange(currentAtlas->textureProxy(),
-                                          resources->nextPathInstanceIdx());
-            }
-            currentAtlas = atlas;
-        }
-
-        resources->appendDrawPathInstance().set(draw.fPath.getFillType(), devBounds, devBounds45,
-                                                devToAtlasOffset, draw.fColor);
     }
 
-    SkASSERT(resources->nextPathInstanceIdx() == fBaseInstance + fNumDraws - fNumSkippedInstances);
-    if (currentAtlas) {
-        this->recordInstanceRange(currentAtlas->textureProxy(), resources->nextPathInstanceIdx());
+    if (!fInstanceRanges.empty()) {
+        fInstanceRanges.back().fEndInstanceIdx = resources->nextPathInstanceIdx();
+    }
+}
+
+inline void GrCCDrawPathsOp::recordInstance(const GrTextureProxy* atlasProxy, int instanceIdx) {
+    if (fInstanceRanges.empty()) {
+        fInstanceRanges.push_back({atlasProxy, instanceIdx});
+        return;
+    }
+    if (fInstanceRanges.back().fAtlasProxy != atlasProxy) {
+        fInstanceRanges.back().fEndInstanceIdx = instanceIdx;
+        fInstanceRanges.push_back({atlasProxy, instanceIdx});
+        return;
     }
 }
 
@@ -148,8 +268,6 @@
         return;  // Setup failed.
     }
 
-    SkASSERT(fBaseInstance >= 0);  // Make sure setupResources has been called.
-
     GrPipeline::InitArgs initArgs;
     initArgs.fFlags = fSRGBFlags;
     initArgs.fProxy = flushState->drawOpArgs().fProxy;
@@ -159,18 +277,16 @@
     GrPipeline pipeline(initArgs, std::move(fProcessors), flushState->detachAppliedClip());
 
     int baseInstance = fBaseInstance;
+    SkASSERT(baseInstance >= 0);  // Make sure setupResources() has been called.
 
     for (const InstanceRange& range : fInstanceRanges) {
         SkASSERT(range.fEndInstanceIdx > baseInstance);
 
         GrCCPathProcessor pathProc(flushState->resourceProvider(), sk_ref_sp(range.fAtlasProxy),
                                    fViewMatrixIfUsingLocalCoords);
-        pathProc.drawPaths(flushState, pipeline, resources->indexBuffer(),
-                           resources->vertexBuffer(), resources->instanceBuffer(),
-                           baseInstance, range.fEndInstanceIdx, this->bounds());
+        pathProc.drawPaths(flushState, pipeline, *resources, baseInstance, range.fEndInstanceIdx,
+                           this->bounds());
 
         baseInstance = range.fEndInstanceIdx;
     }
-
-    SkASSERT(baseInstance == fBaseInstance + fNumDraws - fNumSkippedInstances);
 }
diff --git a/src/gpu/ccpr/GrCCDrawPathsOp.h b/src/gpu/ccpr/GrCCDrawPathsOp.h
index 071a21a..a779475 100644
--- a/src/gpu/ccpr/GrCCDrawPathsOp.h
+++ b/src/gpu/ccpr/GrCCDrawPathsOp.h
@@ -8,13 +8,16 @@
 #ifndef GrCCDrawPathsOp_DEFINED
 #define GrCCDrawPathsOp_DEFINED
 
+#include "GrShape.h"
 #include "SkTInternalLList.h"
-#include "ccpr/GrCCPathProcessor.h"
 #include "ccpr/GrCCSTLList.h"
 #include "ops/GrDrawOp.h"
 
 struct GrCCPerFlushResourceSpecs;
 class GrCCAtlas;
+class GrOnFlushResourceProvider;
+class GrCCPathCache;
+class GrCCPathCacheEntry;
 class GrCCPerFlushResources;
 class GrCCPerOpListPaths;
 
@@ -27,53 +30,70 @@
     SK_DECLARE_INTERNAL_LLIST_INTERFACE(GrCCDrawPathsOp);
 
     static std::unique_ptr<GrCCDrawPathsOp> Make(GrContext*, const SkIRect& clipIBounds,
-                                                 const SkMatrix&, const SkPath&,
+                                                 const SkMatrix&, const GrShape&,
                                                  const SkRect& devBounds, GrPaint&&);
     ~GrCCDrawPathsOp() override;
 
-    const char* name() const override { return "GrCCDrawOp"; }
+    const char* name() const override { return "GrCCDrawPathsOp"; }
     FixedFunctionFlags fixedFunctionFlags() const override { return FixedFunctionFlags::kNone; }
     RequiresDstTexture finalize(const GrCaps&, const GrAppliedClip*,
                                 GrPixelConfigIsClamped) override;
-    bool onCombineIfPossible(GrOp* other, const GrCaps& caps) override;
-    void visitProxies(const VisitProxyFunc& func) const override {
-        fProcessors.visitProxies(func);
-    }
+    bool onCombineIfPossible(GrOp*, const GrCaps&) override;
+    void visitProxies(const VisitProxyFunc& fn) const override { fProcessors.visitProxies(fn); }
     void onPrepare(GrOpFlushState*) override {}
 
     void wasRecorded(GrCCPerOpListPaths* owningPerOpListPaths);
-    void accountForOwnPaths(GrCCPerFlushResourceSpecs*) const;
-    void setupResources(GrCCPerFlushResources*, GrOnFlushResourceProvider*);
-    SkDEBUGCODE(int numSkippedInstances_debugOnly() const { return fNumSkippedInstances; })
+
+    // Makes decisions about how to draw each path (cached, copied, rendered, etc.), and
+    // increments/fills out the corresponding GrCCPerFlushResourceSpecs. 'stashedAtlasKey', if
+    // valid, references the mainline coverage count atlas from the previous flush. Paths found in
+    // this atlas will be copied to more permanent atlases in the resource cache.
+    void accountForOwnPaths(GrCCPathCache*, GrOnFlushResourceProvider*,
+                            const GrUniqueKey& stashedAtlasKey, GrCCPerFlushResourceSpecs*);
+
+    // Allows the caller to decide whether to copy paths out of the stashed atlas and into the
+    // resource cache, or to just re-render the paths from scratch. If there aren't many copies or
+    // the copies would only fill a small atlas, it's probably best to just re-render.
+    enum class DoCopiesToCache : bool {
+        kNo = false,
+        kYes = true
+    };
+
+    // Allocates the GPU resources indicated by accountForOwnPaths(), in preparation for drawing. If
+    // DoCopiesToCache is kNo, the paths slated for copy will instead be re-rendered from scratch.
+    //
+    // NOTE: If using DoCopiesToCache::kNo, it is the caller's responsibility to call
+    //       convertCopiesToRenders() on the GrCCPerFlushResourceSpecs.
+    void setupResources(GrOnFlushResourceProvider*, GrCCPerFlushResources*, DoCopiesToCache);
 
     void onExecute(GrOpFlushState*) override;
 
 private:
     friend class GrOpMemoryPool;
 
-    GrCCDrawPathsOp(const SkIRect& looseClippedIBounds, const SkMatrix&, const SkPath&,
-                    const SkRect& devBounds, GrPaint&&);
+    GrCCDrawPathsOp(const SkIRect& clippedDevIBounds, const SkMatrix&, const GrShape&,
+                    bool canStashPathMask, const SkRect& devBounds, GrPaint&&);
 
-    struct InstanceRange {
-        const GrTextureProxy* fAtlasProxy;
-        int fEndInstanceIdx;
-    };
-
-    void recordInstanceRange(const GrTextureProxy* atlasProxy, int endInstanceIdx) {
-        SkASSERT(endInstanceIdx > fBaseInstance);
-        SkASSERT(fInstanceRanges.empty() ||
-                 endInstanceIdx > fInstanceRanges.back().fEndInstanceIdx);
-        fInstanceRanges.push_back() = {atlasProxy, endInstanceIdx};
-    }
+    void recordInstance(const GrTextureProxy* atlasProxy, int instanceIdx);
 
     const SkMatrix fViewMatrixIfUsingLocalCoords;
     const uint32_t fSRGBFlags;
 
     struct SingleDraw {
+        ~SingleDraw();
+
         SkIRect fLooseClippedIBounds;
         SkMatrix fMatrix;
-        SkPath fPath;
+        GrShape fShape;
         GrColor fColor;
+
+        sk_sp<GrCCPathCacheEntry> fCacheEntry;
+        sk_sp<GrTextureProxy> fCachedAtlasProxy;
+        SkIVector fCachedMaskShift;
+
+        // If we render the path, can we stash its atlas and copy to the resource cache next flush?
+        bool fCanStashPathMask;
+
         SingleDraw* fNext;
     };
 
@@ -83,9 +103,13 @@
     GrCCPerOpListPaths* fOwningPerOpListPaths = nullptr;
     GrProcessorSet fProcessors;
 
-    int fBaseInstance;
-    SkSTArray<1, InstanceRange, true> fInstanceRanges;
-    SkDEBUGCODE(int fNumSkippedInstances = 0);
+    struct InstanceRange {
+        const GrTextureProxy* fAtlasProxy;
+        int fEndInstanceIdx;
+    };
+
+    SkSTArray<2, InstanceRange, true> fInstanceRanges;
+    int fBaseInstance SkDEBUGCODE(= -1);
 };
 
 #endif
diff --git a/src/gpu/ccpr/GrCCPathCache.cpp b/src/gpu/ccpr/GrCCPathCache.cpp
new file mode 100644
index 0000000..a2b6416
--- /dev/null
+++ b/src/gpu/ccpr/GrCCPathCache.cpp
@@ -0,0 +1,176 @@
+/*
+ * Copyright 2018 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "GrCCPathCache.h"
+
+#include "GrShape.h"
+#include "SkNx.h"
+#include "ccpr/GrCCPathParser.h"
+
+// The maximum number of cache entries we allow in our own cache.
+static constexpr int kMaxCacheCount = 1 << 16;
+
+GrCCPathCache::MaskTransform::MaskTransform(const SkMatrix& m, SkIVector* shift)
+        : fMatrix2x2{m.getScaleX(), m.getSkewX(), m.getSkewY(), m.getScaleY()} {
+    SkASSERT(!m.hasPerspective());
+    Sk2f translate = Sk2f(m.getTranslateX(), m.getTranslateY());
+    Sk2f floor = translate.floor();
+    (translate - floor).store(fSubpixelTranslate);
+    shift->set((int)floor[0], (int)floor[1]);
+    SkASSERT((float)shift->fX == floor[0]);
+    SkASSERT((float)shift->fY == floor[1]);
+}
+
+inline static bool fuzzy_equals(const GrCCPathCache::MaskTransform& a,
+                                const GrCCPathCache::MaskTransform& b) {
+    return (Sk4f::Load(a.fMatrix2x2) == Sk4f::Load(b.fMatrix2x2)).allTrue() &&
+           ((Sk2f::Load(a.fSubpixelTranslate) -
+             Sk2f::Load(b.fSubpixelTranslate)).abs() < 1.f/256).allTrue();
+}
+
+inline GrCCPathCache::HashNode::HashNode(GrCCPathCache* cache, const MaskTransform& m,
+                                         const GrShape& shape) {
+    SkASSERT(shape.hasUnstyledKey());
+
+    int keyLength = 1 + shape.unstyledKeySize();
+    void* mem = ::operator new (sizeof(GrCCPathCacheEntry) + keyLength * sizeof(uint32_t));
+    fEntry = new (mem) GrCCPathCacheEntry(cache, m);
+
+    // The shape key is a variable-length footer to the entry allocation.
+    uint32_t* keyData = (uint32_t*)((char*)mem + sizeof(GrCCPathCacheEntry));
+    keyData[0] = keyLength - 1;
+    shape.writeUnstyledKey(&keyData[1]);
+}
+
+inline bool operator==(const GrCCPathCache::HashKey& key1, const GrCCPathCache::HashKey& key2) {
+    return key1.fData[0] == key2.fData[0] &&
+           !memcmp(&key1.fData[1], &key2.fData[1], key1.fData[0] * sizeof(uint32_t));
+}
+
+inline GrCCPathCache::HashKey GrCCPathCache::HashNode::GetKey(const GrCCPathCacheEntry* entry) {
+    // The shape key is a variable-length footer to the entry allocation.
+    return HashKey{(const uint32_t*)((const char*)entry + sizeof(GrCCPathCacheEntry))};
+}
+
+inline uint32_t GrCCPathCache::HashNode::Hash(HashKey key) {
+    return GrResourceKeyHash(&key.fData[1], key.fData[0]);
+}
+
+GrCCPathCache::HashNode::~HashNode() {
+    if (!fEntry) {
+        return;
+    }
+
+    // Finalize our eviction from the path cache.
+    SkASSERT(fEntry->fCacheWeakPtr);
+    fEntry->fCacheWeakPtr->fLRU.remove(fEntry);
+    fEntry->fCacheWeakPtr = nullptr;
+
+    if (GrCCAtlas::CachedAtlasInfo* info = fEntry->fCachedAtlasInfo.get()) {
+        // Mark our own pixels invalid in the cached atlas texture now that we have been evicted.
+        info->fNumInvalidatedPathPixels += fEntry->height() * fEntry->width();
+        if (!info->fIsPurgedFromResourceCache &&
+            info->fNumInvalidatedPathPixels >= info->fNumPathPixels / 2) {
+            // Too many invalidated pixels: purge the atlas texture from the resource cache.
+            SkMessageBus<GrUniqueKeyInvalidatedMessage>::Post(
+                    GrUniqueKeyInvalidatedMessage(fEntry->fAtlasKey));
+            info->fIsPurgedFromResourceCache = true;
+        }
+    }
+
+    fEntry->unref();
+}
+
+GrCCPathCache::HashNode& GrCCPathCache::HashNode::operator=(HashNode&& node) {
+    this->~HashNode();
+    return *new (this) HashNode(std::move(node));
+}
+
+sk_sp<GrCCPathCacheEntry> GrCCPathCache::find(const GrShape& shape, const MaskTransform& m,
+                                              CreateIfAbsent createIfAbsent) {
+    if (!shape.hasUnstyledKey()) {
+        return nullptr;
+    }
+
+    int keyLength = 1 + shape.unstyledKeySize();
+    SkAutoSTMalloc<GrShape::kMaxKeyFromDataVerbCnt * 4, uint32_t> keyData(keyLength);
+    keyData[0] = keyLength - 1;
+    shape.writeUnstyledKey(&keyData[1]);
+
+    GrCCPathCacheEntry* entry = nullptr;
+    if (HashNode* node = fHashTable.find({keyData.get()})) {
+        entry = node->entry();
+        SkASSERT(this == entry->fCacheWeakPtr);
+        if (!fuzzy_equals(m, entry->fMaskTransform)) {
+            this->evict(entry);  // The path was reused with an incompatible matrix.
+            entry = nullptr;
+        }
+    }
+
+    if (!entry) {
+        if (CreateIfAbsent::kNo == createIfAbsent) {
+            return nullptr;
+        }
+        if (fHashTable.count() >= kMaxCacheCount) {
+            this->evict(fLRU.tail());  // We've exceeded our limit.
+        }
+        entry = fHashTable.set(HashNode(this, m, shape))->entry();
+        SkASSERT(fHashTable.count() <= kMaxCacheCount);
+    } else {
+        fLRU.remove(entry);  // Will be re-added at head.
+    }
+
+    fLRU.addToHead(entry);
+    return sk_ref_sp(entry);
+}
+
+void GrCCPathCache::evict(const GrCCPathCacheEntry* entry) {
+    SkASSERT(entry);
+    SkASSERT(this == entry->fCacheWeakPtr);
+    SkASSERT(fLRU.isInList(entry));
+    SkASSERT(fHashTable.find(HashNode::GetKey(entry))->entry() == entry);
+
+    fHashTable.remove(HashNode::GetKey(entry));  // ~HashNode() handles the rest.
+}
+
+void GrCCPathCacheEntry::initAsStashedAtlas(const GrUniqueKey& atlasKey,
+                                            const SkIVector& atlasOffset, const SkRect& devBounds,
+                                            const SkRect& devBounds45, const SkIRect& devIBounds,
+                                            const SkIVector& maskShift) {
+    SkASSERT(atlasKey.isValid());
+    SkASSERT(!fCurrFlushAtlas);  // Otherwise we should reuse the atlas from last time.
+
+    fAtlasKey = atlasKey;
+    fAtlasOffset = atlasOffset + maskShift;
+    SkASSERT(!fCachedAtlasInfo);  // Otherwise they should have reused the cached atlas instead.
+
+    float dx = (float)maskShift.fX, dy = (float)maskShift.fY;
+    fDevBounds = devBounds.makeOffset(-dx, -dy);
+    fDevBounds45 = GrCCPathProcessor::MakeOffset45(devBounds45, -dx, -dy);
+    fDevIBounds = devIBounds.makeOffset(-maskShift.fX, -maskShift.fY);
+}
+
+void GrCCPathCacheEntry::updateToCachedAtlas(const GrUniqueKey& atlasKey,
+                                             const SkIVector& newAtlasOffset,
+                                             sk_sp<GrCCAtlas::CachedAtlasInfo> info) {
+    SkASSERT(atlasKey.isValid());
+    SkASSERT(!fCurrFlushAtlas);  // Otherwise we should reuse the atlas from last time.
+
+    fAtlasKey = atlasKey;
+    fAtlasOffset = newAtlasOffset;
+
+    SkASSERT(!fCachedAtlasInfo);  // Otherwise we need to invalidate our pixels in the old info.
+    fCachedAtlasInfo = std::move(info);
+    fCachedAtlasInfo->fNumPathPixels += this->height() * this->width();
+}
+
+void GrCCPathCacheEntry::onChange() {
+    // Our corresponding path was modified or deleted. Evict ourselves.
+    if (fCacheWeakPtr) {
+        fCacheWeakPtr->evict(this);
+    }
+}
diff --git a/src/gpu/ccpr/GrCCPathCache.h b/src/gpu/ccpr/GrCCPathCache.h
new file mode 100644
index 0000000..e6e25d2
--- /dev/null
+++ b/src/gpu/ccpr/GrCCPathCache.h
@@ -0,0 +1,176 @@
+/*
+ * Copyright 2018 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef GrCCPathCache_DEFINED
+#define GrCCPathCache_DEFINED
+
+#include "SkExchange.h"
+#include "SkTHash.h"
+#include "SkTInternalLList.h"
+#include "ccpr/GrCCAtlas.h"
+#include "ccpr/GrCCPathProcessor.h"
+
+class GrCCPathCacheEntry;
+class GrShape;
+
+/**
+ * This class implements an LRU cache that maps from GrShape to GrCCPathCacheEntry objects. Shapes
+ * are only given one entry in the cache, so any time they are accessed with a different matrix, the
+ * old entry gets evicted.
+ */
+class GrCCPathCache {
+public:
+#ifdef SK_DEBUG
+    ~GrCCPathCache() {
+        // Ensure the hash table and LRU list are still coherent.
+        fHashTable.reset();
+        SkASSERT(fLRU.isEmpty());
+    }
+#endif
+
+    // Stores the components of a transformation that affect a path mask (i.e. everything but
+    // integer translation). During construction, any integer portions of the matrix's translate are
+    // shaved off and returned to the caller. The caller is responsible for those integer shifts.
+    struct MaskTransform {
+        MaskTransform(const SkMatrix& m, SkIVector* shift);
+        float fMatrix2x2[4];
+        float fSubpixelTranslate[2];
+    };
+
+    enum class CreateIfAbsent : bool {
+        kNo = false,
+        kYes = true
+    };
+
+    // Finds an entry in the cache. Shapes are only given one entry, so any time they are accessed
+    // with a different MaskTransform, the old entry gets evicted.
+    sk_sp<GrCCPathCacheEntry> find(const GrShape&, const MaskTransform&,
+                                   CreateIfAbsent = CreateIfAbsent::kNo);
+
+    void evict(const GrCCPathCacheEntry*);
+
+private:
+    // Wrapper around a raw GrShape key that has a specialized operator==. Used by the hash table.
+    struct HashKey {
+        const uint32_t* fData;
+    };
+    friend bool operator==(const HashKey&, const HashKey&);
+
+    // This is a special ref ptr for GrCCPathCacheEntry, used by the hash table. It can only be
+    // moved, which guarantees the hash table holds exactly one reference for each entry. When a
+    // HashNode goes out of scope, it therefore means the entry has been evicted from the cache.
+    class HashNode : SkNoncopyable {
+    public:
+        static HashKey GetKey(const HashNode& node) { return GetKey(node.fEntry); }
+        static HashKey GetKey(const GrCCPathCacheEntry*);
+        static uint32_t Hash(HashKey);
+
+        HashNode() = default;
+        HashNode(GrCCPathCache*, const MaskTransform&, const GrShape&);
+        HashNode(HashNode&& node) { fEntry = skstd::exchange(node.fEntry, nullptr); }
+        ~HashNode();  // Called when fEntry (if not null) has been evicted from the cache.
+
+        HashNode& operator=(HashNode&&);
+
+        GrCCPathCacheEntry* entry() const { return fEntry; }
+
+    private:
+        GrCCPathCacheEntry* fEntry = nullptr;
+        // The GrShape's unstyled key is stored as a variable-length footer to the 'fEntry'
+        // allocation. GetKey provides access to it.
+    };
+
+    SkTHashTable<HashNode, HashKey> fHashTable;
+    SkTInternalLList<GrCCPathCacheEntry> fLRU;
+};
+
+/**
+ * This class stores all the data necessary to draw a specific path from its corresponding cached
+ * atlas.
+ */
+class GrCCPathCacheEntry : public SkPathRef::GenIDChangeListener {
+public:
+    SK_DECLARE_INTERNAL_LLIST_INTERFACE(GrCCPathCacheEntry);
+
+    // Does this entry reference a permanent, 8-bit atlas that resides in the resource cache?
+    // (i.e. not a temporarily-stashed, fp16 coverage count atlas.)
+    bool hasCachedAtlas() const { return SkToBool(fCachedAtlasInfo); }
+
+    const SkIRect& devIBounds() const { return fDevIBounds; }
+    int width() const { return fDevIBounds.width(); }
+    int height() const { return fDevIBounds.height(); }
+
+    // Called once our path has been rendered into the mainline CCPR (fp16, coverage count) atlas.
+    // The caller will stash this atlas texture away after drawing, and during the next flush,
+    // recover it and attempt to copy any paths that got reused into permanent 8-bit atlases.
+    void initAsStashedAtlas(const GrUniqueKey& atlasKey, const SkIVector& atlasOffset,
+                            const SkRect& devBounds, const SkRect& devBounds45,
+                            const SkIRect& devIBounds, const SkIVector& maskShift);
+
+    // Called once our path mask has been copied into a permanent, 8-bit atlas. This method points
+    // the entry at the new atlas and updates the CachedAtlasInfo data.
+    void updateToCachedAtlas(const GrUniqueKey& atlasKey, const SkIVector& newAtlasOffset,
+                             sk_sp<GrCCAtlas::CachedAtlasInfo>);
+
+    const GrUniqueKey& atlasKey() const { return fAtlasKey; }
+
+    void resetAtlasKeyAndInfo() {
+        fAtlasKey.reset();
+        fCachedAtlasInfo.reset();
+    }
+
+    // This is a utility for the caller to detect when a path gets drawn more than once during the
+    // same flush, with compatible matrices. Before adding a path to an atlas, the caller may check
+    // here to see if they have already placed the path previously during the same flush. The caller
+    // is required to reset all currFlushAtlas references back to null before any subsequent flush.
+    void setCurrFlushAtlas(const GrCCAtlas* currFlushAtlas) {
+        // This should not get called more than once in a single flush. Once fCurrFlushAtlas is
+        // non-null, it can only be set back to null (once the flush is over).
+        SkASSERT(!fCurrFlushAtlas || !currFlushAtlas);
+        fCurrFlushAtlas = currFlushAtlas;
+    }
+    const GrCCAtlas* currFlushAtlas() const { return fCurrFlushAtlas; }
+
+private:
+    using MaskTransform = GrCCPathCache::MaskTransform;
+
+    GrCCPathCacheEntry(GrCCPathCache* cache, const MaskTransform& m)
+            : fCacheWeakPtr(cache), fMaskTransform(m) {}
+
+    // Called when our corresponding path is modified or deleted.
+    void onChange() override;
+
+    GrCCPathCache* fCacheWeakPtr;  // Gets manually reset to null by the path cache upon eviction.
+    const MaskTransform fMaskTransform;
+
+    GrUniqueKey fAtlasKey;
+    SkIVector fAtlasOffset;
+
+    // If null, then we are referencing a "stashed" atlas (see initAsStashedAtlas()).
+    sk_sp<GrCCAtlas::CachedAtlasInfo> fCachedAtlasInfo;
+
+    SkRect fDevBounds;
+    SkRect fDevBounds45;
+    SkIRect fDevIBounds;
+
+    // This field is for when a path gets drawn more than once during the same flush.
+    const GrCCAtlas* fCurrFlushAtlas = nullptr;
+
+    friend class GrCCPathCache;
+    friend void GrCCPathProcessor::Instance::set(const GrCCPathCacheEntry&, const SkIVector&,
+                                                 uint32_t, DoEvenOddFill);  // To access data.
+};
+
+inline void GrCCPathProcessor::Instance::set(const GrCCPathCacheEntry& entry,
+                                             const SkIVector& shift, GrColor color,
+                                             DoEvenOddFill doEvenOddFill) {
+    float dx = (float)shift.fX, dy = (float)shift.fY;
+    this->set(entry.fDevBounds.makeOffset(dx, dy), MakeOffset45(entry.fDevBounds45, dx, dy),
+              entry.fAtlasOffset - shift, color, doEvenOddFill);
+}
+
+#endif
diff --git a/src/gpu/ccpr/GrCCPathProcessor.cpp b/src/gpu/ccpr/GrCCPathProcessor.cpp
index 39d5ef2..b8ebb44 100644
--- a/src/gpu/ccpr/GrCCPathProcessor.cpp
+++ b/src/gpu/ccpr/GrCCPathProcessor.cpp
@@ -10,6 +10,7 @@
 #include "GrGpuCommandBuffer.h"
 #include "GrOnFlushResourceProvider.h"
 #include "GrTexture.h"
+#include "ccpr/GrCCPerFlushResources.h"
 #include "glsl/GrGLSLFragmentShaderBuilder.h"
 #include "glsl/GrGLSLGeometryProcessor.h"
 #include "glsl/GrGLSLProgramBuilder.h"
@@ -131,9 +132,8 @@
 }
 
 void GrCCPathProcessor::drawPaths(GrOpFlushState* flushState, const GrPipeline& pipeline,
-                                  const GrBuffer* indexBuffer, const GrBuffer* vertexBuffer,
-                                  GrBuffer* instanceBuffer, int baseInstance, int endInstance,
-                                  const SkRect& bounds) const {
+                                  const GrCCPerFlushResources& resources, int baseInstance,
+                                  int endInstance, const SkRect& bounds) const {
     const GrCaps& caps = flushState->caps();
     GrPrimitiveType primitiveType = caps.usePrimitiveRestart()
                                             ? GrPrimitiveType::kTriangleStrip
@@ -144,9 +144,10 @@
     GrMesh mesh(primitiveType);
     auto enablePrimitiveRestart = GrPrimitiveRestart(flushState->caps().usePrimitiveRestart());
 
-    mesh.setIndexedInstanced(indexBuffer, numIndicesPerInstance, instanceBuffer,
-                             endInstance - baseInstance, baseInstance, enablePrimitiveRestart);
-    mesh.setVertexData(vertexBuffer);
+    mesh.setIndexedInstanced(resources.indexBuffer(), numIndicesPerInstance,
+                             resources.instanceBuffer(), endInstance - baseInstance, baseInstance,
+                             enablePrimitiveRestart);
+    mesh.setVertexData(resources.vertexBuffer());
 
     flushState->rtCommandBuffer()->draw(pipeline, *this, &mesh, nullptr, 1, bounds);
 }
diff --git a/src/gpu/ccpr/GrCCPathProcessor.h b/src/gpu/ccpr/GrCCPathProcessor.h
index 9ea0a16..785dd2c 100644
--- a/src/gpu/ccpr/GrCCPathProcessor.h
+++ b/src/gpu/ccpr/GrCCPathProcessor.h
@@ -13,6 +13,8 @@
 #include "SkPath.h"
 #include <array>
 
+class GrCCPathCacheEntry;
+class GrCCPerFlushResources;
 class GrOnFlushResourceProvider;
 class GrOpFlushState;
 class GrPipeline;
@@ -37,15 +39,29 @@
     };
     static constexpr int kNumInstanceAttribs = 1 + (int)InstanceAttribs::kColor;
 
+    // Helper to offset the 45-degree bounding box returned by GrCCPathParser::parsePath().
+    static SkRect MakeOffset45(const SkRect& devBounds45, float dx, float dy) {
+        // devBounds45 is in "| 1  -1 | * devCoords" space.
+        //                    | 1   1 |
+        return devBounds45.makeOffset(dx - dy, dx + dy);
+    }
+
+    enum class DoEvenOddFill : bool {
+        kNo = false,
+        kYes = true
+    };
+
     struct Instance {
         SkRect fDevBounds;  // "right < left" indicates even-odd fill type.
         SkRect fDevBounds45;  // Bounding box in "| 1  -1 | * devCoords" space.
                               //                  | 1   1 |
         SkIVector fDevToAtlasOffset;  // Translation from device space to location in atlas.
-        uint32_t fColor;
+        GrColor fColor;
 
-        void set(SkPath::FillType, const SkRect& devBounds, const SkRect& devBounds45,
-                 const SkIVector& devToAtlasOffset, uint32_t color);
+        void set(const SkRect& devBounds, const SkRect& devBounds45,
+                 const SkIVector& devToAtlasOffset, GrColor, DoEvenOddFill = DoEvenOddFill::kNo);
+        void set(const GrCCPathCacheEntry&, const SkIVector& shift, GrColor,
+                 DoEvenOddFill = DoEvenOddFill::kNo);
     };
 
     GR_STATIC_ASSERT(4 * 11 == sizeof(Instance));
@@ -75,9 +91,8 @@
     void getGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override {}
     GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override;
 
-    void drawPaths(GrOpFlushState*, const GrPipeline&, const GrBuffer* indexBuffer,
-                   const GrBuffer* vertexBuffer, GrBuffer* instanceBuffer, int baseInstance,
-                   int endInstance, const SkRect& bounds) const;
+    void drawPaths(GrOpFlushState*, const GrPipeline&, const GrCCPerFlushResources&,
+                   int baseInstance, int endInstance, const SkRect& bounds) const;
 
 private:
     const TextureSampler fAtlasAccess;
@@ -86,14 +101,13 @@
     typedef GrGeometryProcessor INHERITED;
 };
 
-inline void GrCCPathProcessor::Instance::set(SkPath::FillType fillType, const SkRect& devBounds,
-                                             const SkRect& devBounds45,
-                                             const SkIVector& devToAtlasOffset, uint32_t color) {
-    if (SkPath::kEvenOdd_FillType == fillType) {
+inline void GrCCPathProcessor::Instance::set(const SkRect& devBounds, const SkRect& devBounds45,
+                                             const SkIVector& devToAtlasOffset, GrColor color,
+                                             DoEvenOddFill doEvenOddFill) {
+    if (DoEvenOddFill::kYes == doEvenOddFill) {
         // "right < left" indicates even-odd fill type.
         fDevBounds.setLTRB(devBounds.fRight, devBounds.fTop, devBounds.fLeft, devBounds.fBottom);
     } else {
-        SkASSERT(SkPath::kWinding_FillType == fillType);
         fDevBounds = devBounds;
     }
     fDevBounds45 = devBounds45;
diff --git a/src/gpu/ccpr/GrCCPerFlushResources.cpp b/src/gpu/ccpr/GrCCPerFlushResources.cpp
index 4738a25..84f905c 100644
--- a/src/gpu/ccpr/GrCCPerFlushResources.cpp
+++ b/src/gpu/ccpr/GrCCPerFlushResources.cpp
@@ -13,14 +13,83 @@
 #include "GrSurfaceContextPriv.h"
 #include "GrRenderTargetContext.h"
 #include "SkMakeUnique.h"
+#include "ccpr/GrCCPathCache.h"
 
 using CoverageCountBatchID = GrCCPathParser::CoverageCountBatchID;
 using PathInstance = GrCCPathProcessor::Instance;
 
 namespace {
 
+// Base class for an Op that renders a CCPR atlas.
+class AtlasOp : public GrDrawOp {
+public:
+    FixedFunctionFlags fixedFunctionFlags() const override { return FixedFunctionFlags::kNone; }
+    RequiresDstTexture finalize(const GrCaps&, const GrAppliedClip*,
+                                GrPixelConfigIsClamped) override { return RequiresDstTexture::kNo; }
+    bool onCombineIfPossible(GrOp* other, const GrCaps&) override {
+        SK_ABORT("Only expected one Op per CCPR atlas.");
+        return true;
+    }
+    void onPrepare(GrOpFlushState*) override {}
+
+protected:
+    AtlasOp(uint32_t classID, sk_sp<const GrCCPerFlushResources> resources,
+            const SkISize& drawBounds)
+            : GrDrawOp(classID)
+            , fResources(std::move(resources)) {
+        this->setBounds(SkRect::MakeIWH(drawBounds.width(), drawBounds.height()),
+                        GrOp::HasAABloat::kNo, GrOp::IsZeroArea::kNo);
+    }
+
+    const sk_sp<const GrCCPerFlushResources> fResources;
+};
+
+// Copies paths from a stashed coverage count atlas into an 8-bit literal-coverage atlas.
+class CopyAtlasOp : public AtlasOp {
+public:
+    DEFINE_OP_CLASS_ID
+
+    static std::unique_ptr<GrDrawOp> Make(GrContext* context,
+                                          sk_sp<const GrCCPerFlushResources> resources,
+                                          sk_sp<GrTextureProxy> copyProxy, int baseInstance,
+                                          int endInstance, const SkISize& drawBounds) {
+        return std::unique_ptr<GrDrawOp>(new CopyAtlasOp(std::move(resources), std::move(copyProxy),
+                                                         baseInstance, endInstance, drawBounds));
+    }
+
+    const char* name() const override { return "CopyAtlasOp (CCPR)"; }
+    void visitProxies(const VisitProxyFunc& fn) const override { fn(fStashedAtlasProxy.get()); }
+
+    void onExecute(GrOpFlushState* flushState) override {
+        SkASSERT(fStashedAtlasProxy);
+        GrPipeline pipeline(flushState->proxy(), GrPipeline::ScissorState::kDisabled,
+                            SkBlendMode::kSrc);
+        GrCCPathProcessor pathProc(flushState->resourceProvider(), std::move(fStashedAtlasProxy));
+        pathProc.drawPaths(flushState, pipeline, *fResources, fBaseInstance, fEndInstance,
+                           this->bounds());
+        // Ensure we released the stashed atlas proxy. This allows its underlying texture to be
+        // reused as the current flush's mainline CCPR atlas if needed.
+        SkASSERT(!fStashedAtlasProxy);
+    }
+
+private:
+    friend class ::GrOpMemoryPool; // for ctor
+
+    CopyAtlasOp(sk_sp<const GrCCPerFlushResources> resources, sk_sp<GrTextureProxy> copyProxy,
+                int baseInstance, int endInstance, const SkISize& drawBounds)
+            : AtlasOp(ClassID(), std::move(resources), drawBounds)
+            , fStashedAtlasProxy(copyProxy)
+            , fBaseInstance(baseInstance)
+            , fEndInstance(endInstance) {
+    }
+
+    sk_sp<GrTextureProxy> fStashedAtlasProxy;
+    const int fBaseInstance;
+    const int fEndInstance;
+};
+
 // Renders coverage counts to a CCPR atlas using the resources' pre-filled GrCCPathParser.
-class RenderAtlasOp : public GrDrawOp {
+class RenderAtlasOp : public AtlasOp {
 public:
     DEFINE_OP_CLASS_ID
 
@@ -33,14 +102,6 @@
 
     // GrDrawOp interface.
     const char* name() const override { return "RenderAtlasOp (CCPR)"; }
-    FixedFunctionFlags fixedFunctionFlags() const override { return FixedFunctionFlags::kNone; }
-    RequiresDstTexture finalize(const GrCaps&, const GrAppliedClip*,
-                                GrPixelConfigIsClamped) override { return RequiresDstTexture::kNo; }
-    bool onCombineIfPossible(GrOp* other, const GrCaps&) override {
-        SK_ABORT("Only expected one Op per CCPR atlas.");
-        return true;
-    }
-    void onPrepare(GrOpFlushState*) override {}
 
     void onExecute(GrOpFlushState* flushState) override {
         fResources->pathParser().drawCoverageCount(flushState, fBatchID, fDrawBounds);
@@ -51,29 +112,35 @@
 
     RenderAtlasOp(sk_sp<const GrCCPerFlushResources> resources, CoverageCountBatchID batchID,
                   const SkISize& drawBounds)
-            : GrDrawOp(ClassID())
-            , fResources(std::move(resources))
+            : AtlasOp(ClassID(), std::move(resources), drawBounds)
             , fBatchID(batchID)
             , fDrawBounds(SkIRect::MakeWH(drawBounds.width(), drawBounds.height())) {
-        this->setBounds(SkRect::MakeIWH(fDrawBounds.width(), fDrawBounds.height()),
-                        GrOp::HasAABloat::kNo, GrOp::IsZeroArea::kNo);
     }
 
-    const sk_sp<const GrCCPerFlushResources> fResources;
     const CoverageCountBatchID fBatchID;
     const SkIRect fDrawBounds;
 };
 
 }
 
+static int inst_buffer_count(const GrCCPerFlushResourceSpecs& specs) {
+    return specs.fNumCachedPaths +
+           specs.fNumCopiedPaths*2 +  // 1 copy + 1 draw.
+           specs.fNumRenderedPaths;
+}
+
 GrCCPerFlushResources::GrCCPerFlushResources(GrOnFlushResourceProvider* onFlushRP,
                                              const GrCCPerFlushResourceSpecs& specs)
-        : fPathParser(specs.fNumRenderedPaths + specs.fNumClipPaths, specs.fParsingPathStats)
-        , fAtlasStack(kAlpha_half_GrPixelConfig, specs.fAtlasSpecs, onFlushRP->caps())
+        : fPathParser(specs.fNumRenderedPaths + specs.fNumClipPaths, specs.fRenderedPathStats)
+        , fCopyAtlasStack(kAlpha_8_GrPixelConfig, specs.fCopyAtlasSpecs, onFlushRP->caps())
+        , fRenderedAtlasStack(kAlpha_half_GrPixelConfig, specs.fRenderedAtlasSpecs,
+                              onFlushRP->caps())
         , fIndexBuffer(GrCCPathProcessor::FindIndexBuffer(onFlushRP))
         , fVertexBuffer(GrCCPathProcessor::FindVertexBuffer(onFlushRP))
         , fInstanceBuffer(onFlushRP->makeBuffer(kVertex_GrBufferType,
-                                                specs.fNumRenderedPaths * sizeof(PathInstance))) {
+                                                inst_buffer_count(specs) * sizeof(PathInstance)))
+        , fNextCopyInstanceIdx(0)
+        , fNextPathInstanceIdx(specs.fNumCopiedPaths) {
     if (!fIndexBuffer) {
         SkDebugf("WARNING: failed to allocate CCPR index buffer. No paths will be drawn.\n");
         return;
@@ -88,26 +155,43 @@
     }
     fPathInstanceData = static_cast<PathInstance*>(fInstanceBuffer->map());
     SkASSERT(fPathInstanceData);
-    SkDEBUGCODE(fEndPathInstance = specs.fNumRenderedPaths);
+    SkDEBUGCODE(fEndCopyInstance = specs.fNumCopiedPaths);
+    SkDEBUGCODE(fEndPathInstance = inst_buffer_count(specs));
+}
+
+GrCCAtlas* GrCCPerFlushResources::copyPathToCachedAtlas(const GrCCPathCacheEntry& entry,
+                                                        GrCCPathProcessor::DoEvenOddFill evenOdd,
+                                                        SkIVector* newAtlasOffset) {
+    SkASSERT(this->isMapped());
+    SkASSERT(fNextCopyInstanceIdx < fEndCopyInstance);
+    SkASSERT(!entry.hasCachedAtlas());  // Unexpected, but not necessarily a problem.
+
+    if (GrCCAtlas* retiredAtlas = fCopyAtlasStack.addRect(entry.devIBounds(), newAtlasOffset)) {
+        // We did not fit in the previous copy atlas and it was retired. We will render the copies
+        // up until fNextCopyInstanceIdx into the retired atlas during finalize().
+        retiredAtlas->setUserBatchID(fNextCopyInstanceIdx);
+    }
+
+    fPathInstanceData[fNextCopyInstanceIdx++].set(entry, *newAtlasOffset, GrColor_WHITE, evenOdd);
+    return &fCopyAtlasStack.current();
 }
 
 const GrCCAtlas* GrCCPerFlushResources::renderPathInAtlas(const SkIRect& clipIBounds,
                                                           const SkMatrix& m, const SkPath& path,
                                                           SkRect* devBounds, SkRect* devBounds45,
+                                                          SkIRect* devIBounds,
                                                           SkIVector* devToAtlasOffset) {
     SkASSERT(this->isMapped());
     SkASSERT(fNextPathInstanceIdx < fEndPathInstance);
 
     fPathParser.parsePath(m, path, devBounds, devBounds45);
+    devBounds->roundOut(devIBounds);
 
-    SkIRect devIBounds;
-    devBounds->roundOut(&devIBounds);
-
-    if (!this->placeParsedPathInAtlas(clipIBounds, devIBounds, devToAtlasOffset)) {
+    if (!this->placeParsedPathInAtlas(clipIBounds, *devIBounds, devToAtlasOffset)) {
         SkDEBUGCODE(--fEndPathInstance);
         return nullptr;  // Path was degenerate or clipped away.
     }
-    return &fAtlasStack.current();
+    return &fRenderedAtlasStack.current();
 }
 
 const GrCCAtlas* GrCCPerFlushResources::renderDeviceSpacePathInAtlas(
@@ -118,7 +202,7 @@
     if (!this->placeParsedPathInAtlas(clipIBounds, devPathIBounds, devToAtlasOffset)) {
         return nullptr;
     }
-    return &fAtlasStack.current();
+    return &fRenderedAtlasStack.current();
 }
 
 bool GrCCPerFlushResources::placeParsedPathInAtlas(const SkIRect& clipIBounds,
@@ -137,7 +221,8 @@
         return false;
     }
 
-    if (GrCCAtlas* retiredAtlas = fAtlasStack.addRect(clippedPathIBounds, devToAtlasOffset)) {
+    if (GrCCAtlas* retiredAtlas =
+                fRenderedAtlasStack.addRect(clippedPathIBounds, devToAtlasOffset)) {
         // We did not fit in the previous coverage count atlas and it was retired. Close the path
         // parser's current batch (which does not yet include the path we just parsed). We will
         // render this batch into the retired atlas during finalize().
@@ -149,16 +234,21 @@
 }
 
 bool GrCCPerFlushResources::finalize(GrOnFlushResourceProvider* onFlushRP,
+                                     sk_sp<GrTextureProxy> stashedAtlasProxy,
                                      SkTArray<sk_sp<GrRenderTargetContext>>* out) {
     SkASSERT(this->isMapped());
     SkASSERT(fNextPathInstanceIdx == fEndPathInstance);
+    // No assert for fEndCopyInstance because the caller may have detected and skipped duplicates.
 
     fInstanceBuffer->unmap();
     fPathInstanceData = nullptr;
 
-    if (!fAtlasStack.empty()) {
+    if (!fCopyAtlasStack.empty()) {
+        fCopyAtlasStack.current().setUserBatchID(fNextCopyInstanceIdx);
+    }
+    if (!fRenderedAtlasStack.empty()) {
         CoverageCountBatchID batchID = fPathParser.closeCurrentBatch();
-        fAtlasStack.current().setUserBatchID(batchID);
+        fRenderedAtlasStack.current().setUserBatchID(batchID);
     }
 
     // Build the GPU buffers to render path coverage counts. (This must not happen until after the
@@ -168,8 +258,30 @@
         return false;
     }
 
-    // Render the atlas(es).
-    for (GrCCAtlasStack::Iter atlas(fAtlasStack); atlas.next();) {
+    // Draw the copies from the stashed atlas into 8-bit cached atlas(es).
+    int baseCopyInstance = 0;
+    for (GrCCAtlasStack::Iter atlas(fCopyAtlasStack); atlas.next();) {
+        int endCopyInstance = atlas->getUserBatchID();
+        if (endCopyInstance <= baseCopyInstance) {
+            SkASSERT(endCopyInstance == baseCopyInstance);
+            continue;
+        }
+        if (auto rtc = atlas->makeRenderTargetContext(onFlushRP)) {
+            GrContext* ctx = rtc->surfPriv().getContext();
+            auto op = CopyAtlasOp::Make(ctx, sk_ref_sp(this), stashedAtlasProxy, baseCopyInstance,
+                                        endCopyInstance, atlas->drawBounds());
+            rtc->addDrawOp(GrNoClip(), std::move(op));
+            out->push_back(std::move(rtc));
+        }
+        baseCopyInstance = endCopyInstance;
+    }
+
+    // Release the stashed atlas before creating new one(s). This allows us to recycle the same
+    // underlying texture with the upcoming rendered atlases.
+    stashedAtlasProxy = nullptr;
+
+    // Render the coverage count atlas(es).
+    for (GrCCAtlasStack::Iter atlas(fRenderedAtlasStack); atlas.next();) {
         if (auto rtc = atlas->makeRenderTargetContext(onFlushRP)) {
             auto op = RenderAtlasOp::Make(rtc->surfPriv().getContext(), sk_ref_sp(this),
                                           atlas->getUserBatchID(), atlas->drawBounds());
@@ -180,3 +292,22 @@
 
     return true;
 }
+
+void GrCCPerFlushResourceSpecs::convertCopiesToRenders() {
+    fNumRenderedPaths += fNumCopiedPaths;
+    fNumCopiedPaths = 0;
+
+    fRenderedAtlasSpecs.fApproxNumPixels += fCopyAtlasSpecs.fApproxNumPixels;
+    fRenderedAtlasSpecs.fMinWidth =
+            SkTMax(fRenderedAtlasSpecs.fMinWidth, fCopyAtlasSpecs.fMinWidth);
+    fRenderedAtlasSpecs.fMinHeight =
+            SkTMax(fRenderedAtlasSpecs.fMinHeight, fCopyAtlasSpecs.fMinHeight);
+    fCopyAtlasSpecs = GrCCAtlas::Specs();
+
+    fRenderedPathStats.fMaxPointsPerPath =
+            SkTMax(fRenderedPathStats.fMaxPointsPerPath, fCopyPathStats.fMaxPointsPerPath);
+    fRenderedPathStats.fNumTotalSkPoints += fCopyPathStats.fNumTotalSkPoints;
+    fRenderedPathStats.fNumTotalSkVerbs += fCopyPathStats.fNumTotalSkVerbs;
+    fRenderedPathStats.fNumTotalConicWeights += fCopyPathStats.fNumTotalConicWeights;
+    fCopyPathStats = GrCCPathParser::PathStats();
+}
diff --git a/src/gpu/ccpr/GrCCPerFlushResources.h b/src/gpu/ccpr/GrCCPerFlushResources.h
index e920c06..cdc89f8 100644
--- a/src/gpu/ccpr/GrCCPerFlushResources.h
+++ b/src/gpu/ccpr/GrCCPerFlushResources.h
@@ -13,17 +13,29 @@
 #include "ccpr/GrCCPathParser.h"
 #include "ccpr/GrCCPathProcessor.h"
 
+class GrCCPathCacheEntry;
+class GrOnFlushResourceProvider;
+
 /**
  * This struct encapsulates the minimum and desired requirements for the GPU resources required by
  * CCPR in a given flush.
  */
 struct GrCCPerFlushResourceSpecs {
+    int fNumCachedPaths = 0;
+
+    int fNumCopiedPaths = 0;
+    GrCCPathParser::PathStats fCopyPathStats;
+    GrCCAtlas::Specs fCopyAtlasSpecs;
+
     int fNumRenderedPaths = 0;
     int fNumClipPaths = 0;
-    GrCCPathParser::PathStats fParsingPathStats;
-    GrCCAtlas::Specs fAtlasSpecs;
+    GrCCPathParser::PathStats fRenderedPathStats;
+    GrCCAtlas::Specs fRenderedAtlasSpecs;
 
-    bool isEmpty() const { return 0 == fNumRenderedPaths + fNumClipPaths; }
+    bool isEmpty() const {
+        return 0 == fNumCachedPaths + fNumCopiedPaths + fNumRenderedPaths + fNumClipPaths;
+    }
+    void convertCopiesToRenders();
 };
 
 /**
@@ -37,9 +49,17 @@
 
     bool isMapped() const { return SkToBool(fPathInstanceData); }
 
-    // Renders a path into a temporary atlas. See GrCCPathParser for a description of the arguments.
+    // Copies a path out of the the previous flush's stashed mainline coverage count atlas, and into
+    // a cached, 8-bit, literal-coverage atlas. The actual source texture to copy from will be
+    // provided at the time finalize() is called.
+    GrCCAtlas* copyPathToCachedAtlas(const GrCCPathCacheEntry&, GrCCPathProcessor::DoEvenOddFill,
+                                     SkIVector* newAtlasOffset);
+
+    // These two methods render a path into a temporary coverage count atlas. See GrCCPathParser for
+    // a description of the arguments. The returned atlases are "const" to prevent the caller from
+    // assigning a unique key.
     const GrCCAtlas* renderPathInAtlas(const SkIRect& clipIBounds, const SkMatrix&, const SkPath&,
-                                       SkRect* devBounds, SkRect* devBounds45,
+                                       SkRect* devBounds, SkRect* devBounds45, SkIRect* devIBounds,
                                        SkIVector* devToAtlasOffset);
     const GrCCAtlas* renderDeviceSpacePathInAtlas(const SkIRect& clipIBounds, const SkPath& devPath,
                                                   const SkIRect& devPathIBounds,
@@ -58,8 +78,11 @@
         return fPathInstanceData[fNextPathInstanceIdx++];
     }
 
-    // Finishes off the GPU buffers and renders the atlas(es).
-    bool finalize(GrOnFlushResourceProvider*, SkTArray<sk_sp<GrRenderTargetContext>>* out);
+    // Finishes off the GPU buffers and renders the atlas(es). 'stashedAtlasProxy', if provided, is
+    // the mainline coverage count atlas from the previous flush. It will be used as the source
+    // texture for any copies setup by copyStashedPathToAtlas().
+    bool finalize(GrOnFlushResourceProvider*, sk_sp<GrTextureProxy> stashedAtlasProxy,
+                  SkTArray<sk_sp<GrRenderTargetContext>>* out);
 
     // Accessors used by draw calls, once the resources have been finalized.
     const GrCCPathParser& pathParser() const { SkASSERT(!this->isMapped()); return fPathParser; }
@@ -67,19 +90,38 @@
     const GrBuffer* vertexBuffer() const { SkASSERT(!this->isMapped()); return fVertexBuffer.get();}
     GrBuffer* instanceBuffer() const { SkASSERT(!this->isMapped()); return fInstanceBuffer.get(); }
 
+    // Returns the mainline coverage count atlas that the client may stash for next flush, if any.
+    // The caller is responsible to call getOrAssignUniqueKey() on this atlas if they wish to
+    // actually stash it in order to copy paths into cached atlases.
+    GrCCAtlas* nextAtlasToStash() {
+        return fRenderedAtlasStack.empty() ? nullptr : &fRenderedAtlasStack.front();
+    }
+
+    // Returs true if the client has called getOrAssignUniqueKey() on our nextAtlasToStash().
+    bool hasStashedAtlas() const {
+        return !fRenderedAtlasStack.empty() && fRenderedAtlasStack.front().uniqueKey().isValid();
+    }
+    const GrUniqueKey& stashedAtlasKey() const  {
+        SkASSERT(this->hasStashedAtlas());
+        return fRenderedAtlasStack.front().uniqueKey();
+    }
+
 private:
     bool placeParsedPathInAtlas(const SkIRect& clipIBounds, const SkIRect& pathIBounds,
                                 SkIVector* devToAtlasOffset);
 
     GrCCPathParser fPathParser;
-    GrCCAtlasStack fAtlasStack;
+    GrCCAtlasStack fCopyAtlasStack;
+    GrCCAtlasStack fRenderedAtlasStack;
 
     const sk_sp<const GrBuffer> fIndexBuffer;
     const sk_sp<const GrBuffer> fVertexBuffer;
     const sk_sp<GrBuffer> fInstanceBuffer;
 
     GrCCPathProcessor::Instance* fPathInstanceData = nullptr;
-    int fNextPathInstanceIdx = 0;
+    int fNextCopyInstanceIdx;
+    SkDEBUGCODE(int fEndCopyInstance);
+    int fNextPathInstanceIdx;
     SkDEBUGCODE(int fEndPathInstance);
 };
 
diff --git a/src/gpu/ccpr/GrCCSTLList.h b/src/gpu/ccpr/GrCCSTLList.h
index aed61ea..dec257d 100644
--- a/src/gpu/ccpr/GrCCSTLList.h
+++ b/src/gpu/ccpr/GrCCSTLList.h
@@ -45,14 +45,16 @@
         fTail = !nextTail ? newRightHead : nextTail;
     }
 
-    struct Iter {
+    template<typename U> struct Iter {
         bool operator!=(const Iter& that) { return fCurr != that.fCurr; }
-        const T& operator*() { return *fCurr; }
+        U& operator*() { return *fCurr; }
         void operator++() { fCurr = fCurr->fNext; }
-        const T* fCurr;
+        U* fCurr;
     };
-    Iter begin() const { return Iter{&fHead}; }
-    Iter end() const { return Iter{nullptr}; }
+    Iter<const T> begin() const { return Iter<const T>{&fHead}; }
+    Iter<const T> end() const { return Iter<const T>{nullptr}; }
+    Iter<T> begin() { return Iter<T>{&fHead}; }
+    Iter<T> end() { return Iter<T>{nullptr}; }
 
 private:
     T fHead;
diff --git a/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp b/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
index eaab184..122569c 100644
--- a/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
+++ b/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
@@ -50,6 +50,8 @@
            caps.instanceAttribSupport() && GrCaps::kNone_MapFlags != caps.mapBufferFlags() &&
            caps.isConfigTexturable(kAlpha_half_GrPixelConfig) &&
            caps.isConfigRenderable(kAlpha_half_GrPixelConfig) &&
+           caps.isConfigTexturable(kAlpha_8_GrPixelConfig) &&
+           caps.isConfigRenderable(kAlpha_8_GrPixelConfig) &&
            !caps.blacklistCoverageCounting();
 }
 
@@ -112,24 +114,22 @@
     GrRenderTargetContext* rtc = args.fRenderTargetContext;
     args.fClip->getConservativeBounds(rtc->width(), rtc->height(), &clipIBounds, nullptr);
 
-    SkPath path;
-    args.fShape->asPath(&path);
-
     SkRect devBounds;
-    args.fViewMatrix->mapRect(&devBounds, path.getBounds());
+    args.fViewMatrix->mapRect(&devBounds, args.fShape->bounds());
 
     std::unique_ptr<GrCCDrawPathsOp> op;
     if (SkTMax(devBounds.height(), devBounds.width()) > kPathCropThreshold) {
         // The path is too large. Crop it or analytic AA can run out of fp32 precision.
         SkPath croppedPath;
-        path.transform(*args.fViewMatrix, &croppedPath);
+        args.fShape->asPath(&croppedPath);
+        croppedPath.transform(*args.fViewMatrix, &croppedPath);
         crop_path(croppedPath, clipIBounds, &croppedPath);
         // FIXME: This breaks local coords: http://skbug.com/8003
-        op = GrCCDrawPathsOp::Make(args.fContext, clipIBounds, SkMatrix::I(), croppedPath,
+        op = GrCCDrawPathsOp::Make(args.fContext, clipIBounds, SkMatrix::I(), GrShape(croppedPath),
                                    croppedPath.getBounds(), std::move(args.fPaint));
     } else {
-        op = GrCCDrawPathsOp::Make(args.fContext, clipIBounds, *args.fViewMatrix, path, devBounds,
-                                   std::move(args.fPaint));
+        op = GrCCDrawPathsOp::Make(args.fContext, clipIBounds, *args.fViewMatrix, *args.fShape,
+                                   devBounds, std::move(args.fPaint));
     }
 
     this->recordOp(std::move(op), args);
@@ -179,18 +179,37 @@
 void GrCoverageCountingPathRenderer::preFlush(GrOnFlushResourceProvider* onFlushRP,
                                               const uint32_t* opListIDs, int numOpListIDs,
                                               SkTArray<sk_sp<GrRenderTargetContext>>* out) {
+    using DoCopiesToCache = GrCCDrawPathsOp::DoCopiesToCache;
     SkASSERT(!fFlushing);
     SkASSERT(fFlushingPaths.empty());
     SkDEBUGCODE(fFlushing = true);
 
+    // Dig up the stashed atlas from the previous flush (if any) so we can attempt to copy any
+    // reusable paths out of it and into the resource cache. We also need to clear its unique key.
+    sk_sp<GrTextureProxy> stashedAtlasProxy;
+    if (fStashedAtlasKey.isValid()) {
+        stashedAtlasProxy = onFlushRP->findOrCreateProxyByUniqueKey(fStashedAtlasKey,
+                                                                    GrCCAtlas::kTextureOrigin);
+        if (stashedAtlasProxy) {
+            // Instantiate the proxy so we can clear the underlying texture's unique key.
+            onFlushRP->instatiateProxy(stashedAtlasProxy.get());
+            onFlushRP->removeUniqueKeyFromProxy(fStashedAtlasKey, stashedAtlasProxy.get());
+        } else {
+            fStashedAtlasKey.reset();  // Indicate there is no stashed atlas to copy from.
+        }
+    }
+
     if (fPendingPaths.empty()) {
+        fStashedAtlasKey.reset();
         return;  // Nothing to draw.
     }
 
-    GrCCPerFlushResourceSpecs resourceSpecs;
+    GrCCPerFlushResourceSpecs specs;
     int maxPreferredRTSize = onFlushRP->caps()->maxPreferredRenderTargetSize();
-    resourceSpecs.fAtlasSpecs.fMaxPreferredTextureSize = maxPreferredRTSize;
-    resourceSpecs.fAtlasSpecs.fMinTextureSize = SkTMin(1024, maxPreferredRTSize);
+    specs.fCopyAtlasSpecs.fMaxPreferredTextureSize = SkTMin(2048, maxPreferredRTSize);
+    SkASSERT(0 == specs.fCopyAtlasSpecs.fMinTextureSize);
+    specs.fRenderedAtlasSpecs.fMaxPreferredTextureSize = maxPreferredRTSize;
+    specs.fRenderedAtlasSpecs.fMinTextureSize = SkTMin(1024, maxPreferredRTSize);
 
     // Move the per-opList paths that are about to be flushed from fPendingPaths to fFlushingPaths,
     // and count them up so we can preallocate buffers.
@@ -204,40 +223,49 @@
         fFlushingPaths.push_back(std::move(iter->second));
         fPendingPaths.erase(iter);
 
-        for (const GrCCDrawPathsOp* op : fFlushingPaths.back()->fDrawOps) {
-            op->accountForOwnPaths(&resourceSpecs);
+        for (GrCCDrawPathsOp* op : fFlushingPaths.back()->fDrawOps) {
+            op->accountForOwnPaths(&fPathCache, onFlushRP, fStashedAtlasKey, &specs);
         }
         for (const auto& clipsIter : fFlushingPaths.back()->fClipPaths) {
-            clipsIter.second.accountForOwnPath(&resourceSpecs);
+            clipsIter.second.accountForOwnPath(&specs);
         }
     }
+    fStashedAtlasKey.reset();
 
-    if (resourceSpecs.isEmpty()) {
+    if (specs.isEmpty()) {
         return;  // Nothing to draw.
     }
 
-    auto resources = sk_make_sp<GrCCPerFlushResources>(onFlushRP, resourceSpecs);
+    // Determine if there are enough reusable paths from last flush for it to be worth our time to
+    // copy them to cached atlas(es).
+    DoCopiesToCache doCopies = DoCopiesToCache(specs.fNumCopiedPaths > 100 ||
+                                               specs.fCopyAtlasSpecs.fApproxNumPixels > 512 * 256);
+    if (specs.fNumCopiedPaths && DoCopiesToCache::kNo == doCopies) {
+        specs.convertCopiesToRenders();
+        SkASSERT(!specs.fNumCopiedPaths);
+    }
+
+    auto resources = sk_make_sp<GrCCPerFlushResources>(onFlushRP, specs);
     if (!resources->isMapped()) {
         return;  // Some allocation failed.
     }
 
-    // Layout atlas(es) and parse paths.
-    SkDEBUGCODE(int numSkippedPaths = 0);
+    // Layout the atlas(es) and parse paths.
     for (const auto& flushingPaths : fFlushingPaths) {
         for (GrCCDrawPathsOp* op : flushingPaths->fDrawOps) {
-            op->setupResources(resources.get(), onFlushRP);
-            SkDEBUGCODE(numSkippedPaths += op->numSkippedInstances_debugOnly());
+            op->setupResources(onFlushRP, resources.get(), doCopies);
         }
         for (auto& clipsIter : flushingPaths->fClipPaths) {
             clipsIter.second.renderPathInAtlas(resources.get(), onFlushRP);
         }
     }
-    SkASSERT(resources->nextPathInstanceIdx() == resourceSpecs.fNumRenderedPaths - numSkippedPaths);
 
-    // Allocate the atlases and create instance buffers to draw them.
-    if (!resources->finalize(onFlushRP, out)) {
+    // Allocate resources and then render the atlas(es).
+    if (!resources->finalize(onFlushRP, std::move(stashedAtlasProxy), out)) {
         return;
     }
+    // Verify the stashed atlas got released so its texture could be recycled.
+    SkASSERT(!stashedAtlasProxy);
 
     // Commit flushing paths to the resources once they are successfully completed.
     for (auto& flushingPaths : fFlushingPaths) {
@@ -249,14 +277,24 @@
 void GrCoverageCountingPathRenderer::postFlush(GrDeferredUploadToken, const uint32_t* opListIDs,
                                                int numOpListIDs) {
     SkASSERT(fFlushing);
+    SkASSERT(!fStashedAtlasKey.isValid());  // Should have been cleared in preFlush().
 
-    // In DDL mode these aren't guaranteed to be deleted so we must clear out the perFlush
-    // resources manually.
-    for (auto& flushingPaths : fFlushingPaths) {
-        flushingPaths->fFlushResources = nullptr;
+    if (!fFlushingPaths.empty()) {
+        // Note the stashed atlas's key for next flush, if any.
+        auto resources = fFlushingPaths.front()->fFlushResources.get();
+        if (resources && resources->hasStashedAtlas()) {
+            fStashedAtlasKey = resources->stashedAtlasKey();
+        }
+
+        // In DDL mode these aren't guaranteed to be deleted so we must clear out the perFlush
+        // resources manually.
+        for (auto& flushingPaths : fFlushingPaths) {
+            flushingPaths->fFlushResources = nullptr;
+        }
+
+        // We wait to erase these until after flush, once Ops and FPs are done accessing their data.
+        fFlushingPaths.reset();
     }
 
-    // We wait to erase these until after flush, once Ops and FPs are done accessing their data.
-    fFlushingPaths.reset();
     SkDEBUGCODE(fFlushing = false);
 }
diff --git a/src/gpu/ccpr/GrCoverageCountingPathRenderer.h b/src/gpu/ccpr/GrCoverageCountingPathRenderer.h
index 8cb9713..0007319 100644
--- a/src/gpu/ccpr/GrCoverageCountingPathRenderer.h
+++ b/src/gpu/ccpr/GrCoverageCountingPathRenderer.h
@@ -11,6 +11,7 @@
 #include "GrCCPerOpListPaths.h"
 #include "GrPathRenderer.h"
 #include "GrRenderTargetOpList.h"
+#include "ccpr/GrCCPathCache.h"
 #include "ccpr/GrCCPerFlushResources.h"
 #include <map>
 
@@ -70,6 +71,8 @@
                   SkTArray<sk_sp<GrRenderTargetContext>>* out) override;
     void postFlush(GrDeferredUploadToken, const uint32_t* opListIDs, int numOpListIDs) override;
 
+    const GrUniqueKey& testingOnly_getStashedAtlasKey() const;
+
 private:
     GrCoverageCountingPathRenderer(bool drawCachablePaths)
             : fDrawCachablePaths(drawCachablePaths) {}
@@ -85,6 +88,10 @@
     // fFlushingPaths holds the GrCCPerOpListPaths objects that are currently being flushed.
     // (It will only contain elements when fFlushing is true.)
     SkSTArray<4, sk_sp<GrCCPerOpListPaths>> fFlushingPaths;
+
+    GrCCPathCache fPathCache;
+    GrUniqueKey fStashedAtlasKey;
+
     SkDEBUGCODE(bool fFlushing = false);
 
     const bool fDrawCachablePaths;
