Give GrBatch a pointer to GrPipeline
authorjoshualitt <joshualitt@chromium.org>
Thu, 16 Jul 2015 14:06:50 +0000 (07:06 -0700)
committerCommit bot <commit-bot@chromium.org>
Thu, 16 Jul 2015 14:06:50 +0000 (07:06 -0700)
BUG=skia:

Review URL: https://codereview.chromium.org/1237283007

gm/beziereffects.cpp
gm/convexpolyeffect.cpp
src/gpu/GrBatch.h
src/gpu/GrPipeline.h
src/gpu/GrReorderCommandBuilder.cpp

index 5e00608..6e58619 100644 (file)
@@ -46,6 +46,7 @@ private:
     BezierCubicOrConicTestBatch(const GrGeometryProcessor* gp, const Geometry& geo,
                                 const SkScalar klmEqs[9], SkScalar sign)
         : INHERITED(gp, geo.fBounds) {
+        this->initClassID<BezierCubicOrConicTestBatch>();
         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<BezierQuadTestBatch>();
     }
 
     struct Vertex {
index 2c77bce..9891f87 100644 (file)
@@ -43,6 +43,7 @@ private:
     ConvexPolyTestBatch(const GrGeometryProcessor* gp, const Geometry& geo)
         : INHERITED(gp, geo.fBounds)
         , fGeometry(geo) {
+        this->initClassID<ConvexPolyTestBatch>();
     }
 
     Geometry* geoData(int index) override {
index 21dc3d2..b770112 100644 (file)
@@ -11,9 +11,9 @@
 #include <new>
 #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 <typename PROC_SUBCLASS> 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<const GrPipeline> fPipeline;
     static int32_t gCurrBatchClassID;
-
-    SkDEBUGCODE(bool fUsed;)
-
     int fNumberOfDraws;
+    SkDEBUGCODE(bool fUsed;)
 
     typedef SkRefCnt INHERITED;
 };
index bf8ca8a..3b51818 100644 (file)
@@ -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,
index e373381..8c318fd 100644 (file)
@@ -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<DrawBatch*>(reverseIter.get());
 
-                if (previous->fState->getPipeline()->isEqual(*state->getPipeline()) &&
-                    previous->fBatch->combineIfPossible(batch)) {
+                if (previous->fBatch->combineIfPossible(batch)) {
                     return NULL;
                 }