| Index: src/gpu/batches/GrNonAAFillRectBatch.cpp
|
| diff --git a/src/gpu/batches/GrNonAAFillRectBatch.cpp b/src/gpu/batches/GrNonAAFillRectBatch.cpp
|
| index faccdf6798db74907176dfd9479b5a008bac4957..d40a0c9cec2c1ff965b5ebfec5d77cfb1f69084f 100644
|
| --- a/src/gpu/batches/GrNonAAFillRectBatch.cpp
|
| +++ b/src/gpu/batches/GrNonAAFillRectBatch.cpp
|
| @@ -91,25 +91,37 @@ class NonAAFillRectBatch : public GrVertexBatch {
|
| public:
|
| DEFINE_BATCH_CLASS_ID
|
|
|
| - struct Geometry {
|
| - SkMatrix fViewMatrix;
|
| - SkRect fRect;
|
| - GrQuad fLocalQuad;
|
| - GrColor fColor;
|
| - };
|
| -
|
| - static NonAAFillRectBatch* Create() { return new NonAAFillRectBatch; }
|
| + NonAAFillRectBatch(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect,
|
| + const SkRect* localRect, const SkMatrix* localMatrix)
|
| + : INHERITED(ClassID()) {
|
| + SkASSERT(!viewMatrix.hasPerspective() && (!localMatrix ||
|
| + !localMatrix->hasPerspective()));
|
| + RectInfo& info = fRects.push_back();
|
| + info.fColor = color;
|
| + info.fViewMatrix = viewMatrix;
|
| + info.fRect = rect;
|
| + if (localRect && localMatrix) {
|
| + info.fLocalQuad.setFromMappedRect(*localRect, *localMatrix);
|
| + } else if (localRect) {
|
| + info.fLocalQuad.set(*localRect);
|
| + } else if (localMatrix) {
|
| + info.fLocalQuad.setFromMappedRect(rect, *localMatrix);
|
| + } else {
|
| + info.fLocalQuad.set(rect);
|
| + }
|
| + viewMatrix.mapRect(&fBounds, fRects[0].fRect);
|
| + }
|
|
|
| const char* name() const override { return "NonAAFillRectBatch"; }
|
|
|
| SkString dumpInfo() const override {
|
| SkString str;
|
| - str.appendf("# batched: %d\n", fGeoData.count());
|
| - for (int i = 0; i < fGeoData.count(); ++i) {
|
| - const Geometry& geo = fGeoData[i];
|
| + str.appendf("# batched: %d\n", fRects.count());
|
| + for (int i = 0; i < fRects.count(); ++i) {
|
| + const RectInfo& info = fRects[i];
|
| str.appendf("%d: Color: 0x%08x, Rect [L: %.2f, T: %.2f, R: %.2f, B: %.2f]\n",
|
| - i, geo.fColor,
|
| - geo.fRect.fLeft, geo.fRect.fTop, geo.fRect.fRight, geo.fRect.fBottom);
|
| + i, info.fColor,
|
| + info.fRect.fLeft, info.fRect.fTop, info.fRect.fRight, info.fRect.fBottom);
|
| }
|
| str.append(INHERITED::dumpInfo());
|
| return str;
|
| @@ -119,25 +131,20 @@ public:
|
| GrInitInvariantOutput* coverage,
|
| GrBatchToXPOverrides* overrides) const override {
|
| // When this is called on a batch, there is only one geometry bundle
|
| - color->setKnownFourComponents(fGeoData[0].fColor);
|
| + color->setKnownFourComponents(fRects[0].fColor);
|
| coverage->setKnownSingleComponent(0xff);
|
| }
|
|
|
| void initBatchTracker(const GrXPOverridesForBatch& overrides) override {
|
| - overrides.getOverrideColorIfSet(&fGeoData[0].fColor);
|
| + overrides.getOverrideColorIfSet(&fRects[0].fColor);
|
| fOverrides = overrides;
|
| }
|
|
|
| - SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
|
| -
|
| - // After seeding, the client should call init() so the Batch can initialize itself
|
| - void init() { fGeoData[0].fViewMatrix.mapRect(&fBounds, fGeoData[0].fRect); }
|
| -
|
| private:
|
| NonAAFillRectBatch() : INHERITED(ClassID()) {}
|
|
|
| void onPrepareDraws(Target* target) const override {
|
| - sk_sp<GrGeometryProcessor> gp = make_gp(fGeoData[0].fViewMatrix, fOverrides.readsCoverage(),
|
| + sk_sp<GrGeometryProcessor> gp = make_gp(fRects[0].fViewMatrix, fOverrides.readsCoverage(),
|
| true, nullptr);
|
| if (!gp) {
|
| SkDebugf("Couldn't create GrGeometryProcessor\n");
|
| @@ -147,7 +154,7 @@ private:
|
| sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordAttr));
|
|
|
| size_t vertexStride = gp->getVertexStride();
|
| - int instanceCount = fGeoData.count();
|
| + int instanceCount = fRects.count();
|
|
|
| SkAutoTUnref<const GrBuffer> indexBuffer(target->resourceProvider()->refQuadIndexBuffer());
|
| InstancedHelper helper;
|
| @@ -162,8 +169,8 @@ private:
|
| for (int i = 0; i < instanceCount; i++) {
|
| intptr_t verts = reinterpret_cast<intptr_t>(vertices) +
|
| i * kVertsPerInstance * vertexStride;
|
| - tesselate(verts, vertexStride, fGeoData[i].fColor, fGeoData[i].fViewMatrix,
|
| - fGeoData[i].fRect, &fGeoData[i].fLocalQuad);
|
| + tesselate(verts, vertexStride, fRects[i].fColor, fRects[i].fViewMatrix,
|
| + fRects[i].fRect, &fRects[i].fLocalQuad);
|
| }
|
| helper.recordDraw(target, gp.get());
|
| }
|
| @@ -181,13 +188,20 @@ private:
|
| fOverrides = that->fOverrides;
|
| }
|
|
|
| - fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin());
|
| + fRects.push_back_n(that->fRects.count(), that->fRects.begin());
|
| this->joinBounds(that->bounds());
|
| return true;
|
| }
|
|
|
| + struct RectInfo {
|
| + GrColor fColor;
|
| + SkMatrix fViewMatrix;
|
| + SkRect fRect;
|
| + GrQuad fLocalQuad;
|
| + };
|
| +
|
| GrXPOverridesForBatch fOverrides;
|
| - SkSTArray<1, Geometry, true> fGeoData;
|
| + SkSTArray<1, RectInfo, true> fRects;
|
|
|
| typedef GrVertexBatch INHERITED;
|
| };
|
| @@ -197,25 +211,33 @@ class NonAAFillRectPerspectiveBatch : public GrVertexBatch {
|
| public:
|
| DEFINE_BATCH_CLASS_ID
|
|
|
| - struct Geometry {
|
| - SkMatrix fViewMatrix;
|
| - SkMatrix fLocalMatrix;
|
| - SkRect fRect;
|
| - SkRect fLocalRect;
|
| - GrColor fColor;
|
| - bool fHasLocalMatrix;
|
| - bool fHasLocalRect;
|
| - };
|
| -
|
| - static NonAAFillRectPerspectiveBatch* Create() { return new NonAAFillRectPerspectiveBatch; }
|
| + NonAAFillRectPerspectiveBatch(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect,
|
| + const SkRect* localRect, const SkMatrix* localMatrix)
|
| + : INHERITED(ClassID())
|
| + , fViewMatrix(viewMatrix) {
|
| + SkASSERT(viewMatrix.hasPerspective() || (localMatrix &&
|
| + localMatrix->hasPerspective()));
|
| + RectInfo& info = fRects.push_back();
|
| + info.fColor = color;
|
| + info.fRect = rect;
|
| + fHasLocalRect = SkToBool(localRect);
|
| + fHasLocalMatrix = SkToBool(localMatrix);
|
| + if (fHasLocalMatrix) {
|
| + fLocalMatrix = *localMatrix;
|
| + }
|
| + if (fHasLocalRect) {
|
| + info.fLocalRect = *localRect;
|
| + }
|
| + viewMatrix.mapRect(&fBounds, rect);
|
| + }
|
|
|
| const char* name() const override { return "NonAAFillRectPerspectiveBatch"; }
|
|
|
| SkString dumpInfo() const override {
|
| SkString str;
|
| - str.appendf("# batched: %d\n", fGeoData.count());
|
| - for (int i = 0; i < fGeoData.count(); ++i) {
|
| - const Geometry& geo = fGeoData[0];
|
| + str.appendf("# batched: %d\n", fRects.count());
|
| + for (int i = 0; i < fRects.count(); ++i) {
|
| + const RectInfo& geo = fRects[0];
|
| str.appendf("%d: Color: 0x%08x, Rect [L: %.2f, T: %.2f, R: %.2f, B: %.2f]\n",
|
| i, geo.fColor,
|
| geo.fRect.fLeft, geo.fRect.fTop, geo.fRect.fRight, geo.fRect.fBottom);
|
| @@ -228,40 +250,33 @@ public:
|
| GrInitInvariantOutput* coverage,
|
| GrBatchToXPOverrides* overrides) const override {
|
| // When this is called on a batch, there is only one geometry bundle
|
| - color->setKnownFourComponents(fGeoData[0].fColor);
|
| + color->setKnownFourComponents(fRects[0].fColor);
|
| coverage->setKnownSingleComponent(0xff);
|
| }
|
|
|
| void initBatchTracker(const GrXPOverridesForBatch& overrides) override {
|
| - overrides.getOverrideColorIfSet(&fGeoData[0].fColor);
|
| + overrides.getOverrideColorIfSet(&fRects[0].fColor);
|
| fOverrides = overrides;
|
| }
|
|
|
| - SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
|
| -
|
| - // After seeding, the client should call init() so the Batch can initialize itself
|
| - void init() { fGeoData[0].fViewMatrix.mapRect(&fBounds, fGeoData[0].fRect); }
|
| -
|
| private:
|
| NonAAFillRectPerspectiveBatch() : INHERITED(ClassID()) {}
|
|
|
| void onPrepareDraws(Target* target) const override {
|
| - sk_sp<GrGeometryProcessor> gp = make_gp(fGeoData[0].fViewMatrix, fOverrides.readsCoverage(),
|
| - fGeoData[0].fHasLocalRect,
|
| - fGeoData[0].fHasLocalMatrix
|
| - ? &fGeoData[0].fLocalMatrix
|
| - : nullptr);
|
| + sk_sp<GrGeometryProcessor> gp = make_gp(fViewMatrix, fOverrides.readsCoverage(),
|
| + fHasLocalRect,
|
| + fHasLocalMatrix ? &fLocalMatrix : nullptr);
|
| if (!gp) {
|
| SkDebugf("Couldn't create GrGeometryProcessor\n");
|
| return;
|
| }
|
| - SkASSERT(fGeoData[0].fHasLocalRect
|
| + SkASSERT(fHasLocalRect
|
| ? gp->getVertexStride() ==
|
| sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordAttr)
|
| : gp->getVertexStride() == sizeof(GrDefaultGeoProcFactory::PositionColorAttr));
|
|
|
| size_t vertexStride = gp->getVertexStride();
|
| - int instanceCount = fGeoData.count();
|
| + int instanceCount = fRects.count();
|
|
|
| SkAutoTUnref<const GrBuffer> indexBuffer(target->resourceProvider()->refQuadIndexBuffer());
|
| InstancedHelper helper;
|
| @@ -274,21 +289,19 @@ private:
|
| }
|
|
|
| for (int i = 0; i < instanceCount; i++) {
|
| - const Geometry& geo = fGeoData[i];
|
| + const RectInfo& info = fRects[i];
|
| intptr_t verts = reinterpret_cast<intptr_t>(vertices) +
|
| i * kVertsPerInstance * vertexStride;
|
| - if (geo.fHasLocalRect) {
|
| - GrQuad quad(geo.fLocalRect);
|
| - tesselate(verts, vertexStride, geo.fColor, geo.fViewMatrix, geo.fRect, &quad);
|
| + if (fHasLocalRect) {
|
| + GrQuad quad(info.fLocalRect);
|
| + tesselate(verts, vertexStride, info.fColor, fViewMatrix, info.fRect, &quad);
|
| } else {
|
| - tesselate(verts, vertexStride, geo.fColor, geo.fViewMatrix, geo.fRect, nullptr);
|
| + tesselate(verts, vertexStride, info.fColor, fViewMatrix, info.fRect, nullptr);
|
| }
|
| }
|
| helper.recordDraw(target, gp.get());
|
| }
|
|
|
| - const Geometry& seedGeometry() const { return fGeoData[0]; }
|
| -
|
| bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override {
|
| NonAAFillRectPerspectiveBatch* that = t->cast<NonAAFillRectPerspectiveBatch>();
|
| if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pipeline(),
|
| @@ -297,14 +310,13 @@ private:
|
| }
|
|
|
| // We could batch across perspective vm changes if we really wanted to
|
| - if (!fGeoData[0].fViewMatrix.cheapEqualTo(that->fGeoData[0].fViewMatrix)) {
|
| + if (!fViewMatrix.cheapEqualTo(that->fViewMatrix)) {
|
| return false;
|
| }
|
| - if (fGeoData[0].fHasLocalRect != that->fGeoData[0].fHasLocalRect) {
|
| + if (fHasLocalRect != that->fHasLocalRect) {
|
| return false;
|
| }
|
| - if (fGeoData[0].fHasLocalMatrix &&
|
| - !fGeoData[0].fLocalMatrix.cheapEqualTo(that->fGeoData[0].fLocalMatrix)) {
|
| + if (fHasLocalMatrix && !fLocalMatrix.cheapEqualTo(that->fLocalMatrix)) {
|
| return false;
|
| }
|
|
|
| @@ -314,13 +326,23 @@ private:
|
| fOverrides = that->fOverrides;
|
| }
|
|
|
| - fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin());
|
| + fRects.push_back_n(that->fRects.count(), that->fRects.begin());
|
| this->joinBounds(that->bounds());
|
| return true;
|
| }
|
|
|
| + struct RectInfo {
|
| + SkRect fRect;
|
| + GrColor fColor;
|
| + SkRect fLocalRect;
|
| + };
|
| +
|
| GrXPOverridesForBatch fOverrides;
|
| - SkSTArray<1, Geometry, true> fGeoData;
|
| + SkSTArray<1, RectInfo, true> fRects;
|
| + bool fHasLocalMatrix;
|
| + bool fHasLocalRect;
|
| + SkMatrix fLocalMatrix;
|
| + SkMatrix fViewMatrix;
|
|
|
| typedef GrVertexBatch INHERITED;
|
| };
|
| @@ -332,25 +354,7 @@ GrDrawBatch* Create(GrColor color,
|
| const SkRect& rect,
|
| const SkRect* localRect,
|
| const SkMatrix* localMatrix) {
|
| - NonAAFillRectBatch* batch = NonAAFillRectBatch::Create();
|
| - SkASSERT(!viewMatrix.hasPerspective() && (!localMatrix || !localMatrix->hasPerspective()));
|
| - NonAAFillRectBatch::Geometry& geo = batch->geoData()->push_back();
|
| -
|
| - geo.fColor = color;
|
| - geo.fViewMatrix = viewMatrix;
|
| - geo.fRect = rect;
|
| -
|
| - if (localRect && localMatrix) {
|
| - geo.fLocalQuad.setFromMappedRect(*localRect, *localMatrix);
|
| - } else if (localRect) {
|
| - geo.fLocalQuad.set(*localRect);
|
| - } else if (localMatrix) {
|
| - geo.fLocalQuad.setFromMappedRect(rect, *localMatrix);
|
| - } else {
|
| - geo.fLocalQuad.set(rect);
|
| - }
|
| - batch->init();
|
| - return batch;
|
| + return new NonAAFillRectBatch(color, viewMatrix, rect, localRect, localMatrix);
|
| }
|
|
|
| GrDrawBatch* CreateWithPerspective(GrColor color,
|
| @@ -358,23 +362,7 @@ GrDrawBatch* CreateWithPerspective(GrColor color,
|
| const SkRect& rect,
|
| const SkRect* localRect,
|
| const SkMatrix* localMatrix) {
|
| - NonAAFillRectPerspectiveBatch* batch = NonAAFillRectPerspectiveBatch::Create();
|
| - SkASSERT(viewMatrix.hasPerspective() || (localMatrix && localMatrix->hasPerspective()));
|
| - NonAAFillRectPerspectiveBatch::Geometry& geo = batch->geoData()->push_back();
|
| -
|
| - geo.fColor = color;
|
| - geo.fViewMatrix = viewMatrix;
|
| - geo.fRect = rect;
|
| - geo.fHasLocalRect = SkToBool(localRect);
|
| - geo.fHasLocalMatrix = SkToBool(localMatrix);
|
| - if (localMatrix) {
|
| - geo.fLocalMatrix = *localMatrix;
|
| - }
|
| - if (localRect) {
|
| - geo.fLocalRect = *localRect;
|
| - }
|
| - batch->init();
|
| - return batch;
|
| + return new NonAAFillRectPerspectiveBatch(color, viewMatrix, rect, localRect, localMatrix);
|
| }
|
|
|
| };
|
|
|