| Index: src/gpu/batches/GrAAStrokeRectBatch.cpp
|
| diff --git a/src/gpu/batches/GrAAStrokeRectBatch.cpp b/src/gpu/batches/GrAAStrokeRectBatch.cpp
|
| index 4472b0125b74ea48fe9d968fa6b0d83eed876a3b..0a9601f3102f87f27bdd10eb4057e47f2e0cf055 100644
|
| --- a/src/gpu/batches/GrAAStrokeRectBatch.cpp
|
| +++ b/src/gpu/batches/GrAAStrokeRectBatch.cpp
|
| @@ -53,14 +53,10 @@ public:
|
| SkRect fDevOutsideAssist;
|
| SkRect fDevInside;
|
| GrColor fColor;
|
| - bool fMiterStroke;
|
| };
|
|
|
| - static GrDrawBatch* Create(GrColor color, const SkMatrix& viewMatrix, const SkRect& devOutside,
|
| - const SkRect& devOutsideAssist, const SkRect& devInside,
|
| - bool miterStroke) {
|
| - return new AAStrokeRectBatch(color, viewMatrix, devOutside, devOutsideAssist, devInside,
|
| - miterStroke);
|
| + static AAStrokeRectBatch* Create(const SkMatrix& viewMatrix, bool miterStroke) {
|
| + return new AAStrokeRectBatch(viewMatrix, miterStroke);
|
| }
|
|
|
| const char* name() const override { return "AAStrokeRect"; }
|
| @@ -76,27 +72,46 @@ public:
|
|
|
| SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
|
|
|
| -private:
|
| - void onPrepareDraws(Target*) override;
|
| - void initBatchTracker(const GrPipelineOptimizations&) override;
|
| + bool canAppend(const SkMatrix& viewMatrix, bool miterStroke) {
|
| + return fViewMatrix.cheapEqualTo(viewMatrix) && fMiterStroke == miterStroke;
|
| + }
|
|
|
| - AAStrokeRectBatch(GrColor color, const SkMatrix& viewMatrix, const SkRect& devOutside,
|
| - const SkRect& devOutsideAssist, const SkRect& devInside, bool miterStroke)
|
| - : INHERITED(ClassID()) {
|
| - fBatch.fViewMatrix = viewMatrix;
|
| + void append(GrColor color, const SkRect& devOutside, const SkRect& devOutsideAssist,
|
| + const SkRect& devInside) {
|
| Geometry& geometry = fGeoData.push_back();
|
| geometry.fColor = color;
|
| geometry.fDevOutside = devOutside;
|
| geometry.fDevOutsideAssist = devOutsideAssist;
|
| geometry.fDevInside = devInside;
|
| - geometry.fMiterStroke = miterStroke;
|
| + }
|
|
|
| + void appendAndUpdateBounds(GrColor color, const SkRect& devOutside,
|
| + const SkRect& devOutsideAssist, const SkRect& devInside) {
|
| + this->append(color, devOutside, devOutsideAssist, devInside);
|
| +
|
| + SkRect bounds;
|
| + this->updateBounds(&bounds, fGeoData.back());
|
| + this->joinBounds(bounds);
|
| + }
|
| +
|
| + void init() { this->updateBounds(&fBounds, fGeoData[0]); }
|
| +
|
| +private:
|
| + void updateBounds(SkRect* bounds, const Geometry& geo) {
|
| // If we have miterstroke then we inset devOutside and outset devOutsideAssist, so we need
|
| // the join for proper bounds
|
| - fBounds = geometry.fDevOutside;
|
| - fBounds.join(geometry.fDevOutsideAssist);
|
| + *bounds = geo.fDevOutside;
|
| + bounds->join(geo.fDevOutsideAssist);
|
| }
|
|
|
| + void onPrepareDraws(Target*) override;
|
| + void initBatchTracker(const GrPipelineOptimizations&) override;
|
| +
|
| + AAStrokeRectBatch(const SkMatrix& viewMatrix,bool miterStroke)
|
| + : INHERITED(ClassID()) {
|
| + fViewMatrix = viewMatrix;
|
| + fMiterStroke = miterStroke;
|
| + }
|
|
|
| static const int kMiterIndexCnt = 3 * 24;
|
| static const int kMiterVertexCnt = 16;
|
| @@ -113,9 +128,10 @@ private:
|
| bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; }
|
| bool canTweakAlphaForCoverage() const { return fBatch.fCanTweakAlphaForCoverage; }
|
| bool colorIgnored() const { return fBatch.fColorIgnored; }
|
| - const SkMatrix& viewMatrix() const { return fBatch.fViewMatrix; }
|
| - bool miterStroke() const { return fBatch.fMiterStroke; }
|
| bool coverageIgnored() const { return fBatch.fCoverageIgnored; }
|
| + const Geometry& geometry() const { return fGeoData[0]; }
|
| + const SkMatrix& viewMatrix() const { return fViewMatrix; }
|
| + bool miterStroke() const { return fMiterStroke; }
|
|
|
| bool onCombineIfPossible(GrBatch* t, const GrCaps&) override;
|
|
|
| @@ -132,17 +148,17 @@ private:
|
| bool tweakAlphaForCoverage) const;
|
|
|
| struct BatchTracker {
|
| - SkMatrix fViewMatrix;
|
| GrColor fColor;
|
| bool fUsesLocalCoords;
|
| bool fColorIgnored;
|
| bool fCoverageIgnored;
|
| - bool fMiterStroke;
|
| bool fCanTweakAlphaForCoverage;
|
| };
|
|
|
| BatchTracker fBatch;
|
| SkSTArray<1, Geometry, true> fGeoData;
|
| + SkMatrix fViewMatrix;
|
| + bool fMiterStroke;
|
|
|
| typedef GrVertexBatch INHERITED;
|
| };
|
| @@ -159,7 +175,6 @@ void AAStrokeRectBatch::initBatchTracker(const GrPipelineOptimizations& opt) {
|
| fBatch.fColor = fGeoData[0].fColor;
|
| fBatch.fUsesLocalCoords = opt.readsLocalCoords();
|
| fBatch.fCoverageIgnored = !opt.readsCoverage();
|
| - fBatch.fMiterStroke = fGeoData[0].fMiterStroke;
|
| fBatch.fCanTweakAlphaForCoverage = opt.canTweakAlphaForCoverage();
|
| }
|
|
|
| @@ -210,7 +225,7 @@ void AAStrokeRectBatch::onPrepareDraws(Target* target) {
|
| args.fDevOutside,
|
| args.fDevOutsideAssist,
|
| args.fDevInside,
|
| - args.fMiterStroke,
|
| + fMiterStroke,
|
| canTweakAlphaForCoverage);
|
| }
|
| helper.recordDraw(target);
|
| @@ -462,8 +477,28 @@ GrDrawBatch* Create(GrColor color,
|
| const SkRect& devOutsideAssist,
|
| const SkRect& devInside,
|
| bool miterStroke) {
|
| - return AAStrokeRectBatch::Create(color, viewMatrix, devOutside, devOutsideAssist, devInside,
|
| - miterStroke);
|
| + AAStrokeRectBatch* batch = AAStrokeRectBatch::Create(viewMatrix, miterStroke);
|
| + batch->append(color, devOutside, devOutsideAssist, devInside);
|
| + batch->init();
|
| + return batch;
|
| +}
|
| +
|
| +bool Append(GrBatch* origBatch,
|
| + GrColor color,
|
| + const SkMatrix& viewMatrix,
|
| + const SkRect& devOutside,
|
| + const SkRect& devOutsideAssist,
|
| + const SkRect& devInside,
|
| + bool miterStroke) {
|
| + AAStrokeRectBatch* batch = origBatch->cast<AAStrokeRectBatch>();
|
| +
|
| + // we can't batch across vm changes
|
| + if (!batch->canAppend(viewMatrix, miterStroke)) {
|
| + return false;
|
| + }
|
| +
|
| + batch->appendAndUpdateBounds(color, devOutside, devOutsideAssist, devInside);
|
| + return true;
|
| }
|
|
|
| };
|
|
|