blob: d59eb96b08f3ee762fc9c4f6e66752b80dfca40e [file] [log] [blame]
reed@google.comac10a2d2010-12-22 21:39:39 +00001/*
2 Copyright 2010 Google Inc.
3
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15 */
16
17
18#ifndef GrInOrderDrawBuffer_DEFINED
19#define GrInOrderDrawBuffer_DEFINED
20
21#include "GrDrawTarget.h"
22#include "GrAllocPool.h"
23#include "GrAllocator.h"
24#include "GrClip.h"
25
26class GrVertexBufferAllocPool;
bsalomon@google.com1c13c962011-02-14 16:51:21 +000027class GrIndexBufferAllocPool;
reed@google.comac10a2d2010-12-22 21:39:39 +000028
bsalomon@google.com1c13c962011-02-14 16:51:21 +000029/**
30 * GrInOrderDrawBuffer is an implementation of GrDrawTarget that queues up
31 * draws for eventual playback into a GrGpu. In theory one draw buffer could
32 * playback into another. When index or vertex buffers are used as geometry
33 * sources it is the callers the draw buffer only holds references to the
34 * buffers. It is the callers responsibility to ensure that the data is still
35 * valid when the draw buffer is played back into a GrGpu. Similarly, it is the
36 * caller's responsibility to ensure that all referenced textures, buffers,
37 * and rendertargets are associated in the GrGpu object that the buffer is
38 * played back into. The buffer requires VB and IB pools to store geometry.
39 */
40
reed@google.comac10a2d2010-12-22 21:39:39 +000041class GrInOrderDrawBuffer : public GrDrawTarget {
42public:
43
bsalomon@google.com86afc2a2011-02-16 16:12:19 +000044 /**
45 * Creates a GrInOrderDrawBuffer
46 *
47 * @param vertexPool pool where vertices for queued draws will be saved when
48 * the vertex source is either reserved or array.
49 * @param indexPool pool where indices for queued draws will be saved when
50 * the index source is either reserved or array.
51 */
bsalomon@google.com1c13c962011-02-14 16:51:21 +000052 GrInOrderDrawBuffer(GrVertexBufferAllocPool* vertexPool,
53 GrIndexBufferAllocPool* indexPool);
reed@google.comac10a2d2010-12-22 21:39:39 +000054
55 virtual ~GrInOrderDrawBuffer();
56
bsalomon@google.com86afc2a2011-02-16 16:12:19 +000057 /**
58 * Copies the draw state and clip from target to this draw buffer.
59 *
60 * @param target the target whose clip and state should be copied.
61 */
reed@google.comac10a2d2010-12-22 21:39:39 +000062 void initializeDrawStateAndClip(const GrDrawTarget& target);
63
bsalomon@google.com86afc2a2011-02-16 16:12:19 +000064 /**
65 * Provides the buffer with an index buffer that can be used for quad rendering.
66 * The buffer may be able to batch consecutive drawRects if this is provided.
67 * @param indexBuffer index buffer with quad indices.
68 */
69 void setQuadIndexBuffer(const GrIndexBuffer* indexBuffer);
70
71 /**
72 * Empties the draw buffer of any queued up draws.
73 */
74 void reset();
75
76 /**
77 * plays the queued up draws to another target. Does not empty this buffer so
78 * that it can be played back multiple times.
79 * @param target the target to receive the playback
80 */
81 void playback(GrDrawTarget* target);
82
83 // overrides from GrDrawTarget
bsalomon@google.comffca4002011-02-22 20:34:01 +000084 virtual void drawIndexed(GrPrimitiveType primitiveType,
bsalomon@google.com1c13c962011-02-14 16:51:21 +000085 int startVertex,
86 int startIndex,
87 int vertexCount,
88 int indexCount);
bsalomon@google.comffca4002011-02-22 20:34:01 +000089 virtual void drawNonIndexed(GrPrimitiveType primitiveType,
bsalomon@google.com1c13c962011-02-14 16:51:21 +000090 int startVertex,
91 int vertexCount);
reed@google.comac10a2d2010-12-22 21:39:39 +000092
bsalomon@google.com86afc2a2011-02-16 16:12:19 +000093 virtual void drawRect(const GrRect& rect,
94 const GrMatrix* matrix = NULL,
95 int stageEnableMask = 0,
96 const GrRect* srcRects[] = NULL,
97 const GrMatrix* srcMatrices[] = NULL);
98
reed@google.comac10a2d2010-12-22 21:39:39 +000099 virtual bool geometryHints(GrVertexLayout vertexLayout,
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000100 int* vertexCount,
101 int* indexCount) const;
reed@google.comac10a2d2010-12-22 21:39:39 +0000102
reed@google.comac10a2d2010-12-22 21:39:39 +0000103private:
104
105 struct Draw {
bsalomon@google.comffca4002011-02-22 20:34:01 +0000106 GrPrimitiveType fPrimitiveType;
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000107 int fStartVertex;
108 int fStartIndex;
109 int fVertexCount;
110 int fIndexCount;
111 bool fStateChanged;
112 bool fClipChanged;
113 GrVertexLayout fVertexLayout;
114 const GrVertexBuffer* fVertexBuffer;
115 const GrIndexBuffer* fIndexBuffer;
reed@google.comac10a2d2010-12-22 21:39:39 +0000116 };
117
118 virtual bool acquireGeometryHelper(GrVertexLayout vertexLayout,
119 void** vertices,
120 void** indices);
121 virtual void releaseGeometryHelper();
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000122 virtual void clipWillBeSet(const GrClip& newClip);
reed@google.comac10a2d2010-12-22 21:39:39 +0000123
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000124 virtual void setVertexSourceToArrayHelper(const void* vertexArray,
125 int vertexCount);
126
127 virtual void setIndexSourceToArrayHelper(const void* indexArray,
128 int indexCount);
129
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000130 bool needsNewState() const;
131 bool needsNewClip() const;
reed@google.comac10a2d2010-12-22 21:39:39 +0000132
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000133 void pushState();
134 void pushClip();
reed@google.comac10a2d2010-12-22 21:39:39 +0000135
136 GrTAllocator<Draw> fDraws;
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000137 // HACK: We currently do not hold refs on RTs in the saved draw states.
138 // The reason is that in the GL implementation when a GrTexture is destroyed
139 // that has an associated RT the RT is destroyed regardless of its ref count.
140 // We need a third object that holds the shared GL ids and persists until
141 // both reach ref count 0. (skia issue 122)
reed@google.comac10a2d2010-12-22 21:39:39 +0000142 GrTAllocator<SavedDrawState> fStates;
143
144 GrTAllocator<GrClip> fClips;
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000145 bool fClipSet;
146
147 GrVertexLayout fLastRectVertexLayout;
148 const GrIndexBuffer* fQuadIndexBuffer;
149 int fMaxQuads;
150 int fCurrQuad;
reed@google.comac10a2d2010-12-22 21:39:39 +0000151
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000152 GrVertexBufferAllocPool& fVertexPool;
153 const GrVertexBuffer* fCurrPoolVertexBuffer;
154 int fCurrPoolStartVertex;
reed@google.comac10a2d2010-12-22 21:39:39 +0000155
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000156 GrIndexBufferAllocPool& fIndexPool;
157 const GrIndexBuffer* fCurrPoolIndexBuffer;
158 int fCurrPoolStartIndex;
159
160 // caller may conservatively over reserve vertices / indices.
reed@google.comac10a2d2010-12-22 21:39:39 +0000161 // we release unused space back to allocator if possible
162 size_t fReservedVertexBytes;
163 size_t fReservedIndexBytes;
164 size_t fUsedReservedVertexBytes;
165 size_t fUsedReservedIndexBytes;
166
167 static const uint32_t STATES_BLOCK_SIZE = 8;
168 static const uint32_t DRAWS_BLOCK_SIZE = 8;
169 static const uint32_t CLIPS_BLOCK_SIZE = 8;
170 static const uint32_t VERTEX_BLOCK_SIZE = 1 << 12;
171 static const uint32_t INDEX_BLOCK_SIZE = 1 << 10;
172 int8_t fDrawsStorage[sizeof(Draw) *
173 DRAWS_BLOCK_SIZE];
174 int8_t fStatesStorage[sizeof(SavedDrawState) *
175 STATES_BLOCK_SIZE];
176 int8_t fClipsStorage[sizeof(GrClip) *
177 CLIPS_BLOCK_SIZE];
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000178 typedef GrDrawTarget INHERITED;
reed@google.comac10a2d2010-12-22 21:39:39 +0000179};
180
181#endif