Cleanup non-AA fill rect batch construction.
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2119853002 Review-Url: https://codereview.chromium.org/2119853002
This commit is contained in:
parent
0fdec8a047
commit
9d7f1849a8
@ -91,25 +91,37 @@ class NonAAFillRectBatch : public GrVertexBatch {
|
||||
public:
|
||||
DEFINE_BATCH_CLASS_ID
|
||||
|
||||
struct Geometry {
|
||||
SkMatrix fViewMatrix;
|
||||
SkRect fRect;
|
||||
GrQuad fLocalQuad;
|
||||
GrColor fColor;
|
||||
};
|
||||
|
||||
static NonAAFillRectBatch* Create() { return new NonAAFillRectBatch; }
|
||||
NonAAFillRectBatch(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect,
|
||||
const SkRect* localRect, const SkMatrix* localMatrix)
|
||||
: 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);
|
||||
}
|
||||
viewMatrix.mapRect(&fBounds, fRects[0].fRect);
|
||||
}
|
||||
|
||||
const char* name() const override { return "NonAAFillRectBatch"; }
|
||||
|
||||
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;
|
||||
@ -119,25 +131,20 @@ public:
|
||||
GrInitInvariantOutput* coverage,
|
||||
GrBatchToXPOverrides* overrides) const override {
|
||||
// When this is called on a batch, there is only one geometry bundle
|
||||
color->setKnownFourComponents(fGeoData[0].fColor);
|
||||
color->setKnownFourComponents(fRects[0].fColor);
|
||||
coverage->setKnownSingleComponent(0xff);
|
||||
}
|
||||
|
||||
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() { fGeoData[0].fViewMatrix.mapRect(&fBounds, fGeoData[0].fRect); }
|
||||
|
||||
private:
|
||||
NonAAFillRectBatch() : INHERITED(ClassID()) {}
|
||||
|
||||
void onPrepareDraws(Target* target) const override {
|
||||
sk_sp<GrGeometryProcessor> gp = make_gp(fGeoData[0].fViewMatrix, fOverrides.readsCoverage(),
|
||||
sk_sp<GrGeometryProcessor> gp = make_gp(fRects[0].fViewMatrix, fOverrides.readsCoverage(),
|
||||
true, nullptr);
|
||||
if (!gp) {
|
||||
SkDebugf("Couldn't create GrGeometryProcessor\n");
|
||||
@ -147,7 +154,7 @@ private:
|
||||
sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordAttr));
|
||||
|
||||
size_t vertexStride = gp->getVertexStride();
|
||||
int instanceCount = fGeoData.count();
|
||||
int instanceCount = fRects.count();
|
||||
|
||||
SkAutoTUnref<const GrBuffer> indexBuffer(target->resourceProvider()->refQuadIndexBuffer());
|
||||
InstancedHelper helper;
|
||||
@ -162,8 +169,8 @@ private:
|
||||
for (int i = 0; i < instanceCount; i++) {
|
||||
intptr_t verts = reinterpret_cast<intptr_t>(vertices) +
|
||||
i * kVertsPerInstance * vertexStride;
|
||||
tesselate(verts, vertexStride, fGeoData[i].fColor, fGeoData[i].fViewMatrix,
|
||||
fGeoData[i].fRect, &fGeoData[i].fLocalQuad);
|
||||
tesselate(verts, vertexStride, fRects[i].fColor, fRects[i].fViewMatrix,
|
||||
fRects[i].fRect, &fRects[i].fLocalQuad);
|
||||
}
|
||||
helper.recordDraw(target, gp.get());
|
||||
}
|
||||
@ -181,13 +188,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;
|
||||
GrQuad fLocalQuad;
|
||||
};
|
||||
|
||||
GrXPOverridesForBatch fOverrides;
|
||||
SkSTArray<1, Geometry, true> fGeoData;
|
||||
SkSTArray<1, RectInfo, true> fRects;
|
||||
|
||||
typedef GrVertexBatch INHERITED;
|
||||
};
|
||||
@ -197,25 +211,33 @@ class NonAAFillRectPerspectiveBatch : public GrVertexBatch {
|
||||
public:
|
||||
DEFINE_BATCH_CLASS_ID
|
||||
|
||||
struct Geometry {
|
||||
SkMatrix fViewMatrix;
|
||||
SkMatrix fLocalMatrix;
|
||||
SkRect fRect;
|
||||
SkRect fLocalRect;
|
||||
GrColor fColor;
|
||||
bool fHasLocalMatrix;
|
||||
bool fHasLocalRect;
|
||||
};
|
||||
|
||||
static NonAAFillRectPerspectiveBatch* Create() { return new NonAAFillRectPerspectiveBatch; }
|
||||
NonAAFillRectPerspectiveBatch(GrColor color, const SkMatrix& viewMatrix, const SkRect& rect,
|
||||
const SkRect* localRect, const SkMatrix* localMatrix)
|
||||
: INHERITED(ClassID())
|
||||
, fViewMatrix(viewMatrix) {
|
||||
SkASSERT(viewMatrix.hasPerspective() || (localMatrix &&
|
||||
localMatrix->hasPerspective()));
|
||||
RectInfo& info = fRects.push_back();
|
||||
info.fColor = color;
|
||||
info.fRect = rect;
|
||||
fHasLocalRect = SkToBool(localRect);
|
||||
fHasLocalMatrix = SkToBool(localMatrix);
|
||||
if (fHasLocalMatrix) {
|
||||
fLocalMatrix = *localMatrix;
|
||||
}
|
||||
if (fHasLocalRect) {
|
||||
info.fLocalRect = *localRect;
|
||||
}
|
||||
viewMatrix.mapRect(&fBounds, rect);
|
||||
}
|
||||
|
||||
const char* name() const override { return "NonAAFillRectPerspectiveBatch"; }
|
||||
|
||||
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[0];
|
||||
str.appendf("# batched: %d\n", fRects.count());
|
||||
for (int i = 0; i < fRects.count(); ++i) {
|
||||
const RectInfo& geo = fRects[0];
|
||||
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);
|
||||
@ -228,40 +250,33 @@ public:
|
||||
GrInitInvariantOutput* coverage,
|
||||
GrBatchToXPOverrides* overrides) const override {
|
||||
// When this is called on a batch, there is only one geometry bundle
|
||||
color->setKnownFourComponents(fGeoData[0].fColor);
|
||||
color->setKnownFourComponents(fRects[0].fColor);
|
||||
coverage->setKnownSingleComponent(0xff);
|
||||
}
|
||||
|
||||
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() { fGeoData[0].fViewMatrix.mapRect(&fBounds, fGeoData[0].fRect); }
|
||||
|
||||
private:
|
||||
NonAAFillRectPerspectiveBatch() : INHERITED(ClassID()) {}
|
||||
|
||||
void onPrepareDraws(Target* target) const override {
|
||||
sk_sp<GrGeometryProcessor> gp = make_gp(fGeoData[0].fViewMatrix, fOverrides.readsCoverage(),
|
||||
fGeoData[0].fHasLocalRect,
|
||||
fGeoData[0].fHasLocalMatrix
|
||||
? &fGeoData[0].fLocalMatrix
|
||||
: nullptr);
|
||||
sk_sp<GrGeometryProcessor> gp = make_gp(fViewMatrix, fOverrides.readsCoverage(),
|
||||
fHasLocalRect,
|
||||
fHasLocalMatrix ? &fLocalMatrix : nullptr);
|
||||
if (!gp) {
|
||||
SkDebugf("Couldn't create GrGeometryProcessor\n");
|
||||
return;
|
||||
}
|
||||
SkASSERT(fGeoData[0].fHasLocalRect
|
||||
SkASSERT(fHasLocalRect
|
||||
? gp->getVertexStride() ==
|
||||
sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordAttr)
|
||||
: gp->getVertexStride() == sizeof(GrDefaultGeoProcFactory::PositionColorAttr));
|
||||
|
||||
size_t vertexStride = gp->getVertexStride();
|
||||
int instanceCount = fGeoData.count();
|
||||
int instanceCount = fRects.count();
|
||||
|
||||
SkAutoTUnref<const GrBuffer> indexBuffer(target->resourceProvider()->refQuadIndexBuffer());
|
||||
InstancedHelper helper;
|
||||
@ -274,21 +289,19 @@ private:
|
||||
}
|
||||
|
||||
for (int i = 0; i < instanceCount; i++) {
|
||||
const Geometry& geo = fGeoData[i];
|
||||
const RectInfo& info = fRects[i];
|
||||
intptr_t verts = reinterpret_cast<intptr_t>(vertices) +
|
||||
i * kVertsPerInstance * vertexStride;
|
||||
if (geo.fHasLocalRect) {
|
||||
GrQuad quad(geo.fLocalRect);
|
||||
tesselate(verts, vertexStride, geo.fColor, geo.fViewMatrix, geo.fRect, &quad);
|
||||
if (fHasLocalRect) {
|
||||
GrQuad quad(info.fLocalRect);
|
||||
tesselate(verts, vertexStride, info.fColor, fViewMatrix, info.fRect, &quad);
|
||||
} else {
|
||||
tesselate(verts, vertexStride, geo.fColor, geo.fViewMatrix, geo.fRect, nullptr);
|
||||
tesselate(verts, vertexStride, info.fColor, fViewMatrix, info.fRect, nullptr);
|
||||
}
|
||||
}
|
||||
helper.recordDraw(target, gp.get());
|
||||
}
|
||||
|
||||
const Geometry& seedGeometry() const { return fGeoData[0]; }
|
||||
|
||||
bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override {
|
||||
NonAAFillRectPerspectiveBatch* that = t->cast<NonAAFillRectPerspectiveBatch>();
|
||||
if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pipeline(),
|
||||
@ -297,14 +310,13 @@ private:
|
||||
}
|
||||
|
||||
// We could batch across perspective vm changes if we really wanted to
|
||||
if (!fGeoData[0].fViewMatrix.cheapEqualTo(that->fGeoData[0].fViewMatrix)) {
|
||||
if (!fViewMatrix.cheapEqualTo(that->fViewMatrix)) {
|
||||
return false;
|
||||
}
|
||||
if (fGeoData[0].fHasLocalRect != that->fGeoData[0].fHasLocalRect) {
|
||||
if (fHasLocalRect != that->fHasLocalRect) {
|
||||
return false;
|
||||
}
|
||||
if (fGeoData[0].fHasLocalMatrix &&
|
||||
!fGeoData[0].fLocalMatrix.cheapEqualTo(that->fGeoData[0].fLocalMatrix)) {
|
||||
if (fHasLocalMatrix && !fLocalMatrix.cheapEqualTo(that->fLocalMatrix)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -314,13 +326,23 @@ 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 {
|
||||
SkRect fRect;
|
||||
GrColor fColor;
|
||||
SkRect fLocalRect;
|
||||
};
|
||||
|
||||
GrXPOverridesForBatch fOverrides;
|
||||
SkSTArray<1, Geometry, true> fGeoData;
|
||||
SkSTArray<1, RectInfo, true> fRects;
|
||||
bool fHasLocalMatrix;
|
||||
bool fHasLocalRect;
|
||||
SkMatrix fLocalMatrix;
|
||||
SkMatrix fViewMatrix;
|
||||
|
||||
typedef GrVertexBatch INHERITED;
|
||||
};
|
||||
@ -332,25 +354,7 @@ GrDrawBatch* Create(GrColor color,
|
||||
const SkRect& rect,
|
||||
const SkRect* localRect,
|
||||
const SkMatrix* localMatrix) {
|
||||
NonAAFillRectBatch* batch = NonAAFillRectBatch::Create();
|
||||
SkASSERT(!viewMatrix.hasPerspective() && (!localMatrix || !localMatrix->hasPerspective()));
|
||||
NonAAFillRectBatch::Geometry& geo = batch->geoData()->push_back();
|
||||
|
||||
geo.fColor = color;
|
||||
geo.fViewMatrix = viewMatrix;
|
||||
geo.fRect = rect;
|
||||
|
||||
if (localRect && localMatrix) {
|
||||
geo.fLocalQuad.setFromMappedRect(*localRect, *localMatrix);
|
||||
} else if (localRect) {
|
||||
geo.fLocalQuad.set(*localRect);
|
||||
} else if (localMatrix) {
|
||||
geo.fLocalQuad.setFromMappedRect(rect, *localMatrix);
|
||||
} else {
|
||||
geo.fLocalQuad.set(rect);
|
||||
}
|
||||
batch->init();
|
||||
return batch;
|
||||
return new NonAAFillRectBatch(color, viewMatrix, rect, localRect, localMatrix);
|
||||
}
|
||||
|
||||
GrDrawBatch* CreateWithPerspective(GrColor color,
|
||||
@ -358,23 +362,7 @@ GrDrawBatch* CreateWithPerspective(GrColor color,
|
||||
const SkRect& rect,
|
||||
const SkRect* localRect,
|
||||
const SkMatrix* localMatrix) {
|
||||
NonAAFillRectPerspectiveBatch* batch = NonAAFillRectPerspectiveBatch::Create();
|
||||
SkASSERT(viewMatrix.hasPerspective() || (localMatrix && localMatrix->hasPerspective()));
|
||||
NonAAFillRectPerspectiveBatch::Geometry& geo = batch->geoData()->push_back();
|
||||
|
||||
geo.fColor = color;
|
||||
geo.fViewMatrix = viewMatrix;
|
||||
geo.fRect = rect;
|
||||
geo.fHasLocalRect = SkToBool(localRect);
|
||||
geo.fHasLocalMatrix = SkToBool(localMatrix);
|
||||
if (localMatrix) {
|
||||
geo.fLocalMatrix = *localMatrix;
|
||||
}
|
||||
if (localRect) {
|
||||
geo.fLocalRect = *localRect;
|
||||
}
|
||||
batch->init();
|
||||
return batch;
|
||||
return new NonAAFillRectPerspectiveBatch(color, viewMatrix, rect, localRect, localMatrix);
|
||||
}
|
||||
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user