diff options
author | joshualitt <joshualitt@chromium.org> | 2015-08-19 06:54:08 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-08-19 06:54:08 -0700 |
commit | ae41b3834301444cf27b8aa729b8ad36666bdc08 (patch) | |
tree | 9e516e7aa00b8f3ad554eb367729754233d62172 /src | |
parent | 6458b6f0a8e8b1e16ec1640d17fe28ab05c8a95b (diff) |
fill rect batch refactor into separate batches
BUG=skia:
Review URL: https://codereview.chromium.org/1295773003
Diffstat (limited to 'src')
-rw-r--r-- | src/gpu/batches/GrAAFillRectBatch.cpp | 35 | ||||
-rw-r--r-- | src/gpu/batches/GrBWFillRectBatch.cpp | 421 | ||||
-rw-r--r-- | src/gpu/batches/GrTInstanceBatch.h | 4 |
3 files changed, 252 insertions, 208 deletions
diff --git a/src/gpu/batches/GrAAFillRectBatch.cpp b/src/gpu/batches/GrAAFillRectBatch.cpp index 8760896604..2554db6146 100644 --- a/src/gpu/batches/GrAAFillRectBatch.cpp +++ b/src/gpu/batches/GrAAFillRectBatch.cpp @@ -187,9 +187,14 @@ public: static const int kVertsPerInstance = kVertsPerAAFillRect; static const int kIndicesPerInstance = kIndicesPerAAFillRect; - inline static const GrIndexBuffer* GetIndexBuffer(GrResourceProvider* rp) { + static const GrIndexBuffer* GetIndexBuffer(GrResourceProvider* rp) { return get_index_buffer(rp); } + + template <class Geometry> + static void SetBounds(const Geometry& geo, SkRect* outBounds) { + *outBounds = geo.fDevRect; + } }; class AAFillRectBatchNoLocalMatrixImp : public AAFillRectBatchBase { @@ -201,18 +206,18 @@ public: GrColor fColor; }; - inline static const char* Name() { return "AAFillRectBatchNoLocalMatrix"; } + static const char* Name() { return "AAFillRectBatchNoLocalMatrix"; } - inline static bool CanCombine(const Geometry& mine, const Geometry& theirs, - const GrPipelineOptimizations& opts) { + 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 // 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 !opts.readsLocalCoords() || mine.fViewMatrix.cheapEqualTo(theirs.fViewMatrix); } - inline static const GrGeometryProcessor* CreateGP(const Geometry& geo, - const GrPipelineOptimizations& opts) { + static const GrGeometryProcessor* CreateGP(const Geometry& geo, + const GrPipelineOptimizations& opts) { const GrGeometryProcessor* gp = create_fill_rect_gp(geo.fViewMatrix, opts, GrDefaultGeoProcFactory::LocalCoords::kUsePosition_Type); @@ -224,8 +229,8 @@ public: return gp; } - inline static void Tesselate(intptr_t vertices, size_t vertexStride, const Geometry& geo, - const GrPipelineOptimizations& opts) { + static void Tesselate(intptr_t vertices, size_t vertexStride, const Geometry& geo, + const GrPipelineOptimizations& opts) { generate_aa_fill_rect_geometry(vertices, vertexStride, geo.fColor, geo.fViewMatrix, geo.fRect, geo.fDevRect, opts, NULL); @@ -242,15 +247,15 @@ public: GrColor fColor; }; - inline static const char* Name() { return "AAFillRectBatchLocalMatrix"; } + static const char* Name() { return "AAFillRectBatchLocalMatrix"; } - inline static bool CanCombine(const Geometry& mine, const Geometry& theirs, - const GrPipelineOptimizations&) { + static bool CanCombine(const Geometry& mine, const Geometry& theirs, + const GrPipelineOptimizations&) { return true; } - inline static const GrGeometryProcessor* CreateGP(const Geometry& geo, - const GrPipelineOptimizations& opts) { + static const GrGeometryProcessor* CreateGP(const Geometry& geo, + const GrPipelineOptimizations& opts) { const GrGeometryProcessor* gp = create_fill_rect_gp(geo.fViewMatrix, opts, GrDefaultGeoProcFactory::LocalCoords::kHasExplicit_Type); @@ -263,8 +268,8 @@ public: return gp; } - inline static void Tesselate(intptr_t vertices, size_t vertexStride, const Geometry& geo, - const GrPipelineOptimizations& opts) { + static void Tesselate(intptr_t vertices, size_t vertexStride, const Geometry& geo, + const GrPipelineOptimizations& opts) { generate_aa_fill_rect_geometry(vertices, vertexStride, geo.fColor, geo.fViewMatrix, geo.fRect, geo.fDevRect, opts, &geo.fLocalMatrix); diff --git a/src/gpu/batches/GrBWFillRectBatch.cpp b/src/gpu/batches/GrBWFillRectBatch.cpp index 6430cf2022..ffd4cefc86 100644 --- a/src/gpu/batches/GrBWFillRectBatch.cpp +++ b/src/gpu/batches/GrBWFillRectBatch.cpp @@ -11,229 +11,275 @@ #include "GrColor.h" #include "GrDefaultGeoProcFactory.h" #include "GrPrimitiveProcessor.h" +#include "GrResourceProvider.h" +#include "GrTInstanceBatch.h" #include "GrVertexBatch.h" -class GrBatchFlushState; -class SkMatrix; -struct SkRect; +// Common functions +class BWFillRectBatchBase { +public: + static const int kVertsPerInstance = 4; + static const int kIndicesPerInstance = 6; + + static const GrIndexBuffer* GetIndexBuffer(GrResourceProvider* rp) { + return rp->refQuadIndexBuffer(); + } + + template <typename Geometry> + static void SetBounds(const Geometry& geo, SkRect* outBounds) { + geo.fViewMatrix.mapRect(outBounds, geo.fRect); + } +}; + +/** We always use per-vertex colors so that rects can be batched across color changes. Sometimes + we have explicit local coords and sometimes not. We *could* always provide explicit local + coords and just duplicate the positions when the caller hasn't provided a local coord rect, + but we haven't seen a use case which frequently switches between local rect and no local + rect draws. + + The color param is used to determine whether the opaque hint can be set on the draw state. + The caller must populate the vertex colors itself. + + The vertex attrib order is always pos, color, [local coords]. + */ +static const GrGeometryProcessor* create_gp(const SkMatrix& viewMatrix, + bool readsCoverage, + bool hasExplicitLocalCoords, + const SkMatrix* localMatrix) { + using namespace GrDefaultGeoProcFactory; + Color color(Color::kAttribute_Type); + Coverage coverage(readsCoverage ? Coverage::kSolid_Type : Coverage::kNone_Type); + + // if we have a local rect, then we apply the localMatrix directly to the localRect to + // generate vertex local coords + if (hasExplicitLocalCoords) { + LocalCoords localCoords(LocalCoords::kHasExplicit_Type); + return GrDefaultGeoProcFactory::Create(color, coverage, localCoords, SkMatrix::I()); + } else { + LocalCoords localCoords(LocalCoords::kUsePosition_Type, localMatrix ? localMatrix : NULL); + return GrDefaultGeoProcFactory::CreateForDeviceSpace(color, coverage, localCoords, + viewMatrix); + } +} + +static void tesselate(intptr_t vertices, + size_t vertexStride, + GrColor color, + const SkMatrix& viewMatrix, + const SkRect& rect, + const SkRect* localRect, + const SkMatrix* localMatrix) { + SkPoint* positions = reinterpret_cast<SkPoint*>(vertices); + + positions->setRectFan(rect.fLeft, rect.fTop, + rect.fRight, rect.fBottom, vertexStride); + viewMatrix.mapPointsWithStride(positions, vertexStride, BWFillRectBatchBase::kVertsPerInstance); + + // TODO we should only do this if local coords are being read + if (localRect) { + static const int kLocalOffset = sizeof(SkPoint) + sizeof(GrColor); + SkPoint* coords = reinterpret_cast<SkPoint*>(vertices + kLocalOffset); + coords->setRectFan(localRect->fLeft, localRect->fTop, + localRect->fRight, localRect->fBottom, + vertexStride); + if (localMatrix) { + localMatrix->mapPointsWithStride(coords, vertexStride, + BWFillRectBatchBase::kVertsPerInstance); + } + } + + static const int kColorOffset = sizeof(SkPoint); + GrColor* vertColor = reinterpret_cast<GrColor*>(vertices + kColorOffset); + for (int j = 0; j < 4; ++j) { + *vertColor = color; + vertColor = (GrColor*) ((intptr_t) vertColor + vertexStride); + } +} -class BWFillRectBatch : public GrVertexBatch { +class BWFillRectBatchNoLocalMatrixImp : public BWFillRectBatchBase { public: struct Geometry { SkMatrix fViewMatrix; SkRect fRect; - SkRect fLocalRect; - SkMatrix fLocalMatrix; GrColor fColor; - bool fHasLocalRect; - bool fHasLocalMatrix; }; - static GrDrawBatch* Create(const Geometry& geometry) { - return SkNEW_ARGS(BWFillRectBatch, (geometry)); + static const char* Name() { return "BWFillRectBatchNoLocalMatrix"; } + + 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 + // 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 !opts.readsLocalCoords() || mine.fViewMatrix.cheapEqualTo(theirs.fViewMatrix); } - const char* name() const override { return "RectBatch"; } + static const GrGeometryProcessor* CreateGP(const Geometry& geo, + const GrPipelineOptimizations& opts) { + const GrGeometryProcessor* gp = create_gp(geo.fViewMatrix, opts.readsCoverage(), false, + NULL); - void getInvariantOutputColor(GrInitInvariantOutput* out) const override { - // When this is called on a batch, there is only one geometry bundle - out->setKnownFourComponents(fGeoData[0].fColor); + SkASSERT(gp->getVertexStride() == sizeof(GrDefaultGeoProcFactory::PositionColorAttr)); + return gp; } - void getInvariantOutputCoverage(GrInitInvariantOutput* out) const override { - out->setKnownSingleComponent(0xff); + static void Tesselate(intptr_t vertices, size_t vertexStride, const Geometry& geo, + const GrPipelineOptimizations& opts) { + tesselate(vertices, vertexStride, geo.fColor, geo.fViewMatrix, geo.fRect, NULL, NULL); } +}; - SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } +class BWFillRectBatchLocalMatrixImp : public BWFillRectBatchBase { +public: + struct Geometry { + SkMatrix fViewMatrix; + SkMatrix fLocalMatrix; + SkRect fRect; + GrColor fColor; + }; -private: - BWFillRectBatch(const Geometry& geometry) { - this->initClassID<BWFillRectBatch>(); - fGeoData.push_back(geometry); + static const char* Name() { return "BWFillRectBatchLocalMatrix"; } - fBounds = geometry.fRect; - geometry.fViewMatrix.mapRect(&fBounds); + 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 + // 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 !opts.readsLocalCoords() || mine.fViewMatrix.cheapEqualTo(theirs.fViewMatrix); } - GrColor color() const { return fBatch.fColor; } - bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; } - bool colorIgnored() const { return fBatch.fColorIgnored; } - const SkMatrix& viewMatrix() const { return fGeoData[0].fViewMatrix; } - const SkMatrix& localMatrix() const { return fGeoData[0].fLocalMatrix; } - bool hasLocalRect() const { return fGeoData[0].fHasLocalRect; } - bool hasLocalMatrix() const { return fGeoData[0].fHasLocalMatrix; } - bool coverageIgnored() const { return fBatch.fCoverageIgnored; } - - void initBatchTracker(const GrPipelineOptimizations& init) override { - // Handle any color overrides - if (!init.readsColor()) { - fGeoData[0].fColor = GrColor_ILLEGAL; - } - init.getOverrideColorIfSet(&fGeoData[0].fColor); + static const GrGeometryProcessor* CreateGP(const Geometry& geo, + const GrPipelineOptimizations& opts) { + const GrGeometryProcessor* gp = create_gp(geo.fViewMatrix, opts.readsCoverage(), false, + &geo.fLocalMatrix); - // setup batch properties - fBatch.fColorIgnored = !init.readsColor(); - fBatch.fColor = fGeoData[0].fColor; - fBatch.fUsesLocalCoords = init.readsLocalCoords(); - fBatch.fCoverageIgnored = !init.readsCoverage(); + SkASSERT(gp->getVertexStride() == sizeof(GrDefaultGeoProcFactory::PositionColorAttr)); + return gp; } - void onPrepareDraws(Target* target) override { - SkAutoTUnref<const GrGeometryProcessor> gp(this->createRectGP()); - if (!gp) { - SkDebugf("Could not create GrGeometryProcessor\n"); - return; - } - - target->initDraw(gp, this->pipeline()); - - int instanceCount = fGeoData.count(); - size_t vertexStride = gp->getVertexStride(); - SkASSERT(this->hasLocalRect() ? - vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordAttr) : - vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAttr)); - QuadHelper helper; - void* vertices = helper.init(target, vertexStride, instanceCount); + static void Tesselate(intptr_t vertices, size_t vertexStride, const Geometry& geo, + const GrPipelineOptimizations& opts) { + tesselate(vertices, vertexStride, geo.fColor, geo.fViewMatrix, geo.fRect, NULL, + &geo.fLocalMatrix); + } +}; - if (!vertices) { - return; - } +class BWFillRectBatchLocalRectImp : public BWFillRectBatchBase { +public: + struct Geometry { + SkMatrix fViewMatrix; + SkRect fRect; + SkRect fLocalRect; + GrColor fColor; + }; - for (int i = 0; i < instanceCount; i++) { - const Geometry& geom = fGeoData[i]; - - intptr_t offset = reinterpret_cast<intptr_t>(vertices) + - kVerticesPerQuad * i * vertexStride; - SkPoint* positions = reinterpret_cast<SkPoint*>(offset); - - positions->setRectFan(geom.fRect.fLeft, geom.fRect.fTop, - geom.fRect.fRight, geom.fRect.fBottom, vertexStride); - geom.fViewMatrix.mapPointsWithStride(positions, vertexStride, kVerticesPerQuad); - - // TODO we should only do this if local coords are being read - if (geom.fHasLocalRect) { - static const int kLocalOffset = sizeof(SkPoint) + sizeof(GrColor); - SkPoint* coords = reinterpret_cast<SkPoint*>(offset + kLocalOffset); - coords->setRectFan(geom.fLocalRect.fLeft, geom.fLocalRect.fTop, - geom.fLocalRect.fRight, geom.fLocalRect.fBottom, - vertexStride); - if (geom.fHasLocalMatrix) { - geom.fLocalMatrix.mapPointsWithStride(coords, vertexStride, kVerticesPerQuad); - } - } - - static const int kColorOffset = sizeof(SkPoint); - GrColor* vertColor = reinterpret_cast<GrColor*>(offset + kColorOffset); - for (int j = 0; j < 4; ++j) { - *vertColor = geom.fColor; - vertColor = (GrColor*) ((intptr_t) vertColor + vertexStride); - } - } + static const char* Name() { return "BWFillRectBatchLocalRect"; } - helper.recordDraw(target); + static bool CanCombine(const Geometry& mine, const Geometry& theirs, + const GrPipelineOptimizations& opts) { + return true; } - bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { - BWFillRectBatch* that = t->cast<BWFillRectBatch>(); - if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pipeline(), - that->bounds(), caps)) { - return false; - } + static const GrGeometryProcessor* CreateGP(const Geometry& geo, + const GrPipelineOptimizations& opts) { + const GrGeometryProcessor* gp = create_gp(geo.fViewMatrix, opts.readsCoverage(), true, + NULL); - if (this->hasLocalRect() != that->hasLocalRect()) { - return false; - } + SkASSERT(gp->getVertexStride() == + sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordAttr)); + return gp; + } - SkASSERT(this->usesLocalCoords() == that->usesLocalCoords()); - if (!this->hasLocalRect() && this->usesLocalCoords()) { - if (!this->viewMatrix().cheapEqualTo(that->viewMatrix())) { - return false; - } + static void Tesselate(intptr_t vertices, size_t vertexStride, const Geometry& geo, + const GrPipelineOptimizations& opts) { + tesselate(vertices, vertexStride, geo.fColor, geo.fViewMatrix, geo.fRect, &geo.fLocalRect, + NULL); + } +}; - if (this->hasLocalMatrix() != that->hasLocalMatrix()) { - return false; - } +class BWFillRectBatchLocalMatrixLocalRectImp : public BWFillRectBatchBase { +public: + struct Geometry { + SkMatrix fViewMatrix; + SkMatrix fLocalMatrix; + SkRect fRect; + SkRect fLocalRect; + GrColor fColor; + }; - if (this->hasLocalMatrix() && !this->localMatrix().cheapEqualTo(that->localMatrix())) { - return false; - } - } + static const char* Name() { return "BWFillRectBatchLocalMatrixLocalRect"; } - if (this->color() != that->color()) { - fBatch.fColor = GrColor_ILLEGAL; - } - fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin()); - this->joinBounds(that->bounds()); + static bool CanCombine(const Geometry& mine, const Geometry& theirs, + const GrPipelineOptimizations& opts) { return true; } + static const GrGeometryProcessor* CreateGP(const Geometry& geo, + const GrPipelineOptimizations& opts) { + const GrGeometryProcessor* gp = create_gp(geo.fViewMatrix, opts.readsCoverage(), true, + NULL); - /** We always use per-vertex colors so that rects can be batched across color changes. Sometimes - we have explicit local coords and sometimes not. We *could* always provide explicit local - coords and just duplicate the positions when the caller hasn't provided a local coord rect, - but we haven't seen a use case which frequently switches between local rect and no local - rect draws. - - The color param is used to determine whether the opaque hint can be set on the draw state. - The caller must populate the vertex colors itself. - - The vertex attrib order is always pos, color, [local coords]. - */ - const GrGeometryProcessor* createRectGP() const { - using namespace GrDefaultGeoProcFactory; - Color color(Color::kAttribute_Type); - Coverage coverage(this->coverageIgnored() ? Coverage::kNone_Type : Coverage::kSolid_Type); - - // if we have a local rect, then we apply the localMatrix directly to the localRect to - // generate vertex local coords - if (this->hasLocalRect()) { - LocalCoords localCoords(LocalCoords::kHasExplicit_Type); - return GrDefaultGeoProcFactory::Create(color, coverage, localCoords, SkMatrix::I()); - } else { - LocalCoords localCoords(LocalCoords::kUsePosition_Type, - this->hasLocalMatrix() ? &this->localMatrix() : NULL); - return GrDefaultGeoProcFactory::CreateForDeviceSpace(color, coverage, localCoords, - this->viewMatrix()); - } + SkASSERT(gp->getVertexStride() == + sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordAttr)); + return gp; } - struct BatchTracker { - GrColor fColor; - bool fUsesLocalCoords; - bool fColorIgnored; - bool fCoverageIgnored; - }; - - BatchTracker fBatch; - SkSTArray<1, Geometry, true> fGeoData; + static void Tesselate(intptr_t vertices, size_t vertexStride, const Geometry& geo, + const GrPipelineOptimizations& opts) { + tesselate(vertices, vertexStride, geo.fColor, geo.fViewMatrix, geo.fRect, &geo.fLocalRect, + &geo.fLocalMatrix); + } }; +typedef GrTInstanceBatch<BWFillRectBatchNoLocalMatrixImp> BWFillRectBatchSimple; +typedef GrTInstanceBatch<BWFillRectBatchLocalMatrixImp> BWFillRectBatchLocalMatrix; +typedef GrTInstanceBatch<BWFillRectBatchLocalRectImp> BWFillRectBatchLocalRect; +typedef GrTInstanceBatch<BWFillRectBatchLocalMatrixLocalRectImp> BWFillRectBatchLocalMatrixLocalRect; + namespace GrBWFillRectBatch { GrDrawBatch* Create(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect, const SkRect* localRect, const SkMatrix* localMatrix) { - BWFillRectBatch::Geometry geometry; - geometry.fColor = color; - geometry.fViewMatrix = viewMatrix; - geometry.fRect = rect; - - if (localRect) { - geometry.fHasLocalRect = true; - geometry.fLocalRect = *localRect; - } else { - geometry.fHasLocalRect = false; - } - - if (localMatrix) { - geometry.fHasLocalMatrix = true; - geometry.fLocalMatrix = *localMatrix; + // TODO bubble these up as separate calls + if (localRect && localMatrix) { + BWFillRectBatchLocalMatrixLocalRect* batch = BWFillRectBatchLocalMatrixLocalRect::Create(); + BWFillRectBatchLocalMatrixLocalRect::Geometry& geo = *batch->geometry(); + geo.fColor = color; + geo.fViewMatrix = viewMatrix; + geo.fLocalMatrix = *localMatrix; + geo.fRect = rect; + geo.fLocalRect = *localRect; + batch->init(); + return batch; + } else if (localRect) { + BWFillRectBatchLocalRect* batch = BWFillRectBatchLocalRect::Create(); + BWFillRectBatchLocalRect::Geometry& geo = *batch->geometry(); + geo.fColor = color; + geo.fViewMatrix = viewMatrix; + geo.fRect = rect; + geo.fLocalRect = *localRect; + batch->init(); + return batch; + } else if (localMatrix) { + BWFillRectBatchLocalMatrix* batch = BWFillRectBatchLocalMatrix::Create(); + BWFillRectBatchLocalMatrix::Geometry& geo = *batch->geometry(); + geo.fColor = color; + geo.fViewMatrix = viewMatrix; + geo.fLocalMatrix = *localMatrix; + geo.fRect = rect; + batch->init(); + return batch; } else { - geometry.fHasLocalMatrix = false; + BWFillRectBatchSimple* batch = BWFillRectBatchSimple::Create(); + BWFillRectBatchSimple::Geometry& geo = *batch->geometry(); + geo.fColor = color; + geo.fViewMatrix = viewMatrix; + geo.fRect = rect; + batch->init(); + return batch; } - - return BWFillRectBatch::Create(geometry); } }; @@ -244,25 +290,16 @@ GrDrawBatch* Create(GrColor color, #include "GrBatchTest.h" DRAW_BATCH_TEST_DEFINE(RectBatch) { - BWFillRectBatch::Geometry geometry; - geometry.fColor = GrRandomColor(random); - - geometry.fRect = GrTest::TestRect(random); - geometry.fHasLocalRect = random->nextBool(); - - if (geometry.fHasLocalRect) { - geometry.fViewMatrix = GrTest::TestMatrixInvertible(random); - geometry.fLocalRect = GrTest::TestRect(random); - } else { - geometry.fViewMatrix = GrTest::TestMatrix(random); - } - - geometry.fHasLocalMatrix = random->nextBool(); - if (geometry.fHasLocalMatrix) { - geometry.fLocalMatrix = GrTest::TestMatrix(random); - } - - return BWFillRectBatch::Create(geometry); + GrColor color = GrRandomColor(random); + SkRect rect = GrTest::TestRect(random); + SkRect localRect = GrTest::TestRect(random); + SkMatrix viewMatrix = GrTest::TestMatrixInvertible(random); + SkMatrix localMatrix = GrTest::TestMatrix(random); + + bool hasLocalRect = random->nextBool(); + bool hasLocalMatrix = random->nextBool(); + return GrBWFillRectBatch::Create(color, viewMatrix, rect, hasLocalRect ? &localRect : nullptr, + hasLocalMatrix ? &localMatrix : nullptr); } #endif diff --git a/src/gpu/batches/GrTInstanceBatch.h b/src/gpu/batches/GrTInstanceBatch.h index 420f873d26..84d857e99e 100644 --- a/src/gpu/batches/GrTInstanceBatch.h +++ b/src/gpu/batches/GrTInstanceBatch.h @@ -22,6 +22,8 @@ * * const char* Name() * + * void SetBounds(const Geometry& seedGeometry, SkRect* outBounds) + * * bool CanCombine(const Geometry& mine, const Geometry& theirs, * const GrPipelineOptimizations&) * @@ -66,7 +68,7 @@ public: Geometry* geometry() { return &fGeoData[0]; } void init() { const Geometry& geo = fGeoData[0]; - this->setBounds(geo.fDevRect); + Impl::SetBounds(geo, &fBounds); } private: |