| Index: src/gpu/batches/GrMSAAPathRenderer.cpp
|
| diff --git a/src/gpu/batches/GrMSAAPathRenderer.cpp b/src/gpu/batches/GrMSAAPathRenderer.cpp
|
| index c4b8835f6ed5e543f64c084b3aef40b05b667f42..cd039ece8d3349a40bf5702371d6dfbe476e3d7a 100644
|
| --- a/src/gpu/batches/GrMSAAPathRenderer.cpp
|
| +++ b/src/gpu/batches/GrMSAAPathRenderer.cpp
|
| @@ -225,15 +225,17 @@ class MSAAPathBatch : public GrVertexBatch {
|
| public:
|
| DEFINE_BATCH_CLASS_ID
|
|
|
| - struct Geometry {
|
| - GrColor fColor;
|
| - SkPath fPath;
|
| - SkScalar fTolerance;
|
| - };
|
| -
|
| - static MSAAPathBatch* Create(const Geometry& geometry, const SkMatrix& viewMatrix,
|
| - const SkRect& devBounds) {
|
| - return new MSAAPathBatch(geometry, viewMatrix, devBounds);
|
| + MSAAPathBatch(GrColor color, const SkPath& path, const SkMatrix& viewMatrix,
|
| + const SkRect& devBounds)
|
| + : INHERITED(ClassID())
|
| + , fViewMatrix(viewMatrix) {
|
| + fPaths.emplace_back(PathInfo{color, path});
|
| + this->setBounds(devBounds);
|
| + int contourCount;
|
| + this->computeWorstCasePointCount(path, &contourCount, &fMaxLineVertices, &fMaxQuadVertices);
|
| + fMaxLineIndices = fMaxLineVertices * 3;
|
| + fMaxQuadIndices = fMaxQuadVertices * 3;
|
| + fIsIndexed = contourCount > 1;
|
| }
|
|
|
| const char* name() const override { return "MSAAPathBatch"; }
|
| @@ -241,8 +243,8 @@ public:
|
| void computePipelineOptimizations(GrInitInvariantOutput* color,
|
| GrInitInvariantOutput* coverage,
|
| GrBatchToXPOverrides* overrides) const override {
|
| - // When this is called on a batch, there is only one geometry bundle
|
| - color->setKnownFourComponents(fGeoData[0].fColor);
|
| + // When this is called on a batch, there is only one path
|
| + color->setKnownFourComponents(fPaths[0].fColor);
|
| coverage->setKnownSingleComponent(0xff);
|
| }
|
|
|
| @@ -254,13 +256,13 @@ private:
|
| void initBatchTracker(const GrXPOverridesForBatch& overrides) override {
|
| // Handle any color overrides
|
| if (!overrides.readsColor()) {
|
| - fGeoData[0].fColor = GrColor_ILLEGAL;
|
| + fPaths[0].fColor = GrColor_ILLEGAL;
|
| }
|
| - overrides.getOverrideColorIfSet(&fGeoData[0].fColor);
|
| + overrides.getOverrideColorIfSet(&fPaths[0].fColor);
|
| }
|
|
|
| - void computeWorstCasePointCount(const SkPath& path, int* subpaths, SkScalar tol,
|
| - int* outLinePointCount, int* outQuadPointCount) const {
|
| + void computeWorstCasePointCount(const SkPath& path, int* subpaths, int* outLinePointCount,
|
| + int* outQuadPointCount) const {
|
| int linePointCount = 0;
|
| int quadPointCount = 0;
|
| *subpaths = 1;
|
| @@ -370,15 +372,14 @@ private:
|
| }
|
|
|
| // fill buffers
|
| - for (int i = 0; i < fGeoData.count(); i++) {
|
| - const Geometry& args = fGeoData[i];
|
| + for (int i = 0; i < fPaths.count(); i++) {
|
| + const PathInfo& pathInfo = fPaths[i];
|
|
|
| if (!this->createGeom(lines,
|
| quads,
|
| - args.fPath,
|
| - args.fTolerance,
|
| + pathInfo.fPath,
|
| fViewMatrix,
|
| - args.fColor,
|
| + pathInfo.fColor,
|
| fIsIndexed)) {
|
| return;
|
| }
|
| @@ -442,21 +443,6 @@ private:
|
| }
|
| }
|
|
|
| - SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
|
| -
|
| - MSAAPathBatch(const Geometry& geometry, const SkMatrix& viewMatrix, const SkRect& devBounds)
|
| - : INHERITED(ClassID())
|
| - , fViewMatrix(viewMatrix) {
|
| - fGeoData.push_back(geometry);
|
| - this->setBounds(devBounds);
|
| - int contourCount;
|
| - this->computeWorstCasePointCount(geometry.fPath, &contourCount, kTolerance,
|
| - &fMaxLineVertices, &fMaxQuadVertices);
|
| - fMaxLineIndices = fMaxLineVertices * 3;
|
| - fMaxQuadIndices = fMaxQuadVertices * 3;
|
| - fIsIndexed = contourCount > 1;
|
| - }
|
| -
|
| bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override {
|
| MSAAPathBatch* that = t->cast<MSAAPathBatch>();
|
| if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pipeline(),
|
| @@ -473,7 +459,7 @@ private:
|
| return false;
|
| }
|
|
|
| - fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin());
|
| + fPaths.push_back_n(that->fPaths.count(), that->fPaths.begin());
|
| this->joinBounds(that->bounds());
|
| fIsIndexed = true;
|
| fMaxLineVertices += that->fMaxLineVertices;
|
| @@ -486,7 +472,6 @@ private:
|
| bool createGeom(MSAALineVertices& lines,
|
| MSAAQuadVertices& quads,
|
| const SkPath& path,
|
| - SkScalar srcSpaceTol,
|
| const SkMatrix& m,
|
| SkColor color,
|
| bool isIndexed) const {
|
| @@ -523,8 +508,7 @@ private:
|
| case SkPath::kConic_Verb: {
|
| SkScalar weight = iter.conicWeight();
|
| SkAutoConicToQuads converter;
|
| - const SkPoint* quadPts = converter.computeQuads(pts, weight,
|
| - kTolerance);
|
| + const SkPoint* quadPts = converter.computeQuads(pts, weight, kTolerance);
|
| for (int i = 0; i < converter.countQuads(); ++i) {
|
| add_quad(lines, quads, quadPts + i * 2, color, isIndexed,
|
| subpathIdxStart);
|
| @@ -555,7 +539,12 @@ private:
|
| return true;
|
| }
|
|
|
| - SkSTArray<1, Geometry, true> fGeoData;
|
| + struct PathInfo {
|
| + GrColor fColor;
|
| + SkPath fPath;
|
| + };
|
| +
|
| + SkSTArray<1, PathInfo, true> fPaths;
|
|
|
| SkMatrix fViewMatrix;
|
| int fMaxLineVertices;
|
| @@ -680,13 +669,8 @@ bool GrMSAAPathRenderer::internalDrawPath(GrDrawContext* drawContext,
|
|
|
| drawContext->drawBatch(pipelineBuilder, clip, batch);
|
| } else {
|
| - MSAAPathBatch::Geometry geometry;
|
| - geometry.fColor = color;
|
| - geometry.fPath = path;
|
| - geometry.fTolerance = kTolerance;
|
| -
|
| - SkAutoTUnref<MSAAPathBatch> batch(MSAAPathBatch::Create(geometry, viewMatrix,
|
| - devBounds));
|
| + SkAutoTUnref<MSAAPathBatch> batch(new MSAAPathBatch(color, path, viewMatrix,
|
| + devBounds));
|
| if (!batch->isValid()) {
|
| return false;
|
| }
|
|
|