Index: src/gpu/batches/GrAAFillRectBatch.cpp |
diff --git a/src/gpu/batches/GrAAFillRectBatch.cpp b/src/gpu/batches/GrAAFillRectBatch.cpp |
index f8d4f8d03994d2b463cc0f5a99dbae1940a97eaf..ffbab9654e52d61f127a0f8ffa0020fc2ba9ef58 100644 |
--- a/src/gpu/batches/GrAAFillRectBatch.cpp |
+++ b/src/gpu/batches/GrAAFillRectBatch.cpp |
@@ -190,26 +190,24 @@ static void generate_aa_fill_rect_geometry(intptr_t verts, |
class AAFillRectNoLocalMatrixBatch : public GrVertexBatch { |
public: |
DEFINE_BATCH_CLASS_ID |
- |
- struct Geometry { |
- SkMatrix fViewMatrix; |
- SkRect fRect; |
- SkRect fDevRect; |
- GrColor fColor; |
- }; |
- |
- static AAFillRectNoLocalMatrixBatch* Create() { return new AAFillRectNoLocalMatrixBatch; } |
+ AAFillRectNoLocalMatrixBatch(GrColor color, |
+ const SkMatrix& viewMatrix, |
+ const SkRect& rect, |
+ const SkRect& devRect) : INHERITED(ClassID()) { |
+ fRects.emplace_back(RectInfo{color, viewMatrix, rect, devRect}); |
+ fBounds = devRect; |
+ } |
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) { |
- 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; |
@@ -218,27 +216,22 @@ public: |
void computePipelineOptimizations(GrInitInvariantOutput* color, |
GrInitInvariantOutput* coverage, |
GrBatchToXPOverrides* overrides) const override { |
- // When this is called on a batch, there is only one geometry bundle |
- color->setKnownFourComponents(fGeoData[0].fColor); |
+ // When this is called on a batch, there is only one rect |
+ color->setKnownFourComponents(fRects[0].fColor); |
coverage->setUnknownSingleComponent(); |
} |
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() { fBounds = fGeoData[0].fDevRect; } |
- |
private: |
AAFillRectNoLocalMatrixBatch() : INHERITED(ClassID()) {} |
void onPrepareDraws(Target* target) const override { |
sk_sp<GrGeometryProcessor> gp = |
- create_fill_rect_gp(fGeoData[0].fViewMatrix, fOverrides, |
+ create_fill_rect_gp(fRects[0].fViewMatrix, fOverrides, |
GrDefaultGeoProcFactory::LocalCoords::kUsePosition_Type); |
if (!gp) { |
SkDebugf("Couldn't create GrGeometryProcessor\n"); |
@@ -250,24 +243,23 @@ private: |
sizeof(GrDefaultGeoProcFactory::PositionColorCoverageAttr)); |
size_t vertexStride = gp->getVertexStride(); |
- int instanceCount = fGeoData.count(); |
SkAutoTUnref<const GrBuffer> indexBuffer(get_index_buffer(target->resourceProvider())); |
InstancedHelper helper; |
void* vertices = helper.init(target, kTriangles_GrPrimitiveType, vertexStride, |
indexBuffer, kVertsPerAAFillRect, |
- kIndicesPerAAFillRect, instanceCount); |
+ kIndicesPerAAFillRect, fRects.count()); |
if (!vertices || !indexBuffer) { |
SkDebugf("Could not allocate vertices\n"); |
return; |
} |
- for (int i = 0; i < instanceCount; i++) { |
+ for (int i = 0; i < fRects.count(); i++) { |
intptr_t verts = reinterpret_cast<intptr_t>(vertices) + |
i * kVertsPerAAFillRect * vertexStride; |
generate_aa_fill_rect_geometry(verts, vertexStride, |
- fGeoData[i].fColor, fGeoData[i].fViewMatrix, |
- fGeoData[i].fRect, fGeoData[i].fDevRect, fOverrides, |
+ fRects[i].fColor, fRects[i].fViewMatrix, |
+ fRects[i].fRect, fRects[i].fDevRect, fOverrides, |
nullptr); |
} |
helper.recordDraw(target, gp.get()); |
@@ -284,7 +276,7 @@ private: |
// 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)) { |
+ !fRects[0].fViewMatrix.cheapEqualTo(that->fRects[0].fViewMatrix)) { |
return false; |
} |
@@ -294,13 +286,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; |
+ SkRect fDevRect; |
+ }; |
+ |
GrXPOverridesForBatch fOverrides; |
- SkSTArray<1, Geometry, true> fGeoData; |
+ SkSTArray<1, RectInfo, true> fRects; |
typedef GrVertexBatch INHERITED; |
}; |
@@ -309,26 +308,25 @@ class AAFillRectLocalMatrixBatch : public GrVertexBatch { |
public: |
DEFINE_BATCH_CLASS_ID |
- struct Geometry { |
- SkMatrix fViewMatrix; |
- SkMatrix fLocalMatrix; |
- SkRect fRect; |
- SkRect fDevRect; |
- GrColor fColor; |
- }; |
- |
- static AAFillRectLocalMatrixBatch* Create() { return new AAFillRectLocalMatrixBatch; } |
+ AAFillRectLocalMatrixBatch(GrColor color, |
+ const SkMatrix& viewMatrix, |
+ const SkMatrix& localMatrix, |
+ const SkRect& rect, |
+ const SkRect& devRect) : INHERITED(ClassID()) { |
+ fRects.emplace_back(RectInfo{color, viewMatrix, localMatrix, rect, devRect}); |
+ fBounds = devRect; |
+ } |
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) { |
- 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; |
@@ -337,27 +335,22 @@ public: |
void computePipelineOptimizations(GrInitInvariantOutput* color, |
GrInitInvariantOutput* coverage, |
GrBatchToXPOverrides* overrides) const override { |
- // When this is called on a batch, there is only one geometry bundle |
- color->setKnownFourComponents(fGeoData[0].fColor); |
+ // When this is called on a batch, there is only one rect |
+ color->setKnownFourComponents(fRects[0].fColor); |
coverage->setUnknownSingleComponent(); |
} |
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() { fBounds = fGeoData[0].fDevRect; } |
- |
private: |
AAFillRectLocalMatrixBatch() : INHERITED(ClassID()) {} |
void onPrepareDraws(Target* target) const override { |
sk_sp<GrGeometryProcessor> gp = |
- create_fill_rect_gp(fGeoData[0].fViewMatrix, fOverrides, |
+ create_fill_rect_gp(fRects[0].fViewMatrix, fOverrides, |
GrDefaultGeoProcFactory::LocalCoords::kHasExplicit_Type); |
if (!gp) { |
SkDebugf("Couldn't create GrGeometryProcessor\n"); |
@@ -370,25 +363,24 @@ private: |
sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordCoverage)); |
size_t vertexStride = gp->getVertexStride(); |
- int instanceCount = fGeoData.count(); |
SkAutoTUnref<const GrBuffer> indexBuffer(get_index_buffer(target->resourceProvider())); |
InstancedHelper helper; |
void* vertices = helper.init(target, kTriangles_GrPrimitiveType, vertexStride, |
indexBuffer, kVertsPerAAFillRect, |
- kIndicesPerAAFillRect, instanceCount); |
+ kIndicesPerAAFillRect, fRects.count()); |
if (!vertices || !indexBuffer) { |
SkDebugf("Could not allocate vertices\n"); |
return; |
} |
- for (int i = 0; i < instanceCount; i++) { |
+ for (int i = 0; i < fRects.count(); i++) { |
intptr_t verts = reinterpret_cast<intptr_t>(vertices) + |
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); |
+ generate_aa_fill_rect_geometry(verts, vertexStride, fRects[i].fColor, |
+ fRects[i].fViewMatrix, fRects[i].fRect, |
+ fRects[i].fDevRect, fOverrides, |
+ &fRects[i].fLocalMatrix); |
} |
helper.recordDraw(target, gp.get()); |
} |
@@ -406,13 +398,21 @@ 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; |
+ SkMatrix fLocalMatrix; |
+ SkRect fRect; |
+ SkRect fDevRect; |
+ }; |
+ |
GrXPOverridesForBatch fOverrides; |
- SkSTArray<1, Geometry, true> fGeoData; |
+ SkSTArray<1, RectInfo, true> fRects; |
typedef GrVertexBatch INHERITED; |
}; |
@@ -423,14 +423,7 @@ GrDrawBatch* Create(GrColor color, |
const SkMatrix& viewMatrix, |
const SkRect& rect, |
const SkRect& devRect) { |
- AAFillRectNoLocalMatrixBatch* batch = AAFillRectNoLocalMatrixBatch::Create(); |
- AAFillRectNoLocalMatrixBatch::Geometry& geo = batch->geoData()->push_back(); |
- geo.fColor = color; |
- geo.fViewMatrix = viewMatrix; |
- geo.fRect = rect; |
- geo.fDevRect = devRect; |
- batch->init(); |
- return batch; |
+ return new AAFillRectNoLocalMatrixBatch(color, viewMatrix, rect, devRect); |
} |
GrDrawBatch* Create(GrColor color, |
@@ -438,15 +431,7 @@ GrDrawBatch* Create(GrColor color, |
const SkMatrix& localMatrix, |
const SkRect& rect, |
const SkRect& devRect) { |
- AAFillRectLocalMatrixBatch* batch = AAFillRectLocalMatrixBatch::Create(); |
- AAFillRectLocalMatrixBatch::Geometry& geo = batch->geoData()->push_back(); |
- geo.fColor = color; |
- geo.fViewMatrix = viewMatrix; |
- geo.fLocalMatrix = localMatrix; |
- geo.fRect = rect; |
- geo.fDevRect = devRect; |
- batch->init(); |
- return batch; |
+ return new AAFillRectLocalMatrixBatch(color, viewMatrix, localMatrix, rect, devRect); |
} |
GrDrawBatch* Create(GrColor color, |