blob: 16ba603962a4473b746ee3bfbab8e04a23f38444 [file] [log] [blame]
bsalomon16b99132015-08-13 14:55:50 -07001/*
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 GrVertexBatch_DEFINED
9#define GrVertexBatch_DEFINED
10
11#include "GrDrawBatch.h"
egdaniel0e1853c2016-03-17 11:35:45 -070012#include "GrMesh.h"
bsalomon75398562015-08-17 12:55:38 -070013#include "GrPrimitiveProcessor.h"
14#include "GrPendingProgramElement.h"
bsalomon75398562015-08-17 12:55:38 -070015
16#include "SkTLList.h"
17
18class GrBatchFlushState;
bsalomon16b99132015-08-13 14:55:50 -070019
20/**
21 * Base class for vertex-based GrBatches.
22 */
23class GrVertexBatch : public GrDrawBatch {
24public:
bsalomon75398562015-08-17 12:55:38 -070025 class Target;
26
reed1b55a962015-09-17 20:16:13 -070027 GrVertexBatch(uint32_t classID);
bsalomon16b99132015-08-13 14:55:50 -070028
bsalomon16b99132015-08-13 14:55:50 -070029protected:
30 /** Helper for rendering instances using an instanced index index buffer. This class creates the
31 space for the vertices and flushes the draws to the batch target. */
32 class InstancedHelper {
33 public:
34 InstancedHelper() {}
35 /** Returns the allocated storage for the vertices. The caller should populate the before
36 vertices before calling issueDraws(). */
bsalomon75398562015-08-17 12:55:38 -070037 void* init(Target*, GrPrimitiveType, size_t vertexStride,
bsalomon16b99132015-08-13 14:55:50 -070038 const GrIndexBuffer*, int verticesPerInstance, int indicesPerInstance,
39 int instancesToDraw);
40
41 /** Call after init() to issue draws to the batch target.*/
bsalomon75398562015-08-17 12:55:38 -070042 void recordDraw(Target* target);
bsalomon16b99132015-08-13 14:55:50 -070043 private:
egdaniel0e1853c2016-03-17 11:35:45 -070044 GrMesh fMesh;
bsalomon16b99132015-08-13 14:55:50 -070045 };
46
47 static const int kVerticesPerQuad = 4;
48 static const int kIndicesPerQuad = 6;
49
50 /** A specialization of InstanceHelper for quad rendering. */
51 class QuadHelper : private InstancedHelper {
52 public:
53 QuadHelper() : INHERITED() {}
halcanary96fcdcc2015-08-27 07:41:13 -070054 /** Finds the cached quad index buffer and reserves vertex space. Returns nullptr on failure
bsalomon16b99132015-08-13 14:55:50 -070055 and on sucess a pointer to the vertex data that the caller should populate before
56 calling issueDraws(). */
bsalomon75398562015-08-17 12:55:38 -070057 void* init(Target* batchTarget, size_t vertexStride, int quadsToDraw);
bsalomon16b99132015-08-13 14:55:50 -070058
bsalomon75398562015-08-17 12:55:38 -070059 using InstancedHelper::recordDraw;
bsalomon16b99132015-08-13 14:55:50 -070060 private:
61 typedef InstancedHelper INHERITED;
62 };
63
64private:
bsalomon53469832015-08-18 09:20:09 -070065 void onPrepare(GrBatchFlushState* state) final;
66 void onDraw(GrBatchFlushState* state) final;
67
joshualitt144c3c82015-11-30 12:30:13 -080068 virtual void onPrepareDraws(Target*) const = 0;
bsalomon75398562015-08-17 12:55:38 -070069
70 // A set of contiguous draws with no inline uploads between them that all use the same
71 // primitive processor. All the draws in a DrawArray share a primitive processor and use the
72 // the batch's GrPipeline.
73 struct DrawArray {
egdaniel0e1853c2016-03-17 11:35:45 -070074 SkSTArray<1, GrMesh, true> fDraws;
bsalomon75398562015-08-17 12:55:38 -070075 GrPendingProgramElement<const GrPrimitiveProcessor> fPrimitiveProcessor;
76 };
77
78 // Array of DrawArray. There may be inline uploads between each DrawArray and each DrawArray
79 // may use a different primitive processor.
bsalomonf045d602015-11-18 19:01:12 -080080 typedef SkTLList<DrawArray, 4> DrawArrayList;
81 DrawArrayList fDrawArrays;
bsalomon75398562015-08-17 12:55:38 -070082
bsalomon16b99132015-08-13 14:55:50 -070083 typedef GrDrawBatch INHERITED;
84};
85
86#endif