Chromium Code Reviews| Index: src/gpu/batches/GrRegionBatch.cpp |
| diff --git a/src/gpu/batches/GrNonAAFillRectBatch.cpp b/src/gpu/batches/GrRegionBatch.cpp |
| similarity index 65% |
| copy from src/gpu/batches/GrNonAAFillRectBatch.cpp |
| copy to src/gpu/batches/GrRegionBatch.cpp |
| index 1422951d240d59fab798d40014e612ad57c86be6..595194d746ec2482481cf64f4b7805a3e7a9b155 100644 |
| --- a/src/gpu/batches/GrNonAAFillRectBatch.cpp |
| +++ b/src/gpu/batches/GrRegionBatch.cpp |
| @@ -5,7 +5,7 @@ |
| * found in the LICENSE file. |
| */ |
| -#include "GrNonAAFillRectBatch.h" |
| +#include "GrRegionBatch.h" |
| #include "GrBatchFlushState.h" |
| #include "GrColor.h" |
| @@ -16,6 +16,7 @@ |
| #include "GrVertexBatch.h" |
| #include "SkMatrixPriv.h" |
| +#include "SkRegion.h" |
| static const int kVertsPerInstance = 4; |
| static const int kIndicesPerInstance = 6; |
| @@ -27,7 +28,7 @@ static const int kIndicesPerInstance = 6; |
| rect draws. |
| The vertex attrib order is always pos, color, [local coords]. |
| - */ |
| +*/ |
| static sk_sp<GrGeometryProcessor> make_gp(bool readsCoverage) { |
| using namespace GrDefaultGeoProcFactory; |
| Color color(Color::kAttribute_Type); |
| @@ -41,8 +42,7 @@ static void tesselate(intptr_t vertices, |
| size_t vertexStride, |
| GrColor color, |
| const SkMatrix* viewMatrix, |
| - const SkRect& rect, |
| - const GrQuad* localQuad) { |
| + const SkRect& rect) { |
| SkPoint* positions = reinterpret_cast<SkPoint*>(vertices); |
| positions->setRectFan(rect.fLeft, rect.fTop, |
| @@ -52,17 +52,6 @@ static void tesselate(intptr_t vertices, |
| SkMatrixPriv::MapPointsWithStride(*viewMatrix, positions, vertexStride, kVertsPerInstance); |
| } |
| - // Setup local coords |
| - // TODO we should only do this if local coords are being read |
| - if (localQuad) { |
| - static const int kLocalOffset = sizeof(SkPoint) + sizeof(GrColor); |
| - for (int i = 0; i < kVertsPerInstance; i++) { |
| - SkPoint* coords = reinterpret_cast<SkPoint*>(vertices + kLocalOffset + |
| - i * vertexStride); |
| - *coords = localQuad->point(i); |
| - } |
| - } |
| - |
| static const int kColorOffset = sizeof(SkPoint); |
| GrColor* vertColor = reinterpret_cast<GrColor*>(vertices + kColorOffset); |
| for (int j = 0; j < 4; ++j) { |
| @@ -71,32 +60,28 @@ static void tesselate(intptr_t vertices, |
| } |
| } |
| -class NonAAFillRectBatch : public GrVertexBatch { |
| +class RegionBatch : public GrVertexBatch { |
|
msarett
2016/08/25 16:36:17
Could/should this extend NonAAFillRectBatch?
bsalomon
2016/08/25 17:49:02
I don't think it should inherit from it. It's poss
msarett
2016/08/25 20:51:42
Alright cool, thanks.
|
| public: |
| DEFINE_BATCH_CLASS_ID |
| - NonAAFillRectBatch(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect, |
| - const SkRect* localRect, const SkMatrix* localMatrix) |
|
msarett
2016/08/25 16:36:17
Do I need to worry about localRect and localMatrix
bsalomon
2016/08/25 17:49:02
no
msarett
2016/08/25 20:51:42
Acknowledged.
|
| + RegionBatch(GrColor color, const SkMatrix& viewMatrix, const SkRegion& region) |
| : 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); |
| + SkRegion::Iterator iter(region); |
| + |
| + while (!iter.done()) { |
|
msarett
2016/08/25 16:36:17
Any way to use push_back_n() here?
bsalomon
2016/08/25 17:49:02
I think we should keep it in region form until gen
msarett
2016/08/25 20:51:42
Done.
|
| + RectInfo& info = fRects.push_back(); |
| + info.fColor = color; |
| + info.fViewMatrix = viewMatrix; |
| + SkRect rect = SkRect::Make(iter.rect()); |
| + info.fRect = rect; |
| + iter.next(); |
| } |
| - this->setTransformedBounds(fRects[0].fRect, viewMatrix, HasAABloat::kNo, IsZeroArea::kNo); |
| + |
| + SkRect bounds = SkRect::Make(region.getBounds()); |
| + this->setTransformedBounds(bounds, viewMatrix, HasAABloat::kNo, IsZeroArea::kNo); |
| } |
| - const char* name() const override { return "NonAAFillRectBatch"; } |
| + const char* name() const override { return "GrRegionBatch"; } |
| SkString dumpInfo() const override { |
| SkString str; |
| @@ -125,7 +110,6 @@ public: |
| } |
| private: |
| - NonAAFillRectBatch() : INHERITED(ClassID()) {} |
| void onPrepareDraws(Target* target) const override { |
| sk_sp<GrGeometryProcessor> gp = make_gp(fOverrides.readsCoverage()); |
| @@ -153,20 +137,18 @@ private: |
| intptr_t verts = reinterpret_cast<intptr_t>(vertices) + |
| i * kVertsPerInstance * vertexStride; |
| tesselate(verts, vertexStride, fRects[i].fColor, &fRects[i].fViewMatrix, |
| - fRects[i].fRect, &fRects[i].fLocalQuad); |
| + fRects[i].fRect); |
| } |
| helper.recordDraw(target, gp.get()); |
| } |
| bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { |
| - NonAAFillRectBatch* that = t->cast<NonAAFillRectBatch>(); |
| + RegionBatch* that = t->cast<RegionBatch>(); |
| if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pipeline(), |
| that->bounds(), caps)) { |
| 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()) { |
| fOverrides = that->fOverrides; |
| } |
| @@ -180,7 +162,6 @@ private: |
| GrColor fColor; |
| SkMatrix fViewMatrix; |
| SkRect fRect; |
| - GrQuad fLocalQuad; |
| }; |
| GrXPOverridesForBatch fOverrides; |
| @@ -189,36 +170,12 @@ private: |
| typedef GrVertexBatch INHERITED; |
| }; |
| -namespace GrNonAAFillRectBatch { |
| +namespace GrRegionBatch { |
| GrDrawBatch* Create(GrColor color, |
| const SkMatrix& viewMatrix, |
| - const SkRect& rect, |
| - const SkRect* localRect, |
| - const SkMatrix* localMatrix) { |
| - return new NonAAFillRectBatch(color, viewMatrix, rect, localRect, localMatrix); |
| + const SkRegion& region) { |
| + return new RegionBatch(color, viewMatrix, region); |
| } |
| }; |
| - |
| -/////////////////////////////////////////////////////////////////////////////////////////////////// |
| - |
| -#ifdef GR_TEST_UTILS |
| - |
| -#include "GrBatchTest.h" |
| - |
| -DRAW_BATCH_TEST_DEFINE(RectBatch) { |
| - 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 GrNonAAFillRectBatch::Create(color, viewMatrix, rect, |
| - hasLocalRect ? &localRect : nullptr, |
| - hasLocalMatrix ? &localMatrix : nullptr); |
| -} |
| - |
| -#endif |