/* * 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 GrVertexBatch_DEFINED #define GrVertexBatch_DEFINED #include "GrDrawBatch.h" #include "GrPrimitiveProcessor.h" #include "GrPendingProgramElement.h" #include "GrVertices.h" #include "SkTLList.h" class GrBatchFlushState; /** * Base class for vertex-based GrBatches. */ class GrVertexBatch : public GrDrawBatch { public: class Target; GrVertexBatch(uint32_t classID); protected: /** 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 { public: InstancedHelper() {} /** Returns the allocated storage for the vertices. The caller should populate the before vertices before calling issueDraws(). */ void* init(Target*, GrPrimitiveType, size_t vertexStride, const GrIndexBuffer*, int verticesPerInstance, int indicesPerInstance, int instancesToDraw); /** Call after init() to issue draws to the batch target.*/ void recordDraw(Target* target); private: GrVertices fVertices; }; static const int kVerticesPerQuad = 4; static const int kIndicesPerQuad = 6; /** A specialization of InstanceHelper for quad rendering. */ class QuadHelper : private InstancedHelper { public: QuadHelper() : INHERITED() {} /** Finds the cached quad index buffer and reserves vertex space. Returns nullptr on failure and on sucess a pointer to the vertex data that the caller should populate before calling issueDraws(). */ void* init(Target* batchTarget, size_t vertexStride, int quadsToDraw); using InstancedHelper::recordDraw; private: typedef InstancedHelper INHERITED; }; private: void onPrepare(GrBatchFlushState* state) final; void onDraw(GrBatchFlushState* state) final; virtual void onPrepareDraws(Target*) const = 0; // A set of contiguous draws with no inline uploads between them that all use the same // primitive processor. All the draws in a DrawArray share a primitive processor and use the // the batch's GrPipeline. struct DrawArray { SkSTArray<1, GrVertices, true> fDraws; GrPendingProgramElement<const GrPrimitiveProcessor> fPrimitiveProcessor; }; // Array of DrawArray. There may be inline uploads between each DrawArray and each DrawArray // may use a different primitive processor. typedef SkTLList<DrawArray, 4> DrawArrayList; DrawArrayList fDrawArrays; typedef GrDrawBatch INHERITED; }; #endif