| Index: src/gpu/batches/GrAAFillRectBatch.cpp
|
| diff --git a/src/gpu/batches/GrAAFillRectBatch.cpp b/src/gpu/batches/GrAAFillRectBatch.cpp
|
| index cba91c67e64891ef2f97793277e4a4e041054786..f8d4f8d03994d2b463cc0f5a99dbae1940a97eaf 100644
|
| --- a/src/gpu/batches/GrAAFillRectBatch.cpp
|
| +++ b/src/gpu/batches/GrAAFillRectBatch.cpp
|
| @@ -200,13 +200,16 @@ public:
|
|
|
| static AAFillRectNoLocalMatrixBatch* Create() { return new AAFillRectNoLocalMatrixBatch; }
|
|
|
| - const char* name() const override { return Name(); }
|
| + const char* name() const override { return "AAFillRectBatchNoLocalMatrix"; }
|
|
|
| SkString dumpInfo() const override {
|
| SkString str;
|
| str.appendf("# batched: %d\n", fGeoData.count());
|
| for (int i = 0; i < fGeoData.count(); ++i) {
|
| - str.append(DumpInfo(fGeoData[i], i));
|
| + const Geometry& geo = fGeoData[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);
|
| }
|
| str.append(INHERITED::dumpInfo());
|
| return str;
|
| @@ -217,7 +220,7 @@ public:
|
| GrBatchToXPOverrides* overrides) const override {
|
| // When this is called on a batch, there is only one geometry bundle
|
| color->setKnownFourComponents(fGeoData[0].fColor);
|
| - InitInvariantOutputCoverage(coverage);
|
| + coverage->setUnknownSingleComponent();
|
| }
|
|
|
| void initBatchTracker(const GrXPOverridesForBatch& overrides) override {
|
| @@ -228,92 +231,32 @@ public:
|
| SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
|
|
|
| // After seeding, the client should call init() so the Batch can initialize itself
|
| - void init() {
|
| - const Geometry& geo = fGeoData[0];
|
| - SetBounds(geo, &fBounds);
|
| - }
|
| -
|
| - void updateBoundsAfterAppend() {
|
| - const Geometry& geo = fGeoData.back();
|
| - UpdateBoundsAfterAppend(geo, &fBounds);
|
| - }
|
| + void init() { fBounds = fGeoData[0].fDevRect; }
|
|
|
| private:
|
| - static const int kVertsPerInstance = kVertsPerAAFillRect;
|
| - static const int kIndicesPerInstance = kIndicesPerAAFillRect;
|
| -
|
| - static void InitInvariantOutputCoverage(GrInitInvariantOutput* out) {
|
| - out->setUnknownSingleComponent();
|
| - }
|
| -
|
| - static const GrBuffer* GetIndexBuffer(GrResourceProvider* rp) {
|
| - return get_index_buffer(rp);
|
| - }
|
| -
|
| - static void SetBounds(const Geometry& geo, SkRect* outBounds) {
|
| - *outBounds = geo.fDevRect;
|
| - }
|
| -
|
| - static void UpdateBoundsAfterAppend(const Geometry& geo, SkRect* outBounds) {
|
| - outBounds->join(geo.fDevRect);
|
| - }
|
| -
|
| - static const char* Name() { return "AAFillRectBatchNoLocalMatrix"; }
|
| -
|
| - static SkString DumpInfo(const Geometry& geo, int index) {
|
| - SkString str;
|
| - str.appendf("%d: Color: 0x%08x, Rect [L: %.2f, T: %.2f, R: %.2f, B: %.2f]\n",
|
| - index,
|
| - geo.fColor,
|
| - geo.fRect.fLeft, geo.fRect.fTop, geo.fRect.fRight, geo.fRect.fBottom);
|
| - return str;
|
| - }
|
| -
|
| - static bool CanCombine(const Geometry& mine, const Geometry& theirs,
|
| - const GrXPOverridesForBatch& overrides) {
|
| - // We apply the viewmatrix to the rect points on the cpu. However, if the pipeline uses
|
| - // local coords then we won't be able to batch. We could actually upload the viewmatrix
|
| - // using vertex attributes in these cases, but haven't investigated that
|
| - return !overrides.readsLocalCoords() || mine.fViewMatrix.cheapEqualTo(theirs.fViewMatrix);
|
| - }
|
| -
|
| - static sk_sp<GrGeometryProcessor> MakeGP(const Geometry& geo,
|
| - const GrXPOverridesForBatch& overrides) {
|
| - sk_sp<GrGeometryProcessor> gp =
|
| - create_fill_rect_gp(geo.fViewMatrix, overrides,
|
| - GrDefaultGeoProcFactory::LocalCoords::kUsePosition_Type);
|
| -
|
| - SkASSERT(overrides.canTweakAlphaForCoverage() ?
|
| - gp->getVertexStride() == sizeof(GrDefaultGeoProcFactory::PositionColorAttr) :
|
| - gp->getVertexStride() ==
|
| - sizeof(GrDefaultGeoProcFactory::PositionColorCoverageAttr));
|
| - return gp;
|
| - }
|
| -
|
| - static void Tesselate(intptr_t vertices, size_t vertexStride, const Geometry& geo,
|
| - const GrXPOverridesForBatch& overrides) {
|
| - generate_aa_fill_rect_geometry(vertices, vertexStride,
|
| - geo.fColor, geo.fViewMatrix, geo.fRect, geo.fDevRect,
|
| - overrides, nullptr);
|
| - }
|
| -
|
| AAFillRectNoLocalMatrixBatch() : INHERITED(ClassID()) {}
|
|
|
| void onPrepareDraws(Target* target) const override {
|
| - sk_sp<GrGeometryProcessor> gp(MakeGP(this->seedGeometry(), fOverrides));
|
| + sk_sp<GrGeometryProcessor> gp =
|
| + create_fill_rect_gp(fGeoData[0].fViewMatrix, fOverrides,
|
| + GrDefaultGeoProcFactory::LocalCoords::kUsePosition_Type);
|
| if (!gp) {
|
| SkDebugf("Couldn't create GrGeometryProcessor\n");
|
| return;
|
| }
|
| + SkASSERT(fOverrides.canTweakAlphaForCoverage() ?
|
| + gp->getVertexStride() == sizeof(GrDefaultGeoProcFactory::PositionColorAttr) :
|
| + gp->getVertexStride() ==
|
| + sizeof(GrDefaultGeoProcFactory::PositionColorCoverageAttr));
|
|
|
| size_t vertexStride = gp->getVertexStride();
|
| int instanceCount = fGeoData.count();
|
|
|
| - SkAutoTUnref<const GrBuffer> indexBuffer(GetIndexBuffer(target->resourceProvider()));
|
| + SkAutoTUnref<const GrBuffer> indexBuffer(get_index_buffer(target->resourceProvider()));
|
| InstancedHelper helper;
|
| void* vertices = helper.init(target, kTriangles_GrPrimitiveType, vertexStride,
|
| - indexBuffer, kVertsPerInstance,
|
| - kIndicesPerInstance, instanceCount);
|
| + indexBuffer, kVertsPerAAFillRect,
|
| + kIndicesPerAAFillRect, instanceCount);
|
| if (!vertices || !indexBuffer) {
|
| SkDebugf("Could not allocate vertices\n");
|
| return;
|
| @@ -321,14 +264,15 @@ private:
|
|
|
| for (int i = 0; i < instanceCount; i++) {
|
| intptr_t verts = reinterpret_cast<intptr_t>(vertices) +
|
| - i * kVertsPerInstance * vertexStride;
|
| - Tesselate(verts, vertexStride, fGeoData[i], fOverrides);
|
| + i * kVertsPerAAFillRect * vertexStride;
|
| + generate_aa_fill_rect_geometry(verts, vertexStride,
|
| + fGeoData[i].fColor, fGeoData[i].fViewMatrix,
|
| + fGeoData[i].fRect, fGeoData[i].fDevRect, fOverrides,
|
| + nullptr);
|
| }
|
| helper.recordDraw(target, gp.get());
|
| }
|
|
|
| - const Geometry& seedGeometry() const { return fGeoData[0]; }
|
| -
|
| bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override {
|
| AAFillRectNoLocalMatrixBatch* that = t->cast<AAFillRectNoLocalMatrixBatch>();
|
| if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pipeline(),
|
| @@ -336,7 +280,11 @@ private:
|
| return false;
|
| }
|
|
|
| - if (!CanCombine(this->seedGeometry(), that->seedGeometry(), fOverrides)) {
|
| + // We apply the viewmatrix to the rect points on the cpu. However, if the pipeline uses
|
| + // local coords then we won't be able to batch. We could actually upload the viewmatrix
|
| + // using vertex attributes in these cases, but haven't investigated that
|
| + if (fOverrides.readsLocalCoords() &&
|
| + !fGeoData[0].fViewMatrix.cheapEqualTo(that->fGeoData[0].fViewMatrix)) {
|
| return false;
|
| }
|
|
|
| @@ -371,13 +319,16 @@ public:
|
|
|
| static AAFillRectLocalMatrixBatch* Create() { return new AAFillRectLocalMatrixBatch; }
|
|
|
| - const char* name() const override { return Name(); }
|
| + const char* name() const override { return "AAFillRectBatchLocalMatrix"; }
|
|
|
| SkString dumpInfo() const override {
|
| SkString str;
|
| str.appendf("# batched: %d\n", fGeoData.count());
|
| for (int i = 0; i < fGeoData.count(); ++i) {
|
| - str.append(DumpInfo(fGeoData[i], i));
|
| + const Geometry& geo = fGeoData[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);
|
| }
|
| str.append(INHERITED::dumpInfo());
|
| return str;
|
| @@ -388,7 +339,7 @@ public:
|
| GrBatchToXPOverrides* overrides) const override {
|
| // When this is called on a batch, there is only one geometry bundle
|
| color->setKnownFourComponents(fGeoData[0].fColor);
|
| - InitInvariantOutputCoverage(coverage);
|
| + coverage->setUnknownSingleComponent();
|
| }
|
|
|
| void initBatchTracker(const GrXPOverridesForBatch& overrides) override {
|
| @@ -399,90 +350,33 @@ public:
|
| SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
|
|
|
| // After seeding, the client should call init() so the Batch can initialize itself
|
| - void init() {
|
| - const Geometry& geo = fGeoData[0];
|
| - SetBounds(geo, &fBounds);
|
| - }
|
| -
|
| - void updateBoundsAfterAppend() {
|
| - const Geometry& geo = fGeoData.back();
|
| - UpdateBoundsAfterAppend(geo, &fBounds);
|
| - }
|
| + void init() { fBounds = fGeoData[0].fDevRect; }
|
|
|
| private:
|
| - static const int kVertsPerInstance = kVertsPerAAFillRect;
|
| - static const int kIndicesPerInstance = kIndicesPerAAFillRect;
|
| -
|
| - static void InitInvariantOutputCoverage(GrInitInvariantOutput* out) {
|
| - out->setUnknownSingleComponent();
|
| - }
|
| -
|
| - static const GrBuffer* GetIndexBuffer(GrResourceProvider* rp) {
|
| - return get_index_buffer(rp);
|
| - }
|
| -
|
| - static void SetBounds(const Geometry& geo, SkRect* outBounds) {
|
| - *outBounds = geo.fDevRect;
|
| - }
|
| -
|
| - static void UpdateBoundsAfterAppend(const Geometry& geo, SkRect* outBounds) {
|
| - outBounds->join(geo.fDevRect);
|
| - }
|
| -
|
| - static const char* Name() { return "AAFillRectBatchLocalMatrix"; }
|
| -
|
| - static SkString DumpInfo(const Geometry& geo, int index) {
|
| - SkString str;
|
| - str.appendf("%d: Color: 0x%08x, Rect [L: %.2f, T: %.2f, R: %.2f, B: %.2f]\n",
|
| - index,
|
| - geo.fColor,
|
| - geo.fRect.fLeft, geo.fRect.fTop, geo.fRect.fRight, geo.fRect.fBottom);
|
| - return str;
|
| - }
|
| -
|
| - static bool CanCombine(const Geometry& mine, const Geometry& theirs,
|
| - const GrXPOverridesForBatch& overrides) {
|
| - return true;
|
| - }
|
| -
|
| - static sk_sp<GrGeometryProcessor> MakeGP(const Geometry& geo,
|
| - const GrXPOverridesForBatch& overrides) {
|
| - sk_sp<GrGeometryProcessor> gp =
|
| - create_fill_rect_gp(geo.fViewMatrix, overrides,
|
| - GrDefaultGeoProcFactory::LocalCoords::kHasExplicit_Type);
|
| -
|
| - SkASSERT(overrides.canTweakAlphaForCoverage() ?
|
| - gp->getVertexStride() ==
|
| - sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordAttr) :
|
| - gp->getVertexStride() ==
|
| - sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordCoverage));
|
| - return gp;
|
| - }
|
| -
|
| - static void Tesselate(intptr_t vertices, size_t vertexStride, const Geometry& geo,
|
| - const GrXPOverridesForBatch& overrides) {
|
| - generate_aa_fill_rect_geometry(vertices, vertexStride,
|
| - geo.fColor, geo.fViewMatrix, geo.fRect, geo.fDevRect,
|
| - overrides, &geo.fLocalMatrix);
|
| - }
|
| -
|
| AAFillRectLocalMatrixBatch() : INHERITED(ClassID()) {}
|
|
|
| void onPrepareDraws(Target* target) const override {
|
| - sk_sp<GrGeometryProcessor> gp(MakeGP(this->seedGeometry(), fOverrides));
|
| + sk_sp<GrGeometryProcessor> gp =
|
| + create_fill_rect_gp(fGeoData[0].fViewMatrix, fOverrides,
|
| + GrDefaultGeoProcFactory::LocalCoords::kHasExplicit_Type);
|
| if (!gp) {
|
| SkDebugf("Couldn't create GrGeometryProcessor\n");
|
| return;
|
| }
|
| + SkASSERT(fOverrides.canTweakAlphaForCoverage() ?
|
| + gp->getVertexStride() ==
|
| + sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordAttr) :
|
| + gp->getVertexStride() ==
|
| + sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordCoverage));
|
|
|
| size_t vertexStride = gp->getVertexStride();
|
| int instanceCount = fGeoData.count();
|
|
|
| - SkAutoTUnref<const GrBuffer> indexBuffer(GetIndexBuffer(target->resourceProvider()));
|
| + SkAutoTUnref<const GrBuffer> indexBuffer(get_index_buffer(target->resourceProvider()));
|
| InstancedHelper helper;
|
| void* vertices = helper.init(target, kTriangles_GrPrimitiveType, vertexStride,
|
| - indexBuffer, kVertsPerInstance,
|
| - kIndicesPerInstance, instanceCount);
|
| + indexBuffer, kVertsPerAAFillRect,
|
| + kIndicesPerAAFillRect, instanceCount);
|
| if (!vertices || !indexBuffer) {
|
| SkDebugf("Could not allocate vertices\n");
|
| return;
|
| @@ -490,14 +384,15 @@ private:
|
|
|
| for (int i = 0; i < instanceCount; i++) {
|
| intptr_t verts = reinterpret_cast<intptr_t>(vertices) +
|
| - i * kVertsPerInstance * vertexStride;
|
| - Tesselate(verts, vertexStride, fGeoData[i], fOverrides);
|
| + i * kVertsPerAAFillRect * vertexStride;
|
| + generate_aa_fill_rect_geometry(verts, vertexStride, fGeoData[i].fColor,
|
| + fGeoData[i].fViewMatrix, fGeoData[i].fRect,
|
| + fGeoData[i].fDevRect, fOverrides,
|
| + &fGeoData[i].fLocalMatrix);
|
| }
|
| helper.recordDraw(target, gp.get());
|
| }
|
|
|
| - const Geometry& seedGeometry() const { return fGeoData[0]; }
|
| -
|
| bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override {
|
| AAFillRectLocalMatrixBatch* that = t->cast<AAFillRectLocalMatrixBatch>();
|
| if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pipeline(),
|
| @@ -505,10 +400,6 @@ private:
|
| return false;
|
| }
|
|
|
| - if (!CanCombine(this->seedGeometry(), that->seedGeometry(), fOverrides)) {
|
| - return false;
|
| - }
|
| -
|
| // In the event of two batches, one who can tweak, one who cannot, we just fall back to
|
| // not tweaking
|
| if (fOverrides.canTweakAlphaForCoverage() && !that->fOverrides.canTweakAlphaForCoverage()) {
|
|
|