From 1170a12839218f7a23c93487bf95fd83aae0201f Mon Sep 17 00:00:00 2001 From: joshualitt Date: Thu, 16 Jul 2015 07:06:50 -0700 Subject: [PATCH] Give GrBatch a pointer to GrPipeline BUG=skia: Review URL: https://codereview.chromium.org/1237283007 --- gm/beziereffects.cpp | 2 ++ gm/convexpolyeffect.cpp | 1 + src/gpu/GrBatch.h | 21 +++++++++++++-------- src/gpu/GrPipeline.h | 5 ++--- src/gpu/GrReorderCommandBuilder.cpp | 4 ++-- 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/gm/beziereffects.cpp b/gm/beziereffects.cpp index 5e00608..6e58619 100644 --- a/gm/beziereffects.cpp +++ b/gm/beziereffects.cpp @@ -46,6 +46,7 @@ private: BezierCubicOrConicTestBatch(const GrGeometryProcessor* gp, const Geometry& geo, const SkScalar klmEqs[9], SkScalar sign) : INHERITED(gp, geo.fBounds) { + this->initClassID(); for (int i = 0; i < 9; i++) { fKlmEqs[i] = klmEqs[i]; } @@ -447,6 +448,7 @@ private: : INHERITED(gp, geo.fBounds) , fGeometry(geo) , fDevToUV(devToUV) { + this->initClassID(); } struct Vertex { diff --git a/gm/convexpolyeffect.cpp b/gm/convexpolyeffect.cpp index 2c77bce..9891f87 100644 --- a/gm/convexpolyeffect.cpp +++ b/gm/convexpolyeffect.cpp @@ -43,6 +43,7 @@ private: ConvexPolyTestBatch(const GrGeometryProcessor* gp, const Geometry& geo) : INHERITED(gp, geo.fBounds) , fGeometry(geo) { + this->initClassID(); } Geometry* geoData(int index) override { diff --git a/src/gpu/GrBatch.h b/src/gpu/GrBatch.h index 21dc3d2..b770112 100644 --- a/src/gpu/GrBatch.h +++ b/src/gpu/GrBatch.h @@ -11,9 +11,9 @@ #include #include "GrBatchTarget.h" #include "GrGeometryProcessor.h" +#include "GrNonAtomicRef.h" #include "GrVertices.h" #include "SkAtomics.h" -#include "SkRefCnt.h" #include "SkTypes.h" class GrGpu; @@ -37,9 +37,8 @@ struct GrInitInvariantOutput; * information will be communicated to the GrBatch prior to geometry generation. */ -class GrBatch : public SkRefCnt { +class GrBatch : public GrNonAtomicRef { public: - GrBatch() : fClassID(kIllegalBatchClassID), fNumberOfDraws(0) { SkDEBUGCODE(fUsed = false;) } virtual ~GrBatch() {} @@ -58,6 +57,10 @@ public: return false; } + if (!this->pipeline()->isEqual(*that->pipeline())) { + return false; + } + return this->onCombineIfPossible(that); } @@ -94,14 +97,14 @@ public: SkDEBUGCODE(bool isUsed() const { return fUsed; }) + void setPipeline(const GrPipeline* pipeline) { fPipeline.reset(SkRef(pipeline)); } + protected: template void initClassID() { static uint32_t kClassID = GenClassID(); fClassID = kClassID; } - uint32_t fClassID; - // NOTE, compute some bounds, even if extremely conservative. Do *NOT* setLargest on the bounds // rect because we outset it for dst copy textures void setBounds(const SkRect& newBounds) { fBounds = newBounds; } @@ -110,6 +113,8 @@ protected: return fBounds.joinPossiblyEmptyRect(otherBounds); } + const GrPipeline* pipeline() const { return fPipeline; } + /** Helper for rendering instances using an instanced index index buffer. This class creates the space for the vertices and flushes the draws to the batch target.*/ class InstancedHelper { @@ -148,6 +153,7 @@ protected: typedef InstancedHelper INHERITED; }; + uint32_t fClassID; SkRect fBounds; private: @@ -166,11 +172,10 @@ private: enum { kIllegalBatchClassID = 0, }; + SkAutoTUnref fPipeline; static int32_t gCurrBatchClassID; - - SkDEBUGCODE(bool fUsed;) - int fNumberOfDraws; + SkDEBUGCODE(bool fUsed;) typedef SkRefCnt INHERITED; }; diff --git a/src/gpu/GrPipeline.h b/src/gpu/GrPipeline.h index bf8ca8a..3b51818 100644 --- a/src/gpu/GrPipeline.h +++ b/src/gpu/GrPipeline.h @@ -10,6 +10,7 @@ #include "GrColor.h" #include "GrGpu.h" +#include "GrNonAtomicRef.h" #include "GrPendingFragmentStage.h" #include "GrPrimitiveProcessor.h" #include "GrProgramDesc.h" @@ -26,10 +27,8 @@ class GrPipelineBuilder; * Class that holds an optimized version of a GrPipelineBuilder. It is meant to be an immutable * class, and contains all data needed to set the state for a gpu draw. */ -class GrPipeline { +class GrPipeline : public GrNonAtomicRef { public: - - GrPipeline(const GrPipelineBuilder&, const GrProcOptInfo& colorPOI, const GrProcOptInfo& coveragePOI, diff --git a/src/gpu/GrReorderCommandBuilder.cpp b/src/gpu/GrReorderCommandBuilder.cpp index e373381..8c318fd 100644 --- a/src/gpu/GrReorderCommandBuilder.cpp +++ b/src/gpu/GrReorderCommandBuilder.cpp @@ -23,6 +23,7 @@ GrTargetCommands::Cmd* GrReorderCommandBuilder::recordDrawBatch(State* state, Gr // Experimentally we have found that most batching occurs within the first 10 comparisons. static const int kMaxLookback = 10; int i = 0; + batch->setPipeline(state->getPipeline()); if (!this->cmdBuffer()->empty()) { GrTargetCommands::CmdBuffer::ReverseIter reverseIter(*this->cmdBuffer()); @@ -30,8 +31,7 @@ GrTargetCommands::Cmd* GrReorderCommandBuilder::recordDrawBatch(State* state, Gr if (Cmd::kDrawBatch_CmdType == reverseIter->type()) { DrawBatch* previous = static_cast(reverseIter.get()); - if (previous->fState->getPipeline()->isEqual(*state->getPipeline()) && - previous->fBatch->combineIfPossible(batch)) { + if (previous->fBatch->combineIfPossible(batch)) { return NULL; } -- 2.7.4