diff --git a/src/gpu/ccpr/GrCCGeometry.cpp b/src/gpu/ccpr/GrCCFillGeometry.cpp
similarity index 94%
rename from src/gpu/ccpr/GrCCGeometry.cpp
rename to src/gpu/ccpr/GrCCFillGeometry.cpp
index 17a54af..81692cf 100644
--- a/src/gpu/ccpr/GrCCGeometry.cpp
+++ b/src/gpu/ccpr/GrCCFillGeometry.cpp
@@ -5,7 +5,7 @@
  * found in the LICENSE file.
  */
 
-#include "GrCCGeometry.h"
+#include "GrCCFillGeometry.h"
 
 #include "GrTypes.h"
 #include "SkGeometry.h"
@@ -13,19 +13,14 @@
 #include <cmath>
 #include <cstdlib>
 
-// We convert between SkPoint and Sk2f freely throughout this file.
-GR_STATIC_ASSERT(SK_SCALAR_IS_FLOAT);
-GR_STATIC_ASSERT(2 * sizeof(float) == sizeof(SkPoint));
-GR_STATIC_ASSERT(0 == offsetof(SkPoint, fX));
-
 static constexpr float kFlatnessThreshold = 1/16.f; // 1/16 of a pixel.
 
-void GrCCGeometry::beginPath() {
+void GrCCFillGeometry::beginPath() {
     SkASSERT(!fBuildingContour);
     fVerbs.push_back(Verb::kBeginPath);
 }
 
-void GrCCGeometry::beginContour(const SkPoint& pt) {
+void GrCCFillGeometry::beginContour(const SkPoint& pt) {
     SkASSERT(!fBuildingContour);
     // Store the current verb count in the fTriangles field for now. When we close the contour we
     // will use this value to calculate the actual number of triangles in its fan.
@@ -38,7 +33,7 @@
     SkDEBUGCODE(fBuildingContour = true);
 }
 
-void GrCCGeometry::lineTo(const SkPoint P[2]) {
+void GrCCFillGeometry::lineTo(const SkPoint P[2]) {
     SkASSERT(fBuildingContour);
     SkASSERT(P[0] == fPoints.back());
     Sk2f p0 = Sk2f::Load(P);
@@ -46,7 +41,7 @@
     this->appendLine(p0, p1);
 }
 
-inline void GrCCGeometry::appendLine(const Sk2f& p0, const Sk2f& p1) {
+inline void GrCCFillGeometry::appendLine(const Sk2f& p0, const Sk2f& p1) {
     SkASSERT(fPoints.back() == SkPoint::Make(p0[0], p0[1]));
     if ((p0 == p1).allTrue()) {
         return;
@@ -138,7 +133,7 @@
     return SkNx_fma(t, b - a, a);
 }
 
-void GrCCGeometry::quadraticTo(const SkPoint P[3]) {
+void GrCCFillGeometry::quadraticTo(const SkPoint P[3]) {
     SkASSERT(fBuildingContour);
     SkASSERT(P[0] == fPoints.back());
     Sk2f p0 = Sk2f::Load(P);
@@ -155,7 +150,7 @@
     this->appendQuadratics(p0, p1, p2);
 }
 
-inline void GrCCGeometry::appendQuadratics(const Sk2f& p0, const Sk2f& p1, const Sk2f& p2) {
+inline void GrCCFillGeometry::appendQuadratics(const Sk2f& p0, const Sk2f& p1, const Sk2f& p2) {
     Sk2f tan0 = p1 - p0;
     Sk2f tan1 = p2 - p1;
 
@@ -193,7 +188,8 @@
     this->appendMonotonicQuadratic(p012, p12, p2);
 }
 
-inline void GrCCGeometry::appendMonotonicQuadratic(const Sk2f& p0, const Sk2f& p1, const Sk2f& p2) {
+inline void GrCCFillGeometry::appendMonotonicQuadratic(const Sk2f& p0, const Sk2f& p1,
+                                                       const Sk2f& p2) {
     // Don't send curves to the GPU if we know they are nearly flat (or just very small).
     if (are_collinear(p0, p1, p2)) {
         this->appendLine(p0, p2);
@@ -465,7 +461,7 @@
     }
 }
 
-void GrCCGeometry::cubicTo(const SkPoint P[4], float inflectPad, float loopIntersectPad) {
+void GrCCFillGeometry::cubicTo(const SkPoint P[4], float inflectPad, float loopIntersectPad) {
     SkASSERT(fBuildingContour);
     SkASSERT(P[0] == fPoints.back());
 
@@ -541,9 +537,9 @@
     *abcd = lerp(*abc, *bcd, TT);
 }
 
-void GrCCGeometry::appendCubics(AppendCubicMode mode, const Sk2f& p0, const Sk2f& p1,
-                                const Sk2f& p2, const Sk2f& p3, const float chops[], int numChops,
-                                float localT0, float localT1) {
+void GrCCFillGeometry::appendCubics(AppendCubicMode mode, const Sk2f& p0, const Sk2f& p1,
+                                    const Sk2f& p2, const Sk2f& p3, const float chops[],
+                                    int numChops, float localT0, float localT1) {
     if (numChops) {
         SkASSERT(numChops > 0);
         int midChopIdx = numChops/2;
@@ -576,8 +572,8 @@
     this->appendCubics(mode, p0, p1, p2, p3);
 }
 
-void GrCCGeometry::appendCubics(AppendCubicMode mode, const Sk2f& p0, const Sk2f& p1,
-                                const Sk2f& p2, const Sk2f& p3, int maxSubdivisions) {
+void GrCCFillGeometry::appendCubics(AppendCubicMode mode, const Sk2f& p0, const Sk2f& p1,
+                                    const Sk2f& p2, const Sk2f& p3, int maxSubdivisions) {
     if (SkCubicType::kLoop != fCurrCubicType) {
         // Serpentines and cusps are always monotonic after chopping around inflection points.
         SkASSERT(!SkCubicIsDegenerate(fCurrCubicType));
@@ -672,11 +668,11 @@
     return std::abs(q*q - r) < std::abs(a*c - r) ? q/a : c/q;
 }
 
-inline void GrCCGeometry::chopAndAppendCubicAtMidTangent(AppendCubicMode mode, const Sk2f& p0,
-                                                         const Sk2f& p1, const Sk2f& p2,
-                                                         const Sk2f& p3, const Sk2f& tan0,
-                                                         const Sk2f& tan1,
-                                                         int maxFutureSubdivisions) {
+inline void GrCCFillGeometry::chopAndAppendCubicAtMidTangent(AppendCubicMode mode, const Sk2f& p0,
+                                                             const Sk2f& p1, const Sk2f& p2,
+                                                             const Sk2f& p3, const Sk2f& tan0,
+                                                             const Sk2f& tan1,
+                                                             int maxFutureSubdivisions) {
     float midT = find_midtangent(tan0, tan1, p3 + (p1 - p2)*3 - p0,
                                              (p0 - p1*2 + p2)*2,
                                              p1 - p0);
@@ -694,7 +690,7 @@
     this->appendCubics(mode, pT, p11, p12, p3, maxFutureSubdivisions);
 }
 
-void GrCCGeometry::conicTo(const SkPoint P[3], float w) {
+void GrCCFillGeometry::conicTo(const SkPoint P[3], float w) {
     SkASSERT(fBuildingContour);
     SkASSERT(P[0] == fPoints.back());
     Sk2f p0 = Sk2f::Load(P);
@@ -743,7 +739,8 @@
     this->appendMonotonicConic(p0, p1, p2, w);
 }
 
-void GrCCGeometry::appendMonotonicConic(const Sk2f& p0, const Sk2f& p1, const Sk2f& p2, float w) {
+void GrCCFillGeometry::appendMonotonicConic(const Sk2f& p0, const Sk2f& p1, const Sk2f& p2,
+                                            float w) {
     SkASSERT(w >= 0);
 
     Sk2f base = p2 - p0;
@@ -784,7 +781,7 @@
     ++fCurrContourTallies.fConics;
 }
 
-GrCCGeometry::PrimitiveTallies GrCCGeometry::endContour() {
+GrCCFillGeometry::PrimitiveTallies GrCCFillGeometry::endContour() {
     SkASSERT(fBuildingContour);
     SkASSERT(fVerbs.count() >= fCurrContourTallies.fTriangles);
 
diff --git a/src/gpu/ccpr/GrCCGeometry.h b/src/gpu/ccpr/GrCCFillGeometry.h
similarity index 83%
rename from src/gpu/ccpr/GrCCGeometry.h
rename to src/gpu/ccpr/GrCCFillGeometry.h
index 5c5d1d2..df817db 100644
--- a/src/gpu/ccpr/GrCCGeometry.h
+++ b/src/gpu/ccpr/GrCCFillGeometry.h
@@ -5,8 +5,8 @@
  * found in the LICENSE file.
  */
 
-#ifndef GrGrCCGeometry_DEFINED
-#define GrGrCCGeometry_DEFINED
+#ifndef GrGrCCFillGeometry_DEFINED
+#define GrGrCCFillGeometry_DEFINED
 
 #include "SkGeometry.h"
 #include "SkNx.h"
@@ -15,14 +15,14 @@
 
 /**
  * This class chops device-space contours up into a series of segments that CCPR knows how to
- * render. (See GrCCGeometry::Verb.)
+ * fill. (See GrCCFillGeometry::Verb.)
  *
  * NOTE: This must be done in device space, since an affine transformation can change whether a
  * curve is monotonic.
  */
-class GrCCGeometry {
+class GrCCFillGeometry {
 public:
-    // These are the verbs that CCPR knows how to draw. If a path has any segments that don't map to
+    // These are the verbs that CCPR knows how to fill. If a path has any segments that don't map to
     // this list, then they are chopped into smaller ones that do. A list of these comprise a
     // compact representation of what can later be expanded into GPU instance data.
     enum class Verb : uint8_t {
@@ -49,7 +49,7 @@
         bool operator==(const PrimitiveTallies&);
     };
 
-    GrCCGeometry(int numSkPoints = 0, int numSkVerbs = 0, int numConicWeights = 0)
+    GrCCFillGeometry(int numSkPoints = 0, int numSkVerbs = 0, int numConicWeights = 0)
             : fPoints(numSkPoints * 3) // Reserve for a 3x expansion in points and verbs.
             , fVerbs(numSkVerbs * 3)
             , fConicWeights(numConicWeights * 3/2) {}
@@ -64,17 +64,6 @@
         fVerbs.reset();
     }
 
-    // This is included in case the caller needs to discard previously added contours. It is up to
-    // the caller to track counts and ensure we don't pop back into the middle of a different
-    // contour.
-    void resize_back(int numPoints, int numVerbs) {
-        SkASSERT(!fBuildingContour);
-        fPoints.resize_back(numPoints);
-        fVerbs.resize_back(numVerbs);
-        SkASSERT(fVerbs.empty() || fVerbs.back() == Verb::kEndOpenContour ||
-                 fVerbs.back() == Verb::kEndClosedContour);
-    }
-
     void beginPath();
     void beginContour(const SkPoint&);
     void lineTo(const SkPoint P[2]);
@@ -129,7 +118,7 @@
     SkSTArray<32, float, true> fConicWeights;
 };
 
-inline void GrCCGeometry::PrimitiveTallies::operator+=(const PrimitiveTallies& b) {
+inline void GrCCFillGeometry::PrimitiveTallies::operator+=(const PrimitiveTallies& b) {
     fTriangles += b.fTriangles;
     fWeightedTriangles += b.fWeightedTriangles;
     fQuadratics += b.fQuadratics;
@@ -137,8 +126,8 @@
     fConics += b.fConics;
 }
 
-GrCCGeometry::PrimitiveTallies
-inline GrCCGeometry::PrimitiveTallies::operator-(const PrimitiveTallies& b) const {
+GrCCFillGeometry::PrimitiveTallies
+inline GrCCFillGeometry::PrimitiveTallies::operator-(const PrimitiveTallies& b) const {
     return {fTriangles - b.fTriangles,
             fWeightedTriangles - b.fWeightedTriangles,
             fQuadratics - b.fQuadratics,
@@ -146,7 +135,7 @@
             fConics - b.fConics};
 }
 
-inline bool GrCCGeometry::PrimitiveTallies::operator==(const PrimitiveTallies& b) {
+inline bool GrCCFillGeometry::PrimitiveTallies::operator==(const PrimitiveTallies& b) {
     return fTriangles == b.fTriangles && fWeightedTriangles == b.fWeightedTriangles &&
            fQuadratics == b.fQuadratics && fCubics == b.fCubics && fConics == b.fConics;
 }
diff --git a/src/gpu/ccpr/GrCCPathParser.cpp b/src/gpu/ccpr/GrCCFiller.cpp
similarity index 64%
rename from src/gpu/ccpr/GrCCPathParser.cpp
rename to src/gpu/ccpr/GrCCFiller.cpp
index 190f162..cdace98 100644
--- a/src/gpu/ccpr/GrCCPathParser.cpp
+++ b/src/gpu/ccpr/GrCCFiller.cpp
@@ -5,7 +5,7 @@
  * found in the LICENSE file.
  */
 
-#include "GrCCPathParser.h"
+#include "GrCCFiller.h"
 
 #include "GrCaps.h"
 #include "GrGpuCommandBuffer.h"
@@ -15,105 +15,36 @@
 #include "SkPath.h"
 #include "SkPathPriv.h"
 #include "SkPoint.h"
-#include "ccpr/GrCCGeometry.h"
 #include <stdlib.h>
 
 using TriPointInstance = GrCCCoverageProcessor::TriPointInstance;
 using QuadPointInstance = GrCCCoverageProcessor::QuadPointInstance;
 
-GrCCPathParser::GrCCPathParser(int numPaths, const PathStats& pathStats)
-          // Overallocate by one point to accomodate for overflow with Sk4f. (See parsePath.)
-        : fLocalDevPtsBuffer(pathStats.fMaxPointsPerPath + 1)
-        , fGeometry(pathStats.fNumTotalSkPoints, pathStats.fNumTotalSkVerbs,
+GrCCFiller::GrCCFiller(int numPaths, const PathStats& pathStats)
+        : fGeometry(pathStats.fNumTotalSkPoints, pathStats.fNumTotalSkVerbs,
                     pathStats.fNumTotalConicWeights)
-        , fPathsInfo(numPaths)
+        , fPathInfos(numPaths)
         , fScissorSubBatches(numPaths)
         , fTotalPrimitiveCounts{PrimitiveTallies(), PrimitiveTallies()} {
     // Batches decide what to draw by looking where the previous one ended. Define initial batches
     // that "end" at the beginning of the data. These will not be drawn, but will only be be read by
     // the first actual batch.
     fScissorSubBatches.push_back() = {PrimitiveTallies(), SkIRect::MakeEmpty()};
-    fCoverageCountBatches.push_back() = {PrimitiveTallies(), fScissorSubBatches.count(),
-                                         PrimitiveTallies()};
+    fBatches.push_back() = {PrimitiveTallies(), fScissorSubBatches.count(), PrimitiveTallies()};
 }
 
-void GrCCPathParser::parsePath(const SkMatrix& m, const SkPath& path, SkRect* devBounds,
-                               SkRect* devBounds45) {
-    const SkPoint* pts = SkPathPriv::PointData(path);
-    int numPts = path.countPoints();
-    SkASSERT(numPts + 1 <= fLocalDevPtsBuffer.count());
+void GrCCFiller::parseDeviceSpaceFill(const SkPath& path, const SkPoint* deviceSpacePts,
+                                      GrScissorTest scissorTest, const SkIRect& clippedDevIBounds,
+                                      const SkIVector& devToAtlasOffset) {
+    SkASSERT(!fInstanceBuffer);  // Can't call after prepareToDraw().
+    SkASSERT(!path.isEmpty());
 
-    if (!numPts) {
-        devBounds->setEmpty();
-        devBounds45->setEmpty();
-        this->parsePath(path, nullptr);
-        return;
-    }
-
-    // m45 transforms path points into "45 degree" device space. A bounding box in this space gives
-    // the circumscribing octagon's diagonals. We could use SK_ScalarRoot2Over2, but an orthonormal
-    // transform is not necessary as long as the shader uses the correct inverse.
-    SkMatrix m45;
-    m45.setSinCos(1, 1);
-    m45.preConcat(m);
-
-    // X,Y,T are two parallel view matrices that accumulate two bounding boxes as they map points:
-    // device-space bounds and "45 degree" device-space bounds (| 1 -1 | * devCoords).
-    //                                                          | 1  1 |
-    Sk4f X = Sk4f(m.getScaleX(), m.getSkewY(), m45.getScaleX(), m45.getSkewY());
-    Sk4f Y = Sk4f(m.getSkewX(), m.getScaleY(), m45.getSkewX(), m45.getScaleY());
-    Sk4f T = Sk4f(m.getTranslateX(), m.getTranslateY(), m45.getTranslateX(), m45.getTranslateY());
-
-    // Map the path's points to device space and accumulate bounding boxes.
-    Sk4f devPt = SkNx_fma(Y, Sk4f(pts[0].y()), T);
-    devPt = SkNx_fma(X, Sk4f(pts[0].x()), devPt);
-    Sk4f topLeft = devPt;
-    Sk4f bottomRight = devPt;
-
-    // Store all 4 values [dev.x, dev.y, dev45.x, dev45.y]. We are only interested in the first two,
-    // and will overwrite [dev45.x, dev45.y] with the next point. This is why the dst buffer must
-    // be at least one larger than the number of points.
-    devPt.store(&fLocalDevPtsBuffer[0]);
-
-    for (int i = 1; i < numPts; ++i) {
-        devPt = SkNx_fma(Y, Sk4f(pts[i].y()), T);
-        devPt = SkNx_fma(X, Sk4f(pts[i].x()), devPt);
-        topLeft = Sk4f::Min(topLeft, devPt);
-        bottomRight = Sk4f::Max(bottomRight, devPt);
-        devPt.store(&fLocalDevPtsBuffer[i]);
-    }
-
-    SkPoint topLeftPts[2], bottomRightPts[2];
-    topLeft.store(topLeftPts);
-    bottomRight.store(bottomRightPts);
-    devBounds->setLTRB(topLeftPts[0].x(), topLeftPts[0].y(), bottomRightPts[0].x(),
-                       bottomRightPts[0].y());
-    devBounds45->setLTRB(topLeftPts[1].x(), topLeftPts[1].y(), bottomRightPts[1].x(),
-                         bottomRightPts[1].y());
-
-    this->parsePath(path, fLocalDevPtsBuffer.get());
-}
-
-void GrCCPathParser::parseDeviceSpacePath(const SkPath& deviceSpacePath) {
-    this->parsePath(deviceSpacePath, SkPathPriv::PointData(deviceSpacePath));
-}
-
-void GrCCPathParser::parsePath(const SkPath& path, const SkPoint* deviceSpacePts) {
-    SkASSERT(!fInstanceBuffer); // Can't call after finalize().
-    SkASSERT(!fParsingPath); // Call saveParsedPath() or discardParsedPath() for the last one first.
-    SkDEBUGCODE(fParsingPath = true);
-    SkASSERT(path.isEmpty() || deviceSpacePts);
-
-    fCurrPathPointsIdx = fGeometry.points().count();
-    fCurrPathVerbsIdx = fGeometry.verbs().count();
-    fCurrPathPrimitiveCounts = PrimitiveTallies();
+    int currPathPointsIdx = fGeometry.points().count();
+    int currPathVerbsIdx = fGeometry.verbs().count();
+    PrimitiveTallies currPathPrimitiveCounts = PrimitiveTallies();
 
     fGeometry.beginPath();
 
-    if (path.isEmpty()) {
-        return;
-    }
-
     const float* conicWeights = SkPathPriv::ConicWeightData(path);
     int ptsIdx = 0;
     int conicWeightsIdx = 0;
@@ -122,13 +53,17 @@
     for (SkPath::Verb verb : SkPathPriv::Verbs(path)) {
         switch (verb) {
             case SkPath::kMove_Verb:
-                this->endContourIfNeeded(insideContour);
+                if (insideContour) {
+                    currPathPrimitiveCounts += fGeometry.endContour();
+                }
                 fGeometry.beginContour(deviceSpacePts[ptsIdx]);
                 ++ptsIdx;
                 insideContour = true;
                 continue;
             case SkPath::kClose_Verb:
-                this->endContourIfNeeded(insideContour);
+                if (insideContour) {
+                    currPathPrimitiveCounts += fGeometry.endContour();
+                }
                 insideContour = false;
                 continue;
             case SkPath::kLine_Verb:
@@ -155,123 +90,124 @@
     SkASSERT(ptsIdx == path.countPoints());
     SkASSERT(conicWeightsIdx == SkPathPriv::ConicWeightCnt(path));
 
-    this->endContourIfNeeded(insideContour);
-}
-
-void GrCCPathParser::endContourIfNeeded(bool insideContour) {
     if (insideContour) {
-        fCurrPathPrimitiveCounts += fGeometry.endContour();
+        currPathPrimitiveCounts += fGeometry.endContour();
     }
-}
 
-void GrCCPathParser::saveParsedPath(GrScissorTest scissorTest, const SkIRect& clippedDevIBounds,
-                                    const SkIVector& devToAtlasOffset) {
-    SkASSERT(fParsingPath);
-
-    fPathsInfo.emplace_back(scissorTest, devToAtlasOffset);
+    fPathInfos.emplace_back(scissorTest, devToAtlasOffset);
 
     // Tessellate fans from very large and/or simple paths, in order to reduce overdraw.
-    int numVerbs = fGeometry.verbs().count() - fCurrPathVerbsIdx - 1;
+    int numVerbs = fGeometry.verbs().count() - currPathVerbsIdx - 1;
     int64_t tessellationWork = (int64_t)numVerbs * (32 - SkCLZ(numVerbs)); // N log N.
     int64_t fanningWork = (int64_t)clippedDevIBounds.height() * clippedDevIBounds.width();
     if (tessellationWork * (50*50) + (100*100) < fanningWork) { // Don't tessellate under 100x100.
-        fCurrPathPrimitiveCounts.fTriangles =
-                fCurrPathPrimitiveCounts.fWeightedTriangles = 0;
-
-        const SkTArray<GrCCGeometry::Verb, true>& verbs = fGeometry.verbs();
-        const SkTArray<SkPoint, true>& pts = fGeometry.points();
-        int ptsIdx = fCurrPathPointsIdx;
-
-        // Build an SkPath of the Redbook fan. We use "winding" fill type right now because we are
-        // producing a coverage count, and must fill in every region that has non-zero wind. The
-        // path processor will convert coverage count to the appropriate fill type later.
-        SkPath fan;
-        fan.setFillType(SkPath::kWinding_FillType);
-        SkASSERT(GrCCGeometry::Verb::kBeginPath == verbs[fCurrPathVerbsIdx]);
-        for (int i = fCurrPathVerbsIdx + 1; i < fGeometry.verbs().count(); ++i) {
-            switch (verbs[i]) {
-                case GrCCGeometry::Verb::kBeginPath:
-                    SK_ABORT("Invalid GrCCGeometry");
-                    continue;
-
-                case GrCCGeometry::Verb::kBeginContour:
-                    fan.moveTo(pts[ptsIdx++]);
-                    continue;
-
-                case GrCCGeometry::Verb::kLineTo:
-                    fan.lineTo(pts[ptsIdx++]);
-                    continue;
-
-                case GrCCGeometry::Verb::kMonotonicQuadraticTo:
-                case GrCCGeometry::Verb::kMonotonicConicTo:
-                    fan.lineTo(pts[ptsIdx + 1]);
-                    ptsIdx += 2;
-                    continue;
-
-                case GrCCGeometry::Verb::kMonotonicCubicTo:
-                    fan.lineTo(pts[ptsIdx + 2]);
-                    ptsIdx += 3;
-                    continue;
-
-                case GrCCGeometry::Verb::kEndClosedContour:
-                case GrCCGeometry::Verb::kEndOpenContour:
-                    fan.close();
-                    continue;
-            }
-        }
-        GrTessellator::WindingVertex* vertices = nullptr;
-        int count = GrTessellator::PathToVertices(fan, std::numeric_limits<float>::infinity(),
-                                                  SkRect::Make(clippedDevIBounds), &vertices);
-        SkASSERT(0 == count % 3);
-        for (int i = 0; i < count; i += 3) {
-            int tessWinding = vertices[i].fWinding;
-            SkASSERT(tessWinding == vertices[i + 1].fWinding);
-            SkASSERT(tessWinding == vertices[i + 2].fWinding);
-
-            // Ensure this triangle's points actually wind in the same direction as tessWinding.
-            // CCPR shaders use the sign of wind to determine which direction to bloat, so even for
-            // "wound" triangles the winding sign and point ordering need to agree.
-            float ax = vertices[i].fPos.fX - vertices[i + 1].fPos.fX;
-            float ay = vertices[i].fPos.fY - vertices[i + 1].fPos.fY;
-            float bx = vertices[i].fPos.fX - vertices[i + 2].fPos.fX;
-            float by = vertices[i].fPos.fY - vertices[i + 2].fPos.fY;
-            float wind = ax*by - ay*bx;
-            if ((wind > 0) != (-tessWinding > 0)) { // Tessellator has opposite winding sense.
-                std::swap(vertices[i + 1].fPos, vertices[i + 2].fPos);
-            }
-
-            if (1 == abs(tessWinding)) {
-                ++fCurrPathPrimitiveCounts.fTriangles;
-            } else {
-                ++fCurrPathPrimitiveCounts.fWeightedTriangles;
-            }
-        }
-
-        fPathsInfo.back().adoptFanTessellation(vertices, count);
+        fPathInfos.back().tessellateFan(fGeometry, currPathVerbsIdx, currPathPointsIdx,
+                                        clippedDevIBounds, &currPathPrimitiveCounts);
     }
 
-    fTotalPrimitiveCounts[(int)scissorTest] += fCurrPathPrimitiveCounts;
+    fTotalPrimitiveCounts[(int)scissorTest] += currPathPrimitiveCounts;
 
     if (GrScissorTest::kEnabled == scissorTest) {
         fScissorSubBatches.push_back() = {fTotalPrimitiveCounts[(int)GrScissorTest::kEnabled],
                                           clippedDevIBounds.makeOffset(devToAtlasOffset.fX,
                                                                        devToAtlasOffset.fY)};
     }
-
-    SkDEBUGCODE(fParsingPath = false);
 }
 
-void GrCCPathParser::discardParsedPath() {
-    SkASSERT(fParsingPath);
-    fGeometry.resize_back(fCurrPathPointsIdx, fCurrPathVerbsIdx);
-    SkDEBUGCODE(fParsingPath = false);
+void GrCCFiller::PathInfo::tessellateFan(const GrCCFillGeometry& geometry, int verbsIdx,
+                                         int ptsIdx, const SkIRect& clippedDevIBounds,
+                                         PrimitiveTallies* newTriangleCounts) {
+    using Verb = GrCCFillGeometry::Verb;
+    SkASSERT(-1 == fFanTessellationCount);
+    SkASSERT(!fFanTessellation);
+
+    const SkTArray<Verb, true>& verbs = geometry.verbs();
+    const SkTArray<SkPoint, true>& pts = geometry.points();
+
+    newTriangleCounts->fTriangles =
+            newTriangleCounts->fWeightedTriangles = 0;
+
+    // Build an SkPath of the Redbook fan. We use "winding" fill type right now because we are
+    // producing a coverage count, and must fill in every region that has non-zero wind. The
+    // path processor will convert coverage count to the appropriate fill type later.
+    SkPath fan;
+    fan.setFillType(SkPath::kWinding_FillType);
+    SkASSERT(Verb::kBeginPath == verbs[verbsIdx]);
+    for (int i = verbsIdx + 1; i < verbs.count(); ++i) {
+        switch (verbs[i]) {
+            case Verb::kBeginPath:
+                SK_ABORT("Invalid GrCCFillGeometry");
+                continue;
+
+            case Verb::kBeginContour:
+                fan.moveTo(pts[ptsIdx++]);
+                continue;
+
+            case Verb::kLineTo:
+                fan.lineTo(pts[ptsIdx++]);
+                continue;
+
+            case Verb::kMonotonicQuadraticTo:
+            case Verb::kMonotonicConicTo:
+                fan.lineTo(pts[ptsIdx + 1]);
+                ptsIdx += 2;
+                continue;
+
+            case Verb::kMonotonicCubicTo:
+                fan.lineTo(pts[ptsIdx + 2]);
+                ptsIdx += 3;
+                continue;
+
+            case Verb::kEndClosedContour:
+            case Verb::kEndOpenContour:
+                fan.close();
+                continue;
+        }
+    }
+
+    GrTessellator::WindingVertex* vertices = nullptr;
+    fFanTessellationCount =
+            GrTessellator::PathToVertices(fan, std::numeric_limits<float>::infinity(),
+                                          SkRect::Make(clippedDevIBounds), &vertices);
+    if (fFanTessellationCount <= 0) {
+        SkASSERT(0 == fFanTessellationCount);
+        SkASSERT(nullptr == vertices);
+        return;
+    }
+
+    SkASSERT(0 == fFanTessellationCount % 3);
+    for (int i = 0; i < fFanTessellationCount; i += 3) {
+        int tessWinding = vertices[i].fWinding;
+        SkASSERT(tessWinding == vertices[i + 1].fWinding);
+        SkASSERT(tessWinding == vertices[i + 2].fWinding);
+
+        // Ensure this triangle's points actually wind in the same direction as tessWinding.
+        // CCPR shaders use the sign of wind to determine which direction to bloat, so even for
+        // "wound" triangles the winding sign and point ordering need to agree.
+        float ax = vertices[i].fPos.fX - vertices[i + 1].fPos.fX;
+        float ay = vertices[i].fPos.fY - vertices[i + 1].fPos.fY;
+        float bx = vertices[i].fPos.fX - vertices[i + 2].fPos.fX;
+        float by = vertices[i].fPos.fY - vertices[i + 2].fPos.fY;
+        float wind = ax*by - ay*bx;
+        if ((wind > 0) != (-tessWinding > 0)) { // Tessellator has opposite winding sense.
+            std::swap(vertices[i + 1].fPos, vertices[i + 2].fPos);
+        }
+
+        if (1 == abs(tessWinding)) {
+            ++newTriangleCounts->fTriangles;
+        } else {
+            ++newTriangleCounts->fWeightedTriangles;
+        }
+    }
+
+    fFanTessellation.reset(vertices);
 }
 
-GrCCPathParser::CoverageCountBatchID GrCCPathParser::closeCurrentBatch() {
+GrCCFiller::BatchID GrCCFiller::closeCurrentBatch() {
     SkASSERT(!fInstanceBuffer);
-    SkASSERT(!fCoverageCountBatches.empty());
+    SkASSERT(!fBatches.empty());
 
-    const auto& lastBatch = fCoverageCountBatches.back();
+    const auto& lastBatch = fBatches.back();
     int maxMeshes = 1 + fScissorSubBatches.count() - lastBatch.fEndScissorSubBatchIdx;
     fMaxMeshesPerDraw = SkTMax(fMaxMeshesPerDraw, maxMeshes);
 
@@ -282,12 +218,12 @@
                         lastScissorSubBatch.fEndPrimitiveIndices;
 
     // This will invalidate lastBatch.
-    fCoverageCountBatches.push_back() = {
+    fBatches.push_back() = {
         fTotalPrimitiveCounts[(int)GrScissorTest::kDisabled],
         fScissorSubBatches.count(),
         batchTotalCounts
     };
-    return fCoverageCountBatches.count() - 1;
+    return fBatches.count() - 1;
 }
 
 // Emits a contour's triangle fan.
@@ -334,7 +270,7 @@
                                  const Sk2f& devToAtlasOffset,
                                  TriPointInstance* triPointInstanceData,
                                  QuadPointInstance* quadPointInstanceData,
-                                 GrCCGeometry::PrimitiveTallies* indices) {
+                                 GrCCFillGeometry::PrimitiveTallies* indices) {
     for (int i = 0; i < numVertices; i += 3) {
         if (1 == abs(vertices[i].fWinding)) {
             triPointInstanceData[indices->fTriangles++].set(vertices[i].fPos, vertices[i + 1].fPos,
@@ -347,11 +283,12 @@
     }
 }
 
-bool GrCCPathParser::finalize(GrOnFlushResourceProvider* onFlushRP) {
-    SkASSERT(!fParsingPath); // Call saveParsedPath() or discardParsedPath().
-    SkASSERT(fCoverageCountBatches.back().fEndNonScissorIndices == // Call closeCurrentBatch().
+bool GrCCFiller::prepareToDraw(GrOnFlushResourceProvider* onFlushRP) {
+    using Verb = GrCCFillGeometry::Verb;
+    SkASSERT(!fInstanceBuffer);
+    SkASSERT(fBatches.back().fEndNonScissorIndices == // Call closeCurrentBatch().
              fTotalPrimitiveCounts[(int)GrScissorTest::kDisabled]);
-    SkASSERT(fCoverageCountBatches.back().fEndScissorSubBatchIdx == fScissorSubBatches.count());
+    SkASSERT(fBatches.back().fEndScissorSubBatchIdx == fScissorSubBatches.count());
 
     // Here we build a single instance buffer to share with every internal batch.
     //
@@ -393,6 +330,7 @@
     fInstanceBuffer = onFlushRP->makeBuffer(kVertex_GrBufferType,
                                             quadEndIdx * sizeof(QuadPointInstance));
     if (!fInstanceBuffer) {
+        SkDebugf("WARNING: failed to allocate CCPR fill instance buffer.\n");
         return false;
     }
 
@@ -401,7 +339,7 @@
             reinterpret_cast<QuadPointInstance*>(triPointInstanceData);
     SkASSERT(quadPointInstanceData);
 
-    PathInfo* nextPathInfo = fPathsInfo.begin();
+    PathInfo* nextPathInfo = fPathInfos.begin();
     Sk2f devToAtlasOffset;
     PrimitiveTallies instanceIndices[2] = {fBaseInstances[0], fBaseInstances[1]};
     PrimitiveTallies* currIndices = nullptr;
@@ -413,9 +351,9 @@
     int nextConicWeightIdx = 0;
 
     // Expand the ccpr verbs into GPU instance buffers.
-    for (GrCCGeometry::Verb verb : fGeometry.verbs()) {
+    for (Verb verb : fGeometry.verbs()) {
         switch (verb) {
-            case GrCCGeometry::Verb::kBeginPath:
+            case Verb::kBeginPath:
                 SkASSERT(currFan.empty());
                 currIndices = &instanceIndices[(int)nextPathInfo->scissorTest()];
                 devToAtlasOffset = Sk2f(static_cast<float>(nextPathInfo->devToAtlasOffset().fX),
@@ -429,7 +367,7 @@
                 ++nextPathInfo;
                 continue;
 
-            case GrCCGeometry::Verb::kBeginContour:
+            case Verb::kBeginContour:
                 SkASSERT(currFan.empty());
                 ++ptsIdx;
                 if (!currFanIsTessellated) {
@@ -437,7 +375,7 @@
                 }
                 continue;
 
-            case GrCCGeometry::Verb::kLineTo:
+            case Verb::kLineTo:
                 ++ptsIdx;
                 if (!currFanIsTessellated) {
                     SkASSERT(!currFan.empty());
@@ -445,7 +383,7 @@
                 }
                 continue;
 
-            case GrCCGeometry::Verb::kMonotonicQuadraticTo:
+            case Verb::kMonotonicQuadraticTo:
                 triPointInstanceData[currIndices->fQuadratics++].set(&pts[ptsIdx],
                                                                      devToAtlasOffset);
                 ptsIdx += 2;
@@ -455,7 +393,7 @@
                 }
                 continue;
 
-            case GrCCGeometry::Verb::kMonotonicCubicTo:
+            case Verb::kMonotonicCubicTo:
                 quadPointInstanceData[currIndices->fCubics++].set(&pts[ptsIdx], devToAtlasOffset[0],
                                                                   devToAtlasOffset[1]);
                 ptsIdx += 3;
@@ -465,7 +403,7 @@
                 }
                 continue;
 
-            case GrCCGeometry::Verb::kMonotonicConicTo:
+            case Verb::kMonotonicConicTo:
                 quadPointInstanceData[currIndices->fConics++].setW(
                         &pts[ptsIdx], devToAtlasOffset,
                         fGeometry.getConicWeight(nextConicWeightIdx));
@@ -477,13 +415,13 @@
                 }
                 continue;
 
-            case GrCCGeometry::Verb::kEndClosedContour:  // endPt == startPt.
+            case Verb::kEndClosedContour:  // endPt == startPt.
                 if (!currFanIsTessellated) {
                     SkASSERT(!currFan.empty());
                     currFan.pop_back();
                 }
             // fallthru.
-            case GrCCGeometry::Verb::kEndOpenContour:  // endPt != startPt.
+            case Verb::kEndOpenContour:  // endPt != startPt.
                 SkASSERT(!currFanIsTessellated || currFan.empty());
                 if (!currFanIsTessellated && currFan.count() >= 3) {
                     int fanSize = currFan.count();
@@ -503,7 +441,7 @@
 
     fInstanceBuffer->unmap();
 
-    SkASSERT(nextPathInfo == fPathsInfo.end());
+    SkASSERT(nextPathInfo == fPathInfos.end());
     SkASSERT(ptsIdx == pts.count() - 1);
     SkASSERT(instanceIndices[0].fTriangles == fBaseInstances[1].fTriangles);
     SkASSERT(instanceIndices[1].fTriangles == fBaseInstances[0].fQuadratics);
@@ -522,13 +460,13 @@
     return true;
 }
 
-void GrCCPathParser::drawCoverageCount(GrOpFlushState* flushState, CoverageCountBatchID batchID,
-                                       const SkIRect& drawBounds) const {
+void GrCCFiller::drawFills(GrOpFlushState* flushState, BatchID batchID,
+                           const SkIRect& drawBounds) const {
     using PrimitiveType = GrCCCoverageProcessor::PrimitiveType;
 
     SkASSERT(fInstanceBuffer);
 
-    const PrimitiveTallies& batchTotalCounts = fCoverageCountBatches[batchID].fTotalPrimitiveCounts;
+    const PrimitiveTallies& batchTotalCounts = fBatches[batchID].fTotalPrimitiveCounts;
 
     GrPipeline pipeline(flushState->drawOpArgs().fProxy, GrScissorTest::kEnabled,
                         SkBlendMode::kPlus);
@@ -559,11 +497,10 @@
     }
 }
 
-void GrCCPathParser::drawPrimitives(GrOpFlushState* flushState, const GrPipeline& pipeline,
-                                    CoverageCountBatchID batchID,
-                                    GrCCCoverageProcessor::PrimitiveType primitiveType,
-                                    int PrimitiveTallies::*instanceType,
-                                    const SkIRect& drawBounds) const {
+void GrCCFiller::drawPrimitives(GrOpFlushState* flushState, const GrPipeline& pipeline,
+                                BatchID batchID, GrCCCoverageProcessor::PrimitiveType primitiveType,
+                                int PrimitiveTallies::*instanceType,
+                                const SkIRect& drawBounds) const {
     SkASSERT(pipeline.isScissorEnabled());
 
     // Don't call reset(), as that also resets the reserve count.
@@ -573,9 +510,9 @@
     GrCCCoverageProcessor proc(flushState->resourceProvider(), primitiveType);
 
     SkASSERT(batchID > 0);
-    SkASSERT(batchID < fCoverageCountBatches.count());
-    const CoverageCountBatch& previousBatch = fCoverageCountBatches[batchID - 1];
-    const CoverageCountBatch& batch = fCoverageCountBatches[batchID];
+    SkASSERT(batchID < fBatches.count());
+    const Batch& previousBatch = fBatches[batchID - 1];
+    const Batch& batch = fBatches[batchID];
     SkDEBUGCODE(int totalInstanceCount = 0);
 
     if (int instanceCount = batch.fEndNonScissorIndices.*instanceType -
diff --git a/src/gpu/ccpr/GrCCFiller.h b/src/gpu/ccpr/GrCCFiller.h
new file mode 100644
index 0000000..40dc657
--- /dev/null
+++ b/src/gpu/ccpr/GrCCFiller.h
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef GrCCPathParser_DEFINED
+#define GrCCPathParser_DEFINED
+
+#include "GrMesh.h"
+#include "SkPath.h"
+#include "SkPathPriv.h"
+#include "SkRect.h"
+#include "SkRefCnt.h"
+#include "GrTessellator.h"
+#include "ccpr/GrCCCoverageProcessor.h"
+#include "ccpr/GrCCFillGeometry.h"
+#include "ops/GrDrawOp.h"
+
+class GrOnFlushResourceProvider;
+class SkMatrix;
+class SkPath;
+
+/**
+ * This class parses SkPaths into CCPR primitives in GPU buffers, then issues calls to draw their
+ * coverage counts.
+ */
+class GrCCFiller {
+public:
+    struct PathStats {
+        int fMaxPointsPerPath = 0;
+        int fNumTotalSkPoints = 0;
+        int fNumTotalSkVerbs = 0;
+        int fNumTotalConicWeights = 0;
+
+        void statPath(const SkPath&);
+    };
+
+    GrCCFiller(int numPaths, const PathStats&);
+
+    // Parses a device-space SkPath into the current batch, using the SkPath's original verbs and
+    // 'deviceSpacePts'. Accepts an optional post-device-space translate for placement in an atlas.
+    void parseDeviceSpaceFill(const SkPath&, const SkPoint* deviceSpacePts, GrScissorTest,
+                              const SkIRect& clippedDevIBounds, const SkIVector& devToAtlasOffset);
+
+    using BatchID = int;
+
+    // Compiles the outstanding parsed paths into a batch, and returns an ID that can be used to
+    // draw their fills in the future.
+    BatchID closeCurrentBatch();
+
+    // Builds internal GPU buffers and prepares for calls to drawFills(). Caller must close the
+    // current batch before calling this method, and cannot parse new paths afer.
+    bool prepareToDraw(GrOnFlushResourceProvider*);
+
+    // Called after prepareToDraw(). Draws the given batch of path fills.
+    void drawFills(GrOpFlushState*, BatchID, const SkIRect& drawBounds) const;
+
+private:
+    static constexpr int kNumScissorModes = 2;
+    using PrimitiveTallies = GrCCFillGeometry::PrimitiveTallies;
+
+    // Every kBeginPath verb has a corresponding PathInfo entry.
+    class PathInfo {
+    public:
+        PathInfo(GrScissorTest scissorTest, const SkIVector& devToAtlasOffset)
+                : fScissorTest(scissorTest), fDevToAtlasOffset(devToAtlasOffset) {}
+
+        GrScissorTest scissorTest() const { return fScissorTest; }
+        const SkIVector& devToAtlasOffset() const { return fDevToAtlasOffset; }
+
+        // An empty tessellation fan is also valid; we use negative count to denote not tessellated.
+        bool hasFanTessellation() const { return fFanTessellationCount >= 0; }
+        int fanTessellationCount() const {
+            SkASSERT(this->hasFanTessellation());
+            return fFanTessellationCount;
+        }
+        const GrTessellator::WindingVertex* fanTessellation() const {
+            SkASSERT(this->hasFanTessellation());
+            return fFanTessellation.get();
+        }
+        void tessellateFan(const GrCCFillGeometry&, int verbsIdx, int ptsIdx,
+                           const SkIRect& clippedDevIBounds, PrimitiveTallies* newTriangleCounts);
+
+    private:
+        GrScissorTest fScissorTest;
+        SkIVector fDevToAtlasOffset;  // Translation from device space to location in atlas.
+        int fFanTessellationCount = -1;
+        std::unique_ptr<const GrTessellator::WindingVertex[]> fFanTessellation;
+    };
+
+    // Defines a batch of CCPR primitives. Start indices are deduced by looking at the previous
+    // Batch in the list.
+    struct Batch {
+        PrimitiveTallies fEndNonScissorIndices;
+        int fEndScissorSubBatchIdx;
+        PrimitiveTallies fTotalPrimitiveCounts;
+    };
+
+    // Defines a sub-batch that will be drawn with the given scissor rect. Start indices are deduced
+    // by looking at the previous ScissorSubBatch in the list.
+    struct ScissorSubBatch {
+        PrimitiveTallies fEndPrimitiveIndices;
+        SkIRect fScissor;
+    };
+
+    void drawPrimitives(GrOpFlushState*, const GrPipeline&, BatchID,
+                        GrCCCoverageProcessor::PrimitiveType, int PrimitiveTallies::*instanceType,
+                        const SkIRect& drawBounds) const;
+
+    GrCCFillGeometry fGeometry;
+    SkSTArray<32, PathInfo, true> fPathInfos;
+    SkSTArray<32, Batch, true> fBatches;
+    SkSTArray<32, ScissorSubBatch, true> fScissorSubBatches;
+    PrimitiveTallies fTotalPrimitiveCounts[kNumScissorModes];
+    int fMaxMeshesPerDraw = 0;
+
+    sk_sp<GrBuffer> fInstanceBuffer;
+    PrimitiveTallies fBaseInstances[kNumScissorModes];
+    mutable SkSTArray<32, GrMesh> fMeshesScratchBuffer;
+    mutable SkSTArray<32, SkIRect> fScissorRectScratchBuffer;
+};
+
+inline void GrCCFiller::PathStats::statPath(const SkPath& path) {
+    fMaxPointsPerPath = SkTMax(fMaxPointsPerPath, path.countPoints());
+    fNumTotalSkPoints += path.countPoints();
+    fNumTotalSkVerbs += path.countVerbs();
+    fNumTotalConicWeights += SkPathPriv::ConicWeightCnt(path);
+}
+
+#endif
diff --git a/src/gpu/ccpr/GrCCPathCache.cpp b/src/gpu/ccpr/GrCCPathCache.cpp
index 7a00d35..01781b0 100644
--- a/src/gpu/ccpr/GrCCPathCache.cpp
+++ b/src/gpu/ccpr/GrCCPathCache.cpp
@@ -9,7 +9,6 @@
 
 #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;
diff --git a/src/gpu/ccpr/GrCCPathParser.h b/src/gpu/ccpr/GrCCPathParser.h
deleted file mode 100644
index 9ec2a3c..0000000
--- a/src/gpu/ccpr/GrCCPathParser.h
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright 2017 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef GrCCPathParser_DEFINED
-#define GrCCPathParser_DEFINED
-
-#include "GrMesh.h"
-#include "SkPath.h"
-#include "SkPathPriv.h"
-#include "SkRect.h"
-#include "SkRefCnt.h"
-#include "GrTessellator.h"
-#include "ccpr/GrCCCoverageProcessor.h"
-#include "ccpr/GrCCGeometry.h"
-#include "ops/GrDrawOp.h"
-
-class GrOnFlushResourceProvider;
-class SkMatrix;
-class SkPath;
-
-/**
- * This class parses SkPaths into CCPR primitives in GPU buffers, then issues calls to draw their
- * coverage counts.
- */
-class GrCCPathParser {
-public:
-    struct PathStats {
-        int fMaxPointsPerPath = 0;
-        int fNumTotalSkPoints = 0;
-        int fNumTotalSkVerbs = 0;
-        int fNumTotalConicWeights = 0;
-
-        void statPath(const SkPath&);
-    };
-
-    GrCCPathParser(int numPaths, const PathStats&);
-
-    ~GrCCPathParser() {
-        // Enforce the contract that the client always calls saveParsedPath or discardParsedPath.
-        SkASSERT(!fParsingPath);
-    }
-
-    using CoverageCountBatchID = int;
-
-    // Parses an SkPath into a temporary staging area. The path will not be included in the current
-    // batch until there is a matching call to saveParsedPath. The user must complement this with a
-    // following call to either saveParsedPath or discardParsedPath.
-    //
-    // Returns two tight bounding boxes: device space and "45 degree" (| 1 -1 | * devCoords) space.
-    //                                                                 | 1  1 |
-    void parsePath(const SkMatrix&, const SkPath&, SkRect* devBounds, SkRect* devBounds45);
-
-    // Parses a device-space SkPath into a temporary staging area. The path will not be included in
-    // the current batch until there is a matching call to saveParsedPath. The user must complement
-    // this with a following call to either saveParsedPath or discardParsedPath.
-    void parseDeviceSpacePath(const SkPath&);
-
-    // Commits the currently-parsed path from staging to the current batch, and specifies whether
-    // the mask should be rendered with a scissor in effect. Accepts an optional post-device-space
-    // translate for placement in an atlas.
-    void saveParsedPath(GrScissorTest, const SkIRect& clippedDevIBounds,
-                        const SkIVector& devToAtlasOffset);
-    void discardParsedPath();
-
-    // Compiles the outstanding saved paths into a batch, and returns an ID that can be used to draw
-    // their coverage counts in the future.
-    CoverageCountBatchID closeCurrentBatch();
-
-    // Builds internal GPU buffers and prepares for calls to drawCoverageCount. Caller must close
-    // the current batch before calling this method, and cannot parse new paths afer.
-    bool finalize(GrOnFlushResourceProvider*);
-
-    // Called after finalize. Draws the given batch of parsed paths.
-    void drawCoverageCount(GrOpFlushState*, CoverageCountBatchID, const SkIRect& drawBounds) const;
-
-private:
-    static constexpr int kNumScissorModes = 2;
-    using PrimitiveTallies = GrCCGeometry::PrimitiveTallies;
-
-    // Every kBeginPath verb has a corresponding PathInfo entry.
-    class PathInfo {
-    public:
-        PathInfo(GrScissorTest scissorTest, const SkIVector& devToAtlasOffset)
-                : fScissorTest(scissorTest), fDevToAtlasOffset(devToAtlasOffset) {}
-
-        GrScissorTest scissorTest() const { return fScissorTest; }
-        const SkIVector& devToAtlasOffset() const { return fDevToAtlasOffset; }
-
-        // An empty tessellation fan is also valid; we use negative count to denote not tessellated.
-        bool hasFanTessellation() const { return fFanTessellationCount >= 0; }
-        int fanTessellationCount() const {
-            SkASSERT(this->hasFanTessellation());
-            return fFanTessellationCount;
-        }
-        const GrTessellator::WindingVertex* fanTessellation() const {
-            SkASSERT(this->hasFanTessellation());
-            return fFanTessellation.get();
-        }
-
-        void adoptFanTessellation(const GrTessellator::WindingVertex* vertices, int count) {
-            SkASSERT(count >= 0);
-            fFanTessellation.reset(vertices);
-            fFanTessellationCount = count;
-        }
-
-    private:
-        GrScissorTest fScissorTest;
-        SkIVector fDevToAtlasOffset;  // Translation from device space to location in atlas.
-        int fFanTessellationCount = -1;
-        std::unique_ptr<const GrTessellator::WindingVertex[]> fFanTessellation;
-    };
-
-    // Defines a batch of CCPR primitives. Start indices are deduced by looking at the previous
-    // CoverageCountBatch in the list.
-    struct CoverageCountBatch {
-        PrimitiveTallies fEndNonScissorIndices;
-        int fEndScissorSubBatchIdx;
-        PrimitiveTallies fTotalPrimitiveCounts;
-    };
-
-    // Defines a sub-batch from CoverageCountBatch that will be drawn with the given scissor rect.
-    // Start indices are deduced by looking at the previous ScissorSubBatch in the list.
-    struct ScissorSubBatch {
-        PrimitiveTallies fEndPrimitiveIndices;
-        SkIRect fScissor;
-    };
-
-    void parsePath(const SkPath&, const SkPoint* deviceSpacePts);
-    void endContourIfNeeded(bool insideContour);
-
-    void drawPrimitives(GrOpFlushState*, const GrPipeline&, CoverageCountBatchID,
-                        GrCCCoverageProcessor::PrimitiveType, int PrimitiveTallies::*instanceType,
-                        const SkIRect& drawBounds) const;
-
-    // Staging area for the path being parsed.
-    SkDEBUGCODE(int fParsingPath = false);
-    const SkAutoSTArray<32, SkPoint> fLocalDevPtsBuffer;
-    int fCurrPathPointsIdx;
-    int fCurrPathVerbsIdx;
-    PrimitiveTallies fCurrPathPrimitiveCounts;
-
-    GrCCGeometry fGeometry;
-    SkSTArray<32, PathInfo, true> fPathsInfo;
-    SkSTArray<32, CoverageCountBatch, true> fCoverageCountBatches;
-    SkSTArray<32, ScissorSubBatch, true> fScissorSubBatches;
-    PrimitiveTallies fTotalPrimitiveCounts[kNumScissorModes];
-    int fMaxMeshesPerDraw = 0;
-
-    sk_sp<GrBuffer> fInstanceBuffer;
-    PrimitiveTallies fBaseInstances[kNumScissorModes];
-    mutable SkSTArray<32, GrMesh> fMeshesScratchBuffer;
-    mutable SkSTArray<32, SkIRect> fScissorRectScratchBuffer;
-};
-
-inline void GrCCPathParser::PathStats::statPath(const SkPath& path) {
-    fMaxPointsPerPath = SkTMax(fMaxPointsPerPath, path.countPoints());
-    fNumTotalSkPoints += path.countPoints();
-    fNumTotalSkVerbs += path.countVerbs();
-    fNumTotalConicWeights += SkPathPriv::ConicWeightCnt(path);
-}
-
-#endif
diff --git a/src/gpu/ccpr/GrCCPerFlushResources.cpp b/src/gpu/ccpr/GrCCPerFlushResources.cpp
index 886d679..0ab4e5d 100644
--- a/src/gpu/ccpr/GrCCPerFlushResources.cpp
+++ b/src/gpu/ccpr/GrCCPerFlushResources.cpp
@@ -15,7 +15,7 @@
 #include "SkMakeUnique.h"
 #include "ccpr/GrCCPathCache.h"
 
-using CoverageCountBatchID = GrCCPathParser::CoverageCountBatchID;
+using FillBatchID = GrCCFiller::BatchID;
 using PathInstance = GrCCPathProcessor::Instance;
 
 namespace {
@@ -101,7 +101,7 @@
 
     static std::unique_ptr<GrDrawOp> Make(GrContext* context,
                                           sk_sp<const GrCCPerFlushResources> resources,
-                                          CoverageCountBatchID batchID, const SkISize& drawBounds) {
+                                          FillBatchID batchID, const SkISize& drawBounds) {
         GrOpMemoryPool* pool = context->contextPriv().opMemoryPool();
 
         return pool->allocate<RenderAtlasOp>(std::move(resources), batchID, drawBounds);
@@ -111,20 +111,20 @@
     const char* name() const override { return "RenderAtlasOp (CCPR)"; }
 
     void onExecute(GrOpFlushState* flushState) override {
-        fResources->pathParser().drawCoverageCount(flushState, fBatchID, fDrawBounds);
+        fResources->filler().drawFills(flushState, fBatchID, fDrawBounds);
     }
 
 private:
     friend class ::GrOpMemoryPool; // for ctor
 
-    RenderAtlasOp(sk_sp<const GrCCPerFlushResources> resources, CoverageCountBatchID batchID,
+    RenderAtlasOp(sk_sp<const GrCCPerFlushResources> resources, FillBatchID batchID,
                   const SkISize& drawBounds)
             : AtlasOp(ClassID(), std::move(resources), drawBounds)
             , fBatchID(batchID)
             , fDrawBounds(SkIRect::MakeWH(drawBounds.width(), drawBounds.height())) {
     }
 
-    const CoverageCountBatchID fBatchID;
+    const FillBatchID fBatchID;
     const SkIRect fDrawBounds;
 };
 
@@ -138,7 +138,11 @@
 
 GrCCPerFlushResources::GrCCPerFlushResources(GrOnFlushResourceProvider* onFlushRP,
                                              const GrCCPerFlushResourceSpecs& specs)
-        : fPathParser(specs.fNumRenderedPaths + specs.fNumClipPaths, specs.fRenderedPathStats)
+          // Overallocate by one point so we can call Sk4f::Store at the final SkPoint in the array.
+          // (See transform_path_pts below.)
+          // FIXME: instead use built-in instructions to write only the first two lanes of an Sk4f.
+        : fLocalDevPtsBuffer(specs.fRenderedPathStats.fMaxPointsPerPath + 1)
+        , fFiller(specs.fNumRenderedPaths + specs.fNumClipPaths, specs.fRenderedPathStats)
         , fCopyAtlasStack(kAlpha_8_GrPixelConfig, specs.fCopyAtlasSpecs, onFlushRP->caps())
         , fRenderedAtlasStack(kAlpha_half_GrPixelConfig, specs.fRenderedAtlasSpecs,
                               onFlushRP->caps())
@@ -183,6 +187,56 @@
     return &fCopyAtlasStack.current();
 }
 
+static void transform_path_pts(const SkMatrix& m, const SkPath& path,
+                               const SkAutoSTArray<32, SkPoint>& outDevPts, SkRect* devBounds,
+                               SkRect* devBounds45) {
+    const SkPoint* pts = SkPathPriv::PointData(path);
+    int numPts = path.countPoints();
+    SkASSERT(numPts + 1 <= outDevPts.count());
+    SkASSERT(numPts);
+
+    // m45 transforms path points into "45 degree" device space. A bounding box in this space gives
+    // the circumscribing octagon's diagonals. We could use SK_ScalarRoot2Over2, but an orthonormal
+    // transform is not necessary as long as the shader uses the correct inverse.
+    SkMatrix m45;
+    m45.setSinCos(1, 1);
+    m45.preConcat(m);
+
+    // X,Y,T are two parallel view matrices that accumulate two bounding boxes as they map points:
+    // device-space bounds and "45 degree" device-space bounds (| 1 -1 | * devCoords).
+    //                                                          | 1  1 |
+    Sk4f X = Sk4f(m.getScaleX(), m.getSkewY(), m45.getScaleX(), m45.getSkewY());
+    Sk4f Y = Sk4f(m.getSkewX(), m.getScaleY(), m45.getSkewX(), m45.getScaleY());
+    Sk4f T = Sk4f(m.getTranslateX(), m.getTranslateY(), m45.getTranslateX(), m45.getTranslateY());
+
+    // Map the path's points to device space and accumulate bounding boxes.
+    Sk4f devPt = SkNx_fma(Y, Sk4f(pts[0].y()), T);
+    devPt = SkNx_fma(X, Sk4f(pts[0].x()), devPt);
+    Sk4f topLeft = devPt;
+    Sk4f bottomRight = devPt;
+
+    // Store all 4 values [dev.x, dev.y, dev45.x, dev45.y]. We are only interested in the first two,
+    // and will overwrite [dev45.x, dev45.y] with the next point. This is why the dst buffer must
+    // be at least one larger than the number of points.
+    devPt.store(&outDevPts[0]);
+
+    for (int i = 1; i < numPts; ++i) {
+        devPt = SkNx_fma(Y, Sk4f(pts[i].y()), T);
+        devPt = SkNx_fma(X, Sk4f(pts[i].x()), devPt);
+        topLeft = Sk4f::Min(topLeft, devPt);
+        bottomRight = Sk4f::Max(bottomRight, devPt);
+        devPt.store(&outDevPts[i]);
+    }
+
+    SkPoint topLeftPts[2], bottomRightPts[2];
+    topLeft.store(topLeftPts);
+    bottomRight.store(bottomRightPts);
+    devBounds->setLTRB(topLeftPts[0].x(), topLeftPts[0].y(), bottomRightPts[0].x(),
+                       bottomRightPts[0].y());
+    devBounds45->setLTRB(topLeftPts[1].x(), topLeftPts[1].y(), bottomRightPts[1].x(),
+                         bottomRightPts[1].y());
+}
+
 const GrCCAtlas* GrCCPerFlushResources::renderPathInAtlas(const SkIRect& clipIBounds,
                                                           const SkMatrix& m, const SkPath& path,
                                                           SkRect* devBounds, SkRect* devBounds45,
@@ -191,13 +245,24 @@
     SkASSERT(this->isMapped());
     SkASSERT(fNextPathInstanceIdx < fEndPathInstance);
 
-    fPathParser.parsePath(m, path, devBounds, devBounds45);
+    if (path.isEmpty()) {
+        SkDEBUGCODE(--fEndPathInstance);
+        return nullptr;
+    }
+
+    transform_path_pts(m, path, fLocalDevPtsBuffer, devBounds, devBounds45);
     devBounds->roundOut(devIBounds);
 
-    if (!this->placeParsedPathInAtlas(clipIBounds, *devIBounds, devToAtlasOffset)) {
+    GrScissorTest scissorTest;
+    SkIRect clippedPathIBounds;
+    if (!this->placeRenderedPathInAtlas(clipIBounds, *devIBounds, &scissorTest, &clippedPathIBounds,
+                                        devToAtlasOffset)) {
         SkDEBUGCODE(--fEndPathInstance);
         return nullptr;  // Path was degenerate or clipped away.
     }
+
+    fFiller.parseDeviceSpaceFill(path, fLocalDevPtsBuffer.begin(), scissorTest, clippedPathIBounds,
+                                 *devToAtlasOffset);
     return &fRenderedAtlasStack.current();
 }
 
@@ -205,37 +270,45 @@
         const SkIRect& clipIBounds, const SkPath& devPath, const SkIRect& devPathIBounds,
         SkIVector* devToAtlasOffset) {
     SkASSERT(this->isMapped());
-    fPathParser.parseDeviceSpacePath(devPath);
-    if (!this->placeParsedPathInAtlas(clipIBounds, devPathIBounds, devToAtlasOffset)) {
+
+    if (devPath.isEmpty()) {
         return nullptr;
     }
+
+    GrScissorTest scissorTest;
+    SkIRect clippedPathIBounds;
+    if (!this->placeRenderedPathInAtlas(clipIBounds, devPathIBounds, &scissorTest,
+                                        &clippedPathIBounds, devToAtlasOffset)) {
+        return nullptr;
+    }
+
+    fFiller.parseDeviceSpaceFill(devPath, SkPathPriv::PointData(devPath), scissorTest,
+                                 clippedPathIBounds, *devToAtlasOffset);
     return &fRenderedAtlasStack.current();
 }
 
-bool GrCCPerFlushResources::placeParsedPathInAtlas(const SkIRect& clipIBounds,
-                                                   const SkIRect& pathIBounds,
-                                                   SkIVector* devToAtlasOffset) {
-    GrScissorTest scissorTest;
-    SkIRect clippedPathIBounds;
+bool GrCCPerFlushResources::placeRenderedPathInAtlas(const SkIRect& clipIBounds,
+                                                     const SkIRect& pathIBounds,
+                                                     GrScissorTest* scissorTest,
+                                                     SkIRect* clippedPathIBounds,
+                                                     SkIVector* devToAtlasOffset) {
     if (clipIBounds.contains(pathIBounds)) {
-        clippedPathIBounds = pathIBounds;
-        scissorTest = GrScissorTest::kDisabled;
-    } else if (clippedPathIBounds.intersect(clipIBounds, pathIBounds)) {
-        scissorTest = GrScissorTest::kEnabled;
+        *clippedPathIBounds = pathIBounds;
+        *scissorTest = GrScissorTest::kDisabled;
+    } else if (clippedPathIBounds->intersect(clipIBounds, pathIBounds)) {
+        *scissorTest = GrScissorTest::kEnabled;
     } else {
-        fPathParser.discardParsedPath();
         return false;
     }
 
     if (GrCCAtlas* retiredAtlas =
-                fRenderedAtlasStack.addRect(clippedPathIBounds, devToAtlasOffset)) {
+                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().
-        CoverageCountBatchID batchID = fPathParser.closeCurrentBatch();
+        FillBatchID batchID = fFiller.closeCurrentBatch();
         retiredAtlas->setUserBatchID(batchID);
     }
-    fPathParser.saveParsedPath(scissorTest, clippedPathIBounds, *devToAtlasOffset);
     return true;
 }
 
@@ -253,14 +326,13 @@
         fCopyAtlasStack.current().setUserBatchID(fNextCopyInstanceIdx);
     }
     if (!fRenderedAtlasStack.empty()) {
-        CoverageCountBatchID batchID = fPathParser.closeCurrentBatch();
+        FillBatchID batchID = fFiller.closeCurrentBatch();
         fRenderedAtlasStack.current().setUserBatchID(batchID);
     }
 
     // Build the GPU buffers to render path coverage counts. (This must not happen until after the
     // final call to fPathParser.closeCurrentBatch().)
-    if (!fPathParser.finalize(onFlushRP)) {
-        SkDebugf("WARNING: failed to allocate GPU buffers for CCPR. No paths will be drawn.\n");
+    if (!fFiller.prepareToDraw(onFlushRP)) {
         return false;
     }
 
@@ -320,5 +392,5 @@
     fRenderedPathStats.fNumTotalSkPoints += fCopyPathStats.fNumTotalSkPoints;
     fRenderedPathStats.fNumTotalSkVerbs += fCopyPathStats.fNumTotalSkVerbs;
     fRenderedPathStats.fNumTotalConicWeights += fCopyPathStats.fNumTotalConicWeights;
-    fCopyPathStats = GrCCPathParser::PathStats();
+    fCopyPathStats = GrCCFiller::PathStats();
 }
diff --git a/src/gpu/ccpr/GrCCPerFlushResources.h b/src/gpu/ccpr/GrCCPerFlushResources.h
index cdc89f8..3fa392e 100644
--- a/src/gpu/ccpr/GrCCPerFlushResources.h
+++ b/src/gpu/ccpr/GrCCPerFlushResources.h
@@ -10,7 +10,7 @@
 
 #include "GrNonAtomicRef.h"
 #include "ccpr/GrCCAtlas.h"
-#include "ccpr/GrCCPathParser.h"
+#include "ccpr/GrCCFiller.h"
 #include "ccpr/GrCCPathProcessor.h"
 
 class GrCCPathCacheEntry;
@@ -24,12 +24,12 @@
     int fNumCachedPaths = 0;
 
     int fNumCopiedPaths = 0;
-    GrCCPathParser::PathStats fCopyPathStats;
+    GrCCFiller::PathStats fCopyPathStats;
     GrCCAtlas::Specs fCopyAtlasSpecs;
 
     int fNumRenderedPaths = 0;
     int fNumClipPaths = 0;
-    GrCCPathParser::PathStats fRenderedPathStats;
+    GrCCFiller::PathStats fRenderedPathStats;
     GrCCAtlas::Specs fRenderedAtlasSpecs;
 
     bool isEmpty() const {
@@ -85,7 +85,7 @@
                   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; }
+    const GrCCFiller& filler() const { SkASSERT(!this->isMapped()); return fFiller; }
     const GrBuffer* indexBuffer() const { SkASSERT(!this->isMapped()); return fIndexBuffer.get(); }
     const GrBuffer* vertexBuffer() const { SkASSERT(!this->isMapped()); return fVertexBuffer.get();}
     GrBuffer* instanceBuffer() const { SkASSERT(!this->isMapped()); return fInstanceBuffer.get(); }
@@ -107,10 +107,12 @@
     }
 
 private:
-    bool placeParsedPathInAtlas(const SkIRect& clipIBounds, const SkIRect& pathIBounds,
-                                SkIVector* devToAtlasOffset);
+    bool placeRenderedPathInAtlas(const SkIRect& clipIBounds, const SkIRect& pathIBounds,
+                                  GrScissorTest*, SkIRect* clippedPathIBounds,
+                                  SkIVector* devToAtlasOffset);
 
-    GrCCPathParser fPathParser;
+    const SkAutoSTArray<32, SkPoint> fLocalDevPtsBuffer;
+    GrCCFiller fFiller;
     GrCCAtlasStack fCopyAtlasStack;
     GrCCAtlasStack fRenderedAtlasStack;
 
diff --git a/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp b/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
index d68d4c2..f783259 100644
--- a/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
+++ b/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
@@ -15,7 +15,6 @@
 #include "ccpr/GrCCClipProcessor.h"
 #include "ccpr/GrCCDrawPathsOp.h"
 #include "ccpr/GrCCPathCache.h"
-#include "ccpr/GrCCPathParser.h"
 
 using PathInstance = GrCCPathProcessor::Instance;
 
