Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(97)

Unified Diff: src/gpu/batches/GrNonAAFillRectBatch.cpp

Issue 2108403005: Move GrNonAAFillRectPerspectiveBatch to its own file (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fix overlength line Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/GrTestUtils.cpp ('k') | src/gpu/batches/GrNonAAFillRectPerspectiveBatch.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/batches/GrNonAAFillRectBatch.cpp
diff --git a/src/gpu/batches/GrNonAAFillRectBatch.cpp b/src/gpu/batches/GrNonAAFillRectBatch.cpp
index 4a7daf2b793a76f3ef09638e82a98c04b36dc489..aaeabdaeb7f9f10513147df44695f5ba923931e0 100644
--- a/src/gpu/batches/GrNonAAFillRectBatch.cpp
+++ b/src/gpu/batches/GrNonAAFillRectBatch.cpp
@@ -26,35 +26,6 @@ static const int kIndicesPerInstance = 6;
The vertex attrib order is always pos, color, [local coords].
*/
-static sk_sp<GrGeometryProcessor> make_persp_gp(const SkMatrix& viewMatrix,
- bool readsCoverage,
- bool hasExplicitLocalCoords,
- const SkMatrix* localMatrix) {
- SkASSERT(viewMatrix.hasPerspective() || (localMatrix && localMatrix->hasPerspective()));
-
- using namespace GrDefaultGeoProcFactory;
- Color color(Color::kAttribute_Type);
- Coverage coverage(readsCoverage ? Coverage::kSolid_Type : Coverage::kNone_Type);
-
- // If we have perspective on the viewMatrix then we won't map on the CPU, nor will we map
- // the local rect on the cpu (in case the localMatrix also has perspective).
- // Otherwise, if we have a local rect, then we apply the localMatrix directly to the localRect
- // to generate vertex local coords
- if (viewMatrix.hasPerspective()) {
- LocalCoords localCoords(hasExplicitLocalCoords ? LocalCoords::kHasExplicit_Type :
- LocalCoords::kUsePosition_Type,
- localMatrix);
- return GrDefaultGeoProcFactory::Make(color, coverage, localCoords, viewMatrix);
- } else if (hasExplicitLocalCoords) {
- LocalCoords localCoords(LocalCoords::kHasExplicit_Type, localMatrix);
- return GrDefaultGeoProcFactory::Make(color, coverage, localCoords, SkMatrix::I());
- } else {
- LocalCoords localCoords(LocalCoords::kUsePosition_Type, localMatrix);
- return GrDefaultGeoProcFactory::MakeForDeviceSpace(color, coverage, localCoords,
- viewMatrix);
- }
-}
-
static sk_sp<GrGeometryProcessor> make_gp(bool readsCoverage) {
using namespace GrDefaultGeoProcFactory;
Color color(Color::kAttribute_Type);
@@ -216,148 +187,6 @@ private:
typedef GrVertexBatch INHERITED;
};
-// We handle perspective in the local matrix or viewmatrix with special batches
-class NonAAFillRectPerspectiveBatch : public GrVertexBatch {
-public:
- DEFINE_BATCH_CLASS_ID
-
- 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", 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);
- }
- str.append(INHERITED::dumpInfo());
- return str;
- }
-
- 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(fRects[0].fColor);
- coverage->setKnownSingleComponent(0xff);
- }
-
- void initBatchTracker(const GrXPOverridesForBatch& overrides) override {
- overrides.getOverrideColorIfSet(&fRects[0].fColor);
- fOverrides = overrides;
- }
-
-private:
- NonAAFillRectPerspectiveBatch() : INHERITED(ClassID()) {}
-
- void onPrepareDraws(Target* target) const override {
- sk_sp<GrGeometryProcessor> gp = make_persp_gp(fViewMatrix,
- fOverrides.readsCoverage(),
- fHasLocalRect,
- fHasLocalMatrix ? &fLocalMatrix : nullptr);
- if (!gp) {
- SkDebugf("Couldn't create GrGeometryProcessor\n");
- return;
- }
- SkASSERT(fHasLocalRect
- ? gp->getVertexStride() ==
- sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordAttr)
- : gp->getVertexStride() == sizeof(GrDefaultGeoProcFactory::PositionColorAttr));
-
- size_t vertexStride = gp->getVertexStride();
- int instanceCount = fRects.count();
-
- SkAutoTUnref<const GrBuffer> indexBuffer(target->resourceProvider()->refQuadIndexBuffer());
- InstancedHelper helper;
- void* vertices = helper.init(target, kTriangles_GrPrimitiveType, vertexStride,
- indexBuffer, kVertsPerInstance,
- kIndicesPerInstance, instanceCount);
- if (!vertices || !indexBuffer) {
- SkDebugf("Could not allocate vertices\n");
- return;
- }
-
- for (int i = 0; i < instanceCount; i++) {
- const RectInfo& info = fRects[i];
- intptr_t verts = reinterpret_cast<intptr_t>(vertices) +
- i * kVertsPerInstance * vertexStride;
- if (fHasLocalRect) {
- GrQuad quad(info.fLocalRect);
- tesselate(verts, vertexStride, info.fColor, nullptr, info.fRect, &quad);
- } else {
- tesselate(verts, vertexStride, info.fColor, nullptr, info.fRect, nullptr);
- }
- }
- helper.recordDraw(target, gp.get());
- }
-
- bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override {
- NonAAFillRectPerspectiveBatch* that = t->cast<NonAAFillRectPerspectiveBatch>();
- if (!GrPipeline::CanCombine(*this->pipeline(), this->bounds(), *that->pipeline(),
- that->bounds(), caps)) {
- return false;
- }
-
- // We could batch across perspective vm changes if we really wanted to
- if (!fViewMatrix.cheapEqualTo(that->fViewMatrix)) {
- return false;
- }
- if (fHasLocalRect != that->fHasLocalRect) {
- return false;
- }
- if (fHasLocalMatrix && !fLocalMatrix.cheapEqualTo(that->fLocalMatrix)) {
- 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;
- }
-
- 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, RectInfo, true> fRects;
- bool fHasLocalMatrix;
- bool fHasLocalRect;
- SkMatrix fLocalMatrix;
- SkMatrix fViewMatrix;
-
- typedef GrVertexBatch INHERITED;
-};
-
namespace GrNonAAFillRectBatch {
GrDrawBatch* Create(GrColor color,
@@ -368,14 +197,6 @@ GrDrawBatch* Create(GrColor color,
return new NonAAFillRectBatch(color, viewMatrix, rect, localRect, localMatrix);
}
-GrDrawBatch* CreateWithPerspective(GrColor color,
- const SkMatrix& viewMatrix,
- const SkRect& rect,
- const SkRect* localRect,
- const SkMatrix* localMatrix) {
- return new NonAAFillRectPerspectiveBatch(color, viewMatrix, rect, localRect, localMatrix);
-}
-
};
///////////////////////////////////////////////////////////////////////////////////////////////////
« no previous file with comments | « src/gpu/GrTestUtils.cpp ('k') | src/gpu/batches/GrNonAAFillRectPerspectiveBatch.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698