GrTestBatch.h revision 72e3ae486c66871c2043eac4f08d85d419fbca2a
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 "GrBatch.h" 12#include "GrVertexBuffer.h" 13 14/* 15 * A simple batch only for testing purposes which actually doesn't batch at all, but can fit into 16 * the batch pipeline and generate arbitrary geometry 17 */ 18class GrTestBatch : public GrBatch { 19public: 20 struct Geometry { 21 GrColor fColor; 22 }; 23 24 virtual const char* name() const override = 0; 25 26 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { 27 // When this is called on a batch, there is only one geometry bundle 28 if (fGeometryProcessor->hasVertexColor()) { 29 out->setUnknownFourComponents(); 30 } else { 31 out->setKnownFourComponents(fGeometryProcessor->color()); 32 } 33 } 34 35 void getInvariantOutputCoverage(GrInitInvariantOutput* out) const override { 36 out->setUnknownSingleComponent(); 37 } 38 39 void initBatchTracker(const GrPipelineInfo& init) override { 40 // Handle any color overrides 41 if (init.fColorIgnored) { 42 this->geoData(0)->fColor = GrColor_ILLEGAL; 43 } else if (GrColor_ILLEGAL != init.fOverrideColor) { 44 this->geoData(0)->fColor = init.fOverrideColor; 45 } 46 47 // setup batch properties 48 fBatch.fColorIgnored = init.fColorIgnored; 49 fBatch.fColor = this->geoData(0)->fColor; 50 fBatch.fUsesLocalCoords = init.fUsesLocalCoords; 51 fBatch.fCoverageIgnored = init.fCoverageIgnored; 52 } 53 54 void generateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline) override { 55 batchTarget->initDraw(fGeometryProcessor, pipeline); 56 57 // TODO this is hacky, but the only way we have to initialize the GP is to use the 58 // GrPipelineInfo struct so we can generate the correct shader. Once we have GrBatch 59 // everywhere we can remove this nastiness 60 GrPipelineInfo init; 61 init.fColorIgnored = fBatch.fColorIgnored; 62 init.fOverrideColor = GrColor_ILLEGAL; 63 init.fCoverageIgnored = fBatch.fCoverageIgnored; 64 init.fUsesLocalCoords = fBatch.fUsesLocalCoords; 65 fGeometryProcessor->initBatchTracker(batchTarget->currentBatchTracker(), init); 66 67 this->onGenerateGeometry(batchTarget, pipeline); 68 } 69 70protected: 71 GrTestBatch(const GrGeometryProcessor* gp) { 72 fGeometryProcessor.reset(SkRef(gp)); 73 } 74 75 const GrGeometryProcessor* geometryProcessor() const { return fGeometryProcessor; } 76 77private: 78 virtual Geometry* geoData(int index) = 0; 79 80 bool onCombineIfPossible(GrBatch* t) override { 81 return false; 82 } 83 84 virtual void onGenerateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline) = 0; 85 86 struct BatchTracker { 87 GrColor fColor; 88 bool fUsesLocalCoords; 89 bool fColorIgnored; 90 bool fCoverageIgnored; 91 }; 92 93 SkAutoTUnref<const GrGeometryProcessor> fGeometryProcessor; 94 BatchTracker fBatch; 95}; 96 97#endif 98