• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2015 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef GrTestBatch_DEFINED
9 #define GrTestBatch_DEFINED
10 
11 #include "GrBatchFlushState.h"
12 #include "GrGeometryProcessor.h"
13 #include "GrVertexBuffer.h"
14 
15 #include "batches/GrVertexBatch.h"
16 
17 /*
18  * A simple batch only for testing purposes which actually doesn't batch at all, but can fit into
19  * the batch pipeline and generate arbitrary geometry
20  */
21 class GrTestBatch : public GrVertexBatch {
22 public:
23     struct Geometry {
24         GrColor fColor;
25     };
26 
27     virtual const char* name() const override = 0;
28 
computePipelineOptimizations(GrInitInvariantOutput * color,GrInitInvariantOutput * coverage,GrBatchToXPOverrides * overrides)29     void computePipelineOptimizations(GrInitInvariantOutput* color,
30                                       GrInitInvariantOutput* coverage,
31                                       GrBatchToXPOverrides* overrides) const override {
32         // When this is called on a batch, there is only one geometry bundle
33         color->setKnownFourComponents(this->geoData(0)->fColor);
34         coverage->setUnknownSingleComponent();
35     }
36 
initBatchTracker(const GrXPOverridesForBatch & overrides)37     void initBatchTracker(const GrXPOverridesForBatch& overrides) override {
38         // Handle any color overrides
39         if (!overrides.readsColor()) {
40             this->geoData(0)->fColor = GrColor_ILLEGAL;
41         }
42         overrides.getOverrideColorIfSet(&this->geoData(0)->fColor);
43 
44         // setup batch properties
45         fBatch.fColorIgnored = !overrides.readsColor();
46         fBatch.fColor = this->geoData(0)->fColor;
47         fBatch.fUsesLocalCoords = overrides.readsLocalCoords();
48         fBatch.fCoverageIgnored = !overrides.readsCoverage();
49     }
50 
51 protected:
GrTestBatch(uint32_t classID,const GrGeometryProcessor * gp,const SkRect & bounds)52     GrTestBatch(uint32_t classID, const GrGeometryProcessor* gp, const SkRect& bounds)
53         : INHERITED(classID) {
54         fGeometryProcessor.reset(SkRef(gp));
55 
56         this->setBounds(bounds);
57     }
58 
geometryProcessor()59     const GrGeometryProcessor* geometryProcessor() const { return fGeometryProcessor; }
60 
61 private:
onPrepareDraws(Target * target)62     void onPrepareDraws(Target* target) const override {
63         target->initDraw(fGeometryProcessor, this->pipeline());
64         this->generateGeometry(target);
65     }
66 
67     virtual Geometry* geoData(int index) = 0;
68     virtual const Geometry* geoData(int index) const = 0;
69 
onCombineIfPossible(GrBatch * t,const GrCaps &)70     bool onCombineIfPossible(GrBatch* t, const GrCaps&) override {
71         return false;
72     }
73 
74     virtual void generateGeometry(Target*) const = 0;
75 
76     struct BatchTracker {
77         GrColor fColor;
78         bool fUsesLocalCoords;
79         bool fColorIgnored;
80         bool fCoverageIgnored;
81     };
82 
83     SkAutoTUnref<const GrGeometryProcessor> fGeometryProcessor;
84     BatchTracker fBatch;
85 
86     typedef GrVertexBatch INHERITED;
87 };
88 
89 #endif
90