| Index: src/gpu/batches/GrAAFillRectBatch.cpp
|
| diff --git a/src/gpu/batches/GrAAFillRectBatch.cpp b/src/gpu/batches/GrAAFillRectBatch.cpp
|
| index c6eb5ab9ed344f816b154eee8570e406a7f578d9..8760896604c60c2d99cfc224cbee6c09f1884bb5 100644
|
| --- a/src/gpu/batches/GrAAFillRectBatch.cpp
|
| +++ b/src/gpu/batches/GrAAFillRectBatch.cpp
|
| @@ -7,13 +7,12 @@
|
|
|
| #include "GrAAFillRectBatch.h"
|
|
|
| -#include "GrBatchFlushState.h"
|
| #include "GrColor.h"
|
| #include "GrDefaultGeoProcFactory.h"
|
| #include "GrResourceKey.h"
|
| #include "GrResourceProvider.h"
|
| +#include "GrTInstanceBatch.h"
|
| #include "GrTypes.h"
|
| -#include "GrVertexBatch.h"
|
| #include "SkMatrix.h"
|
| #include "SkRect.h"
|
|
|
| @@ -45,123 +44,6 @@ const GrIndexBuffer* get_index_buffer(GrResourceProvider* resourceProvider) {
|
| gAAFillRectIndexBufferKey);
|
| }
|
|
|
| -/*
|
| - * AAFillRectBatch is templated to optionally allow the insertion of an additional
|
| - * attribute for explicit local coordinates.
|
| - * To use this template, an implementation must define the following static functions:
|
| - * A Geometry struct
|
| - *
|
| - * bool CanCombine(const Geometry& mine, const Geometry& theirs,
|
| - * const GrPipelineOptimizations&)
|
| - *
|
| - * const GrGeometryProcessor* CreateGP(const Geometry& seedGeometry,
|
| - * const GrPipelineOptimizations& opts)
|
| - *
|
| - * Tesselate(intptr_t vertices, size_t vertexStride, const Geometry& geo,
|
| - * const GrPipelineOptimizations& opts)
|
| - */
|
| -template <typename Base>
|
| -class AAFillRectBatch : public GrVertexBatch {
|
| -public:
|
| - typedef typename Base::Geometry Geometry;
|
| -
|
| - static AAFillRectBatch* Create() {
|
| - return SkNEW(AAFillRectBatch);
|
| - }
|
| -
|
| - const char* name() const override { return "AAFillRectBatch"; }
|
| -
|
| - void getInvariantOutputColor(GrInitInvariantOutput* out) const override {
|
| - // When this is called on a batch, there is only one geometry bundle
|
| - out->setKnownFourComponents(fGeoData[0].fColor);
|
| - }
|
| -
|
| - void getInvariantOutputCoverage(GrInitInvariantOutput* out) const override {
|
| - out->setUnknownSingleComponent();
|
| - }
|
| -
|
| - void initBatchTracker(const GrPipelineOptimizations& opt) override {
|
| - opt.getOverrideColorIfSet(&fGeoData[0].fColor);
|
| - fOpts = opt;
|
| - }
|
| -
|
| - SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; }
|
| -
|
| - // to avoid even the initial copy of the struct, we have a getter for the first item which
|
| - // is used to seed the batch with its initial geometry. After seeding, the client should call
|
| - // init() so the Batch can initialize itself
|
| - Geometry* geometry() { return &fGeoData[0]; }
|
| - void init() {
|
| - const Geometry& geo = fGeoData[0];
|
| - this->setBounds(geo.fDevRect);
|
| - }
|
| -
|
| -private:
|
| - AAFillRectBatch() {
|
| - this->initClassID<AAFillRectBatch<Base>>();
|
| -
|
| - // Push back an initial geometry
|
| - fGeoData.push_back();
|
| - }
|
| -
|
| - void onPrepareDraws(Target* target) override {
|
| - SkAutoTUnref<const GrGeometryProcessor> gp(Base::CreateGP(this->seedGeometry(), fOpts));
|
| - if (!gp) {
|
| - SkDebugf("Couldn't create GrGeometryProcessor\n");
|
| - return;
|
| - }
|
| -
|
| - target->initDraw(gp, this->pipeline());
|
| -
|
| - size_t vertexStride = gp->getVertexStride();
|
| - int instanceCount = fGeoData.count();
|
| -
|
| - SkAutoTUnref<const GrIndexBuffer> indexBuffer(get_index_buffer(target->resourceProvider()));
|
| - InstancedHelper helper;
|
| - void* vertices = helper.init(target, kTriangles_GrPrimitiveType, vertexStride,
|
| - indexBuffer, kVertsPerAAFillRect, kIndicesPerAAFillRect,
|
| - instanceCount);
|
| - if (!vertices || !indexBuffer) {
|
| - SkDebugf("Could not allocate vertices\n");
|
| - return;
|
| - }
|
| -
|
| - for (int i = 0; i < instanceCount; i++) {
|
| - intptr_t verts = reinterpret_cast<intptr_t>(vertices) +
|
| - i * kVertsPerAAFillRect * vertexStride;
|
| - Base::Tesselate(verts, vertexStride, fGeoData[i], fOpts);
|
| - }
|
| - helper.recordDraw(target);
|
| - }
|
| -
|
| - const Geometry& seedGeometry() const { return fGeoData[0]; }
|
| -
|
| - bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override {
|
| - AAFillRectBatch* that = t->cast<AAFillRectBatch>();
|
| - if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pipeline(),
|
| - that->bounds(), caps)) {
|
| - return false;
|
| - }
|
| -
|
| - if (!Base::CanCombine(this->seedGeometry(), that->seedGeometry(), fOpts)) {
|
| - return false;
|
| - }
|
| -
|
| - // In the event of two batches, one who can tweak, one who cannot, we just fall back to
|
| - // not tweaking
|
| - if (fOpts.canTweakAlphaForCoverage() && !that->fOpts.canTweakAlphaForCoverage()) {
|
| - fOpts = that->fOpts;
|
| - }
|
| -
|
| - fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin());
|
| - this->joinBounds(that->bounds());
|
| - return true;
|
| - }
|
| -
|
| - GrPipelineOptimizations fOpts;
|
| - SkSTArray<1, Geometry, true> fGeoData;
|
| -};
|
| -
|
| static const GrGeometryProcessor* create_fill_rect_gp(
|
| const SkMatrix& viewMatrix,
|
| const GrPipelineOptimizations& opts,
|
| @@ -299,7 +181,18 @@ static void generate_aa_fill_rect_geometry(intptr_t verts,
|
| }
|
| }
|
|
|
| -class AAFillRectBatchNoLocalMatrixImp {
|
| +// Common functions
|
| +class AAFillRectBatchBase {
|
| +public:
|
| + static const int kVertsPerInstance = kVertsPerAAFillRect;
|
| + static const int kIndicesPerInstance = kIndicesPerAAFillRect;
|
| +
|
| + inline static const GrIndexBuffer* GetIndexBuffer(GrResourceProvider* rp) {
|
| + return get_index_buffer(rp);
|
| + }
|
| +};
|
| +
|
| +class AAFillRectBatchNoLocalMatrixImp : public AAFillRectBatchBase {
|
| public:
|
| struct Geometry {
|
| SkMatrix fViewMatrix;
|
| @@ -308,6 +201,8 @@ public:
|
| GrColor fColor;
|
| };
|
|
|
| + inline static const char* Name() { return "AAFillRectBatchNoLocalMatrix"; }
|
| +
|
| inline static bool CanCombine(const Geometry& mine, const Geometry& theirs,
|
| const GrPipelineOptimizations& opts) {
|
| // We apply the viewmatrix to the rect points on the cpu. However, if the pipeline uses
|
| @@ -337,7 +232,7 @@ public:
|
| }
|
| };
|
|
|
| -class AAFillRectBatchLocalMatrixImp {
|
| +class AAFillRectBatchLocalMatrixImp : public AAFillRectBatchBase {
|
| public:
|
| struct Geometry {
|
| SkMatrix fViewMatrix;
|
| @@ -347,6 +242,8 @@ public:
|
| GrColor fColor;
|
| };
|
|
|
| + inline static const char* Name() { return "AAFillRectBatchLocalMatrix"; }
|
| +
|
| inline static bool CanCombine(const Geometry& mine, const Geometry& theirs,
|
| const GrPipelineOptimizations&) {
|
| return true;
|
| @@ -374,8 +271,8 @@ public:
|
| }
|
| };
|
|
|
| -typedef AAFillRectBatch<AAFillRectBatchNoLocalMatrixImp> AAFillRectBatchNoLocalMatrix;
|
| -typedef AAFillRectBatch<AAFillRectBatchLocalMatrixImp> AAFillRectBatchLocalMatrix;
|
| +typedef GrTInstanceBatch<AAFillRectBatchNoLocalMatrixImp> AAFillRectBatchNoLocalMatrix;
|
| +typedef GrTInstanceBatch<AAFillRectBatchLocalMatrixImp> AAFillRectBatchLocalMatrix;
|
|
|
| namespace GrAAFillRectBatch {
|
|
|
|
|