| Index: src/gpu/GrRectBatch.cpp
|
| diff --git a/src/gpu/GrRectBatch.cpp b/src/gpu/GrRectBatch.cpp
|
| index b6c5d74ff27af4b823096f3cdf289ffe448095f4..5ef5591489c898d25d0f9eac20f95ec956e8ae5f 100644
|
| --- a/src/gpu/GrRectBatch.cpp
|
| +++ b/src/gpu/GrRectBatch.cpp
|
| @@ -13,39 +13,6 @@
|
| #include "GrDefaultGeoProcFactory.h"
|
| #include "GrPrimitiveProcessor.h"
|
|
|
| -/** 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_rect_gp(bool hasExplicitLocalCoords,
|
| - const SkMatrix* localMatrix,
|
| - bool coverageIgnored) {
|
| - typedef GrDefaultGeoProcFactory::Color Color;
|
| - typedef GrDefaultGeoProcFactory::Coverage Coverage;
|
| - typedef GrDefaultGeoProcFactory::LocalCoords LocalCoords;
|
| - Color color(Color::kAttribute_Type);
|
| - Coverage coverage(coverageIgnored ? Coverage::kNone_Type : Coverage::kSolid_Type);
|
| - LocalCoords::Type localCoords;
|
| - if (hasExplicitLocalCoords) {
|
| - localCoords = LocalCoords::kHasExplicit_Type;
|
| - } else {
|
| - localCoords = LocalCoords::kUsePosition_Type;
|
| - }
|
| -
|
| - if (localMatrix) {
|
| - return GrDefaultGeoProcFactory::Create(color, coverage, localCoords, SkMatrix::I(),
|
| - *localMatrix);
|
| - } else {
|
| - return GrDefaultGeoProcFactory::Create(color, coverage, localCoords);
|
| - }
|
| -}
|
| -
|
| class RectBatch : public GrBatch {
|
| public:
|
| struct Geometry {
|
| @@ -88,32 +55,17 @@ public:
|
| }
|
|
|
| void generateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline) override {
|
| - // Go to device coords to allow batching across matrix changes
|
| - SkMatrix invert = SkMatrix::I();
|
| -
|
| - // if we have a local rect, then we apply the localMatrix directly to the localRect to
|
| - // generate vertex local coords
|
| - bool hasExplicitLocalCoords = this->hasLocalRect();
|
| - if (!hasExplicitLocalCoords) {
|
| - if (!this->viewMatrix().isIdentity() && !this->viewMatrix().invert(&invert)) {
|
| - SkDebugf("Could not invert\n");
|
| - return;
|
| - }
|
| -
|
| - if (this->hasLocalMatrix()) {
|
| - invert.preConcat(this->localMatrix());
|
| - }
|
| + SkAutoTUnref<const GrGeometryProcessor> gp(this->createRectGP());
|
| + if (!gp) {
|
| + SkDebugf("Could not create GrGeometryProcessor\n");
|
| + return;
|
| }
|
|
|
| - SkAutoTUnref<const GrGeometryProcessor> gp(create_rect_gp(hasExplicitLocalCoords,
|
| - &invert,
|
| - this->coverageIgnored()));
|
| -
|
| batchTarget->initDraw(gp, pipeline);
|
|
|
| int instanceCount = fGeoData.count();
|
| size_t vertexStride = gp->getVertexStride();
|
| - SkASSERT(hasExplicitLocalCoords ?
|
| + SkASSERT(this->hasLocalRect() ?
|
| vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorLocalCoordAttr) :
|
| vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAttr));
|
| QuadHelper helper;
|
| @@ -211,6 +163,38 @@ private:
|
| return true;
|
| }
|
|
|
| + /** 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() {
|
| + typedef GrDefaultGeoProcFactory::Color Color;
|
| + typedef GrDefaultGeoProcFactory::Coverage Coverage;
|
| + typedef GrDefaultGeoProcFactory::LocalCoords LocalCoords;
|
| + 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);
|
| + } else {
|
| + LocalCoords localCoords(LocalCoords::kUsePosition_Type,
|
| + this->hasLocalMatrix() ? &this->localMatrix() : NULL);
|
| + return GrDefaultGeoProcFactory::CreateForDeviceSpace(color, coverage, localCoords,
|
| + this->viewMatrix());
|
| + }
|
| + }
|
| +
|
| +
|
| struct BatchTracker {
|
| GrColor fColor;
|
| bool fUsesLocalCoords;
|
|
|