/* * 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" #include "GrVertexBuffer.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 override = 0; void getInvariantOutputColor(GrInitInvariantOutput* out) const override { // When this is called on a batch, there is only one geometry bundle out->setKnownFourComponents(this->geoData(0)->fColor); } void getInvariantOutputCoverage(GrInitInvariantOutput* out) const override { out->setUnknownSingleComponent(); } void initBatchTracker(const GrPipelineInfo& init) override { // Handle any color overrides if (!init.readsColor()) { this->geoData(0)->fColor = GrColor_ILLEGAL; } init.getOverrideColorIfSet(&this->geoData(0)->fColor); // setup batch properties fBatch.fColorIgnored = !init.readsColor(); fBatch.fColor = this->geoData(0)->fColor; fBatch.fUsesLocalCoords = init.readsLocalCoords(); fBatch.fCoverageIgnored = !init.readsCoverage(); } void generateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline) override { batchTarget->initDraw(fGeometryProcessor, pipeline); this->onGenerateGeometry(batchTarget, pipeline); } protected: GrTestBatch(const GrGeometryProcessor* gp, const SkRect& bounds) { fGeometryProcessor.reset(SkRef(gp)); this->setBounds(bounds); } const GrGeometryProcessor* geometryProcessor() const { return fGeometryProcessor; } private: virtual Geometry* geoData(int index) = 0; virtual const Geometry* geoData(int index) const = 0; bool onCombineIfPossible(GrBatch* t) override { return false; } virtual void onGenerateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline) = 0; struct BatchTracker { GrColor fColor; bool fUsesLocalCoords; bool fColorIgnored; bool fCoverageIgnored; }; SkAutoTUnref fGeometryProcessor; BatchTracker fBatch; }; #endif