Index: src/gpu/GrTestBatch.h |
diff --git a/src/gpu/GrTestBatch.h b/src/gpu/GrTestBatch.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ebff721764ad988146c419906d2d42a902c602fb |
--- /dev/null |
+++ b/src/gpu/GrTestBatch.h |
@@ -0,0 +1,98 @@ |
+/* |
+ * Copyright 2015 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#ifndef GrTestBatch_DEFINED |
+#define GrTestBatch_DEFINED |
+ |
+#include "GrBatch.h" |
+ |
+/* |
+ * A simple batch only for testing purposes which actually doesn't batch at all, but can fit into |
+ * the batch pipeline and generate arbitrary geometry |
+ */ |
+class GrTestBatch : public GrBatch { |
+public: |
+ struct Geometry { |
+ GrColor fColor; |
+ }; |
+ |
+ virtual const char* name() const SK_OVERRIDE = 0; |
+ |
+ void getInvariantOutputColor(GrInitInvariantOutput* out) const SK_OVERRIDE { |
+ // When this is called on a batch, there is only one geometry bundle |
+ if (fGeometryProcessor->hasVertexColor()) { |
+ out->setUnknownFourComponents(); |
+ } else { |
+ out->setKnownFourComponents(fGeometryProcessor->color()); |
+ } |
+ } |
+ |
+ void getInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRIDE { |
+ out->setUnknownSingleComponent(); |
+ } |
+ |
+ void initBatchOpt(const GrBatchOpt& batchOpt) {} |
+ |
+ void initBatchTracker(const GrPipelineInfo& init) SK_OVERRIDE { |
+ // Handle any color overrides |
+ if (init.fColorIgnored) { |
+ this->geoData(0)->fColor = GrColor_ILLEGAL; |
+ } else if (GrColor_ILLEGAL != init.fOverrideColor) { |
+ this->geoData(0)->fColor = init.fOverrideColor; |
+ } |
+ |
+ // setup batch properties |
+ fBatch.fColorIgnored = init.fColorIgnored; |
+ fBatch.fColor = this->geoData(0)->fColor; |
+ fBatch.fUsesLocalCoords = init.fUsesLocalCoords; |
+ fBatch.fCoverageIgnored = init.fCoverageIgnored; |
+ } |
+ |
+ void generateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline) SK_OVERRIDE { |
+ batchTarget->initDraw(fGeometryProcessor, pipeline); |
+ |
+ // TODO this is hacky, but the only way we have to initialize the GP is to use the |
+ // GrPipelineInfo struct so we can generate the correct shader. Once we have GrBatch |
+ // everywhere we can remove this nastiness |
+ GrPipelineInfo init; |
+ init.fColorIgnored = fBatch.fColorIgnored; |
+ init.fOverrideColor = GrColor_ILLEGAL; |
+ init.fCoverageIgnored = fBatch.fCoverageIgnored; |
+ init.fUsesLocalCoords = fBatch.fUsesLocalCoords; |
+ fGeometryProcessor->initBatchTracker(batchTarget->currentBatchTracker(), init); |
+ |
+ this->onGenerateGeometry(batchTarget, pipeline); |
+ } |
+ |
+protected: |
+ GrTestBatch(const GrGeometryProcessor* gp) { |
+ fGeometryProcessor.reset(SkRef(gp)); |
+ } |
+ |
+ const GrGeometryProcessor* geometryProcessor() const { return fGeometryProcessor; } |
+ |
+private: |
+ virtual Geometry* geoData(int index) = 0; |
+ |
+ bool onCombineIfPossible(GrBatch* t) SK_OVERRIDE { |
+ return false; |
+ } |
+ |
+ virtual void onGenerateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline) = 0; |
+ |
+ struct BatchTracker { |
+ GrColor fColor; |
+ bool fUsesLocalCoords; |
+ bool fColorIgnored; |
+ bool fCoverageIgnored; |
+ }; |
+ |
+ SkAutoTUnref<const GrGeometryProcessor> fGeometryProcessor; |
+ BatchTracker fBatch; |
+}; |
+ |
+#endif |