/*
* 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