blob: 806153cbeaea01db7c64aa4383ca4fe31a903502 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
reed@google.comac10a2d2010-12-22 21:39:39 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
reed@google.comac10a2d2010-12-22 21:39:39 +00007 */
8
9
10#include "GrInOrderDrawBuffer.h"
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +000011#include "GrRenderTarget.h"
reed@google.comac10a2d2010-12-22 21:39:39 +000012#include "GrTexture.h"
bsalomon@google.com1c13c962011-02-14 16:51:21 +000013#include "GrBufferAllocPool.h"
bsalomon@google.com86afc2a2011-02-16 16:12:19 +000014#include "GrIndexBuffer.h"
15#include "GrVertexBuffer.h"
reed@google.comac10a2d2010-12-22 21:39:39 +000016#include "GrGpu.h"
17
bsalomon@google.com471d4712011-08-23 15:45:25 +000018GrInOrderDrawBuffer::GrInOrderDrawBuffer(const GrGpu* gpu,
19 GrVertexBufferAllocPool* vertexPool,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +000020 GrIndexBufferAllocPool* indexPool)
bsalomon@google.com97805382012-03-13 14:32:07 +000021 : fAutoFlushTarget(NULL)
22 , fClipSet(true)
robertphillips@google.com69705572012-03-21 19:46:50 +000023 , fVertexPool(*vertexPool)
24 , fIndexPool(*indexPool)
bsalomon@google.com25fb21f2011-06-21 18:17:25 +000025 , fLastRectVertexLayout(0)
26 , fQuadIndexBuffer(NULL)
27 , fMaxQuads(0)
robertphillips@google.com69705572012-03-21 19:46:50 +000028 , fCurrQuad(0) {
bsalomon@google.com18c9c192011-09-22 21:01:31 +000029
30 fCaps = gpu->getCaps();
31
bsalomon@google.com1c13c962011-02-14 16:51:21 +000032 GrAssert(NULL != vertexPool);
33 GrAssert(NULL != indexPool);
bsalomon@google.com25fb21f2011-06-21 18:17:25 +000034
35 GeometryPoolState& poolState = fGeoPoolStateStack.push_back();
36 poolState.fUsedPoolVertexBytes = 0;
37 poolState.fUsedPoolIndexBytes = 0;
38#if GR_DEBUG
39 poolState.fPoolVertexBuffer = (GrVertexBuffer*)~0;
40 poolState.fPoolStartVertex = ~0;
41 poolState.fPoolIndexBuffer = (GrIndexBuffer*)~0;
42 poolState.fPoolStartIndex = ~0;
43#endif
bsalomon@google.com934c5702012-03-20 21:17:58 +000044 fInstancedDrawTracker.reset();
reed@google.comac10a2d2010-12-22 21:39:39 +000045}
46
47GrInOrderDrawBuffer::~GrInOrderDrawBuffer() {
bsalomon@google.com86afc2a2011-02-16 16:12:19 +000048 this->reset();
bsalomon@google.com4a018bb2011-10-28 19:50:21 +000049 // This must be called by before the GrDrawTarget destructor
50 this->releaseGeometry();
bsalomon@google.com86afc2a2011-02-16 16:12:19 +000051 GrSafeUnref(fQuadIndexBuffer);
bsalomon@google.com97805382012-03-13 14:32:07 +000052 GrSafeUnref(fAutoFlushTarget);
reed@google.comac10a2d2010-12-22 21:39:39 +000053}
54
bsalomon@google.com86afc2a2011-02-16 16:12:19 +000055void GrInOrderDrawBuffer::setQuadIndexBuffer(const GrIndexBuffer* indexBuffer) {
56 bool newIdxBuffer = fQuadIndexBuffer != indexBuffer;
57 if (newIdxBuffer) {
58 GrSafeUnref(fQuadIndexBuffer);
59 fQuadIndexBuffer = indexBuffer;
60 GrSafeRef(fQuadIndexBuffer);
61 fCurrQuad = 0;
62 fMaxQuads = (NULL == indexBuffer) ? 0 : indexBuffer->maxQuads();
63 } else {
bsalomon@google.comd302f142011-03-03 13:54:13 +000064 GrAssert((NULL == indexBuffer && 0 == fMaxQuads) ||
bsalomon@google.com86afc2a2011-02-16 16:12:19 +000065 (indexBuffer->maxQuads() == fMaxQuads));
66 }
67}
68
bsalomon@google.com934c5702012-03-20 21:17:58 +000069////////////////////////////////////////////////////////////////////////////////
70
71void GrInOrderDrawBuffer::resetDrawTracking() {
72 fCurrQuad = 0;
73 fInstancedDrawTracker.reset();
74}
75
bsalomon@google.comd302f142011-03-03 13:54:13 +000076void GrInOrderDrawBuffer::drawRect(const GrRect& rect,
bsalomon@google.com86afc2a2011-02-16 16:12:19 +000077 const GrMatrix* matrix,
bsalomon@google.com39ee0ff2011-12-06 15:32:52 +000078 StageMask stageMask,
bsalomon@google.com86afc2a2011-02-16 16:12:19 +000079 const GrRect* srcRects[],
80 const GrMatrix* srcMatrices[]) {
bsalomon@google.comd302f142011-03-03 13:54:13 +000081
bsalomon@google.com86afc2a2011-02-16 16:12:19 +000082 GrAssert(!(NULL == fQuadIndexBuffer && fCurrQuad));
83 GrAssert(!(fDraws.empty() && fCurrQuad));
84 GrAssert(!(0 != fMaxQuads && NULL == fQuadIndexBuffer));
85
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +000086 GrDrawState* drawState = this->drawState();
87
bsalomon@google.com86afc2a2011-02-16 16:12:19 +000088 // if we have a quad IB then either append to the previous run of
89 // rects or start a new run
90 if (fMaxQuads) {
bsalomon@google.comd302f142011-03-03 13:54:13 +000091
bsalomon@google.com86afc2a2011-02-16 16:12:19 +000092 bool appendToPreviousDraw = false;
bsalomon@google.com39ee0ff2011-12-06 15:32:52 +000093 GrVertexLayout layout = GetRectVertexLayout(stageMask, srcRects);
bsalomon@google.com86afc2a2011-02-16 16:12:19 +000094 AutoReleaseGeometry geo(this, layout, 4, 0);
bsalomon@google.com6513cd02011-08-05 20:12:30 +000095 if (!geo.succeeded()) {
96 GrPrintf("Failed to get space for vertices!\n");
97 return;
98 }
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +000099 GrMatrix combinedMatrix = drawState->getViewMatrix();
bsalomon@google.com3f5a95e2012-03-08 16:41:42 +0000100 // We go to device space so that matrix changes allow us to concat
101 // rect draws. When the caller has provided explicit source rects
102 // then we don't want to modify the sampler matrices. Otherwise we do
103 // we have to account for the view matrix change in the sampler
104 // matrices.
105 StageMask devCoordMask = (NULL == srcRects) ? stageMask : 0;
106 GrDrawTarget::AutoDeviceCoordDraw adcd(this, devCoordMask);
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000107 if (NULL != matrix) {
108 combinedMatrix.preConcat(*matrix);
109 }
110
111 SetRectVertices(rect, &combinedMatrix, srcRects, srcMatrices, layout, geo.vertices());
112
113 // we don't want to miss an opportunity to batch rects together
114 // simply because the clip has changed if the clip doesn't affect
115 // the rect.
116 bool disabledClip = false;
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000117 if (drawState->isClipState() && fClip.isRect()) {
bsalomon@google.comd302f142011-03-03 13:54:13 +0000118
bsalomon@google.com0b50b2e2011-03-08 21:07:21 +0000119 GrRect clipRect = fClip.getRect(0);
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000120 // If the clip rect touches the edge of the viewport, extended it
121 // out (close) to infinity to avoid bogus intersections.
bsalomon@google.comd302f142011-03-03 13:54:13 +0000122 // We might consider a more exact clip to viewport if this
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000123 // conservative test fails.
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000124 const GrRenderTarget* target = drawState->getRenderTarget();
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000125 if (0 >= clipRect.fLeft) {
126 clipRect.fLeft = GR_ScalarMin;
127 }
128 if (target->width() <= clipRect.fRight) {
129 clipRect.fRight = GR_ScalarMax;
130 }
131 if (0 >= clipRect.top()) {
132 clipRect.fTop = GR_ScalarMin;
133 }
134 if (target->height() <= clipRect.fBottom) {
135 clipRect.fBottom = GR_ScalarMax;
136 }
137 int stride = VertexSize(layout);
138 bool insideClip = true;
139 for (int v = 0; v < 4; ++v) {
140 const GrPoint& p = *GetVertexPoint(geo.vertices(), v, stride);
141 if (!clipRect.contains(p)) {
142 insideClip = false;
143 break;
144 }
145 }
146 if (insideClip) {
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000147 drawState->disableState(GrDrawState::kClip_StateBit);
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000148 disabledClip = true;
149 }
150 }
bsalomon@google.comd302f142011-03-03 13:54:13 +0000151 if (!needsNewClip() && !needsNewState() && fCurrQuad > 0 &&
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000152 fCurrQuad < fMaxQuads && layout == fLastRectVertexLayout) {
153
154 int vsize = VertexSize(layout);
bsalomon@google.comd302f142011-03-03 13:54:13 +0000155
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000156 Draw& lastDraw = fDraws.back();
157
158 GrAssert(lastDraw.fIndexBuffer == fQuadIndexBuffer);
159 GrAssert(kTriangles_PrimitiveType == lastDraw.fPrimitiveType);
160 GrAssert(0 == lastDraw.fVertexCount % 4);
161 GrAssert(0 == lastDraw.fIndexCount % 6);
162 GrAssert(0 == lastDraw.fStartIndex);
163
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000164 GeometryPoolState& poolState = fGeoPoolStateStack.back();
bsalomon@google.com6aa25c32011-04-27 19:55:29 +0000165 bool clearSinceLastDraw =
166 fClears.count() &&
167 fClears.back().fBeforeDrawIdx == fDraws.count();
168
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000169 appendToPreviousDraw =
170 !clearSinceLastDraw &&
171 lastDraw.fVertexBuffer == poolState.fPoolVertexBuffer &&
172 (fCurrQuad * 4 + lastDraw.fStartVertex) == poolState.fPoolStartVertex;
173
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000174 if (appendToPreviousDraw) {
175 lastDraw.fVertexCount += 4;
176 lastDraw.fIndexCount += 6;
177 fCurrQuad += 1;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000178 // we reserved above, so we should be the first
179 // use of this vertex reserveation.
180 GrAssert(0 == poolState.fUsedPoolVertexBytes);
181 poolState.fUsedPoolVertexBytes = 4 * vsize;
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000182 }
183 }
184 if (!appendToPreviousDraw) {
185 this->setIndexSourceToBuffer(fQuadIndexBuffer);
bsalomon@google.com3f5a95e2012-03-08 16:41:42 +0000186 this->drawIndexed(kTriangles_PrimitiveType, 0, 0, 4, 6);
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000187 fCurrQuad = 1;
188 fLastRectVertexLayout = layout;
189 }
190 if (disabledClip) {
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000191 drawState->enableState(GrDrawState::kClip_StateBit);
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000192 }
bsalomon@google.com934c5702012-03-20 21:17:58 +0000193 fInstancedDrawTracker.reset();
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000194 } else {
bsalomon@google.com39ee0ff2011-12-06 15:32:52 +0000195 INHERITED::drawRect(rect, matrix, stageMask, srcRects, srcMatrices);
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000196 }
197}
198
bsalomon@google.com934c5702012-03-20 21:17:58 +0000199void GrInOrderDrawBuffer::drawIndexedInstances(GrPrimitiveType type,
200 int instanceCount,
201 int verticesPerInstance,
202 int indicesPerInstance) {
203 if (!verticesPerInstance || !indicesPerInstance) {
204 return;
205 }
206
207 const GeometrySrcState& geomSrc = this->getGeomSrc();
208
209 // we only attempt to concat the case when reserved verts are used with
210 // an index buffer.
211 if (kReserved_GeometrySrcType == geomSrc.fVertexSrc &&
212 kBuffer_GeometrySrcType == geomSrc.fIndexSrc) {
213
214 Draw* draw = NULL;
215 // if the last draw used the same indices/vertices per shape then we
216 // may be able to append to it.
217 if (verticesPerInstance == fInstancedDrawTracker.fVerticesPerInstance &&
218 indicesPerInstance == fInstancedDrawTracker.fIndicesPerInstance) {
219 GrAssert(fDraws.count());
220 draw = &fDraws.back();
221 }
222
223 bool clipChanged = this->needsNewClip();
224 bool stateChanged = this->needsNewState();
225 if (clipChanged) {
226 this->pushClip();
227 }
228 if (stateChanged) {
229 this->pushState();
230 }
231
232 GeometryPoolState& poolState = fGeoPoolStateStack.back();
233 const GrVertexBuffer* vertexBuffer = poolState.fPoolVertexBuffer;
234
235 // Check whether the draw is compatible with this draw in order to
236 // append
237 if (NULL == draw ||
238 clipChanged ||
239 stateChanged ||
240 draw->fIndexBuffer != geomSrc.fIndexBuffer ||
241 draw->fPrimitiveType != type ||
242 draw->fVertexBuffer != vertexBuffer) {
243
244 draw = &fDraws.push_back();
245 draw->fClipChanged = clipChanged;
246 draw->fStateChanged = stateChanged;
247 draw->fIndexBuffer = geomSrc.fIndexBuffer;
248 geomSrc.fIndexBuffer->ref();
249 draw->fVertexBuffer = vertexBuffer;
250 vertexBuffer->ref();
251 draw->fPrimitiveType = type;
252 draw->fStartIndex = 0;
253 draw->fIndexCount = 0;
254 draw->fStartVertex = poolState.fPoolStartVertex;
255 draw->fVertexCount = 0;
256 draw->fVertexLayout = geomSrc.fVertexLayout;
257 } else {
258 GrAssert(!(draw->fIndexCount % indicesPerInstance));
259 GrAssert(!(draw->fVertexCount % verticesPerInstance));
260 GrAssert(poolState.fPoolStartVertex == draw->fStartVertex +
261 draw->fVertexCount);
262 }
263
264 // how many instances can be in a single draw
265 int maxInstancesPerDraw = this->indexCountInCurrentSource() /
266 indicesPerInstance;
267 if (!maxInstancesPerDraw) {
268 return;
269 }
270 // how many instances should be concat'ed onto draw
271 int instancesToConcat = maxInstancesPerDraw - draw->fVertexCount /
272 verticesPerInstance;
273 if (maxInstancesPerDraw > instanceCount) {
274 maxInstancesPerDraw = instanceCount;
275 if (instancesToConcat > instanceCount) {
276 instancesToConcat = instanceCount;
277 }
278 }
279
280 // update the amount of reserved data actually referenced in draws
281 size_t vertexBytes = instanceCount * verticesPerInstance *
282 VertexSize(draw->fVertexLayout);
283 poolState.fUsedPoolVertexBytes =
284 GrMax(poolState.fUsedPoolVertexBytes, vertexBytes);
285
286 while (instanceCount) {
287 if (!instancesToConcat) {
288 int startVertex = draw->fStartVertex + draw->fVertexCount;
289 draw = &fDraws.push_back();
290 draw->fClipChanged = false;
291 draw->fStateChanged = false;
292 draw->fIndexBuffer = geomSrc.fIndexBuffer;
293 geomSrc.fIndexBuffer->ref();
294 draw->fVertexBuffer = vertexBuffer;
295 vertexBuffer->ref();
296 draw->fPrimitiveType = type;
297 draw->fStartIndex = 0;
298 draw->fStartVertex = startVertex;
299 draw->fVertexCount = 0;
300 draw->fVertexLayout = geomSrc.fVertexLayout;
301 instancesToConcat = maxInstancesPerDraw;
302 }
303 draw->fVertexCount += instancesToConcat * verticesPerInstance;
304 draw->fIndexCount += instancesToConcat * indicesPerInstance;
305 instanceCount -= instancesToConcat;
306 instancesToConcat = 0;
307 }
308
309 // update draw tracking for next draw
310 fCurrQuad = 0;
311 fInstancedDrawTracker.fVerticesPerInstance = verticesPerInstance;
312 fInstancedDrawTracker.fIndicesPerInstance = indicesPerInstance;
313 } else {
314 this->INHERITED::drawIndexedInstances(type,
315 instanceCount,
316 verticesPerInstance,
317 indicesPerInstance);
318 }
319
320}
321
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000322void GrInOrderDrawBuffer::onDrawIndexed(GrPrimitiveType primitiveType,
323 int startVertex,
324 int startIndex,
325 int vertexCount,
326 int indexCount) {
reed@google.comac10a2d2010-12-22 21:39:39 +0000327
328 if (!vertexCount || !indexCount) {
329 return;
330 }
331
bsalomon@google.com934c5702012-03-20 21:17:58 +0000332 this->resetDrawTracking();
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000333
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000334 GeometryPoolState& poolState = fGeoPoolStateStack.back();
335
reed@google.comac10a2d2010-12-22 21:39:39 +0000336 Draw& draw = fDraws.push_back();
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000337 draw.fPrimitiveType = primitiveType;
reed@google.comac10a2d2010-12-22 21:39:39 +0000338 draw.fStartVertex = startVertex;
339 draw.fStartIndex = startIndex;
340 draw.fVertexCount = vertexCount;
341 draw.fIndexCount = indexCount;
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000342
343 draw.fClipChanged = this->needsNewClip();
344 if (draw.fClipChanged) {
345 this->pushClip();
346 }
347
348 draw.fStateChanged = this->needsNewState();
349 if (draw.fStateChanged) {
350 this->pushState();
351 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000352
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000353 draw.fVertexLayout = this->getGeomSrc().fVertexLayout;
354 switch (this->getGeomSrc().fVertexSrc) {
reed@google.comac10a2d2010-12-22 21:39:39 +0000355 case kBuffer_GeometrySrcType:
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000356 draw.fVertexBuffer = this->getGeomSrc().fVertexBuffer;
reed@google.comac10a2d2010-12-22 21:39:39 +0000357 break;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000358 case kReserved_GeometrySrcType: // fallthrough
359 case kArray_GeometrySrcType: {
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000360 size_t vertexBytes = (vertexCount + startVertex) *
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000361 VertexSize(this->getGeomSrc().fVertexLayout);
362 poolState.fUsedPoolVertexBytes =
363 GrMax(poolState.fUsedPoolVertexBytes, vertexBytes);
364 draw.fVertexBuffer = poolState.fPoolVertexBuffer;
365 draw.fStartVertex += poolState.fPoolStartVertex;
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000366 break;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000367 }
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000368 default:
369 GrCrash("unknown geom src type");
reed@google.comac10a2d2010-12-22 21:39:39 +0000370 }
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000371 draw.fVertexBuffer->ref();
reed@google.comac10a2d2010-12-22 21:39:39 +0000372
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000373 switch (this->getGeomSrc().fIndexSrc) {
reed@google.comac10a2d2010-12-22 21:39:39 +0000374 case kBuffer_GeometrySrcType:
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000375 draw.fIndexBuffer = this->getGeomSrc().fIndexBuffer;
reed@google.comac10a2d2010-12-22 21:39:39 +0000376 break;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000377 case kReserved_GeometrySrcType: // fallthrough
378 case kArray_GeometrySrcType: {
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000379 size_t indexBytes = (indexCount + startIndex) * sizeof(uint16_t);
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000380 poolState.fUsedPoolIndexBytes =
381 GrMax(poolState.fUsedPoolIndexBytes, indexBytes);
382 draw.fIndexBuffer = poolState.fPoolIndexBuffer;
bsalomon@google.comd127ffe2012-02-24 20:11:52 +0000383 draw.fStartIndex += poolState.fPoolStartIndex;
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000384 break;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000385 }
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000386 default:
387 GrCrash("unknown geom src type");
reed@google.comac10a2d2010-12-22 21:39:39 +0000388 }
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000389 draw.fIndexBuffer->ref();
reed@google.comac10a2d2010-12-22 21:39:39 +0000390}
391
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000392void GrInOrderDrawBuffer::onDrawNonIndexed(GrPrimitiveType primitiveType,
393 int startVertex,
394 int vertexCount) {
reed@google.comac10a2d2010-12-22 21:39:39 +0000395 if (!vertexCount) {
396 return;
397 }
398
bsalomon@google.com934c5702012-03-20 21:17:58 +0000399 this->resetDrawTracking();
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000400
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000401 GeometryPoolState& poolState = fGeoPoolStateStack.back();
402
reed@google.comac10a2d2010-12-22 21:39:39 +0000403 Draw& draw = fDraws.push_back();
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000404 draw.fPrimitiveType = primitiveType;
reed@google.comac10a2d2010-12-22 21:39:39 +0000405 draw.fStartVertex = startVertex;
406 draw.fStartIndex = 0;
407 draw.fVertexCount = vertexCount;
408 draw.fIndexCount = 0;
409
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000410 draw.fClipChanged = this->needsNewClip();
411 if (draw.fClipChanged) {
412 this->pushClip();
413 }
414
415 draw.fStateChanged = this->needsNewState();
416 if (draw.fStateChanged) {
417 this->pushState();
418 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000419
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000420 draw.fVertexLayout = this->getGeomSrc().fVertexLayout;
421 switch (this->getGeomSrc().fVertexSrc) {
reed@google.comac10a2d2010-12-22 21:39:39 +0000422 case kBuffer_GeometrySrcType:
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000423 draw.fVertexBuffer = this->getGeomSrc().fVertexBuffer;
reed@google.comac10a2d2010-12-22 21:39:39 +0000424 break;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000425 case kReserved_GeometrySrcType: // fallthrough
426 case kArray_GeometrySrcType: {
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000427 size_t vertexBytes = (vertexCount + startVertex) *
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000428 VertexSize(this->getGeomSrc().fVertexLayout);
429 poolState.fUsedPoolVertexBytes =
430 GrMax(poolState.fUsedPoolVertexBytes, vertexBytes);
431 draw.fVertexBuffer = poolState.fPoolVertexBuffer;
432 draw.fStartVertex += poolState.fPoolStartVertex;
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000433 break;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000434 }
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000435 default:
436 GrCrash("unknown geom src type");
reed@google.comac10a2d2010-12-22 21:39:39 +0000437 }
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000438 draw.fVertexBuffer->ref();
439 draw.fIndexBuffer = NULL;
reed@google.comac10a2d2010-12-22 21:39:39 +0000440}
441
bsalomon@google.com6aa25c32011-04-27 19:55:29 +0000442void GrInOrderDrawBuffer::clear(const GrIRect* rect, GrColor color) {
443 GrIRect r;
444 if (NULL == rect) {
445 // We could do something smart and remove previous draws and clears to
446 // the current render target. If we get that smart we have to make sure
447 // those draws aren't read before this clear (render-to-texture).
448 r.setLTRB(0, 0,
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000449 this->getDrawState().getRenderTarget()->width(),
450 this->getDrawState().getRenderTarget()->height());
bsalomon@google.com6aa25c32011-04-27 19:55:29 +0000451 rect = &r;
452 }
bsalomon@google.com0b335c12011-04-25 19:17:44 +0000453 Clear& clr = fClears.push_back();
454 clr.fColor = color;
455 clr.fBeforeDrawIdx = fDraws.count();
bsalomon@google.com6aa25c32011-04-27 19:55:29 +0000456 clr.fRect = *rect;
bsalomon@google.com0b335c12011-04-25 19:17:44 +0000457}
458
reed@google.comac10a2d2010-12-22 21:39:39 +0000459void GrInOrderDrawBuffer::reset() {
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000460 GrAssert(1 == fGeoPoolStateStack.count());
461 this->resetVertexSource();
462 this->resetIndexSource();
reed@google.comac10a2d2010-12-22 21:39:39 +0000463 uint32_t numStates = fStates.count();
464 for (uint32_t i = 0; i < numStates; ++i) {
tomhudson@google.com93813632011-10-27 20:21:16 +0000465 const GrDrawState& dstate = this->accessSavedDrawState(fStates[i]);
466 for (int s = 0; s < GrDrawState::kNumStages; ++s) {
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000467 GrSafeUnref(dstate.getTexture(s));
reed@google.comac10a2d2010-12-22 21:39:39 +0000468 }
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000469 GrSafeUnref(dstate.getRenderTarget());
reed@google.comac10a2d2010-12-22 21:39:39 +0000470 }
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000471 int numDraws = fDraws.count();
472 for (int d = 0; d < numDraws; ++d) {
473 // we always have a VB, but not always an IB
474 GrAssert(NULL != fDraws[d].fVertexBuffer);
475 fDraws[d].fVertexBuffer->unref();
476 GrSafeUnref(fDraws[d].fIndexBuffer);
477 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000478 fDraws.reset();
479 fStates.reset();
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000480
bsalomon@google.com0b335c12011-04-25 19:17:44 +0000481 fClears.reset();
482
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000483 fVertexPool.reset();
484 fIndexPool.reset();
485
reed@google.comac10a2d2010-12-22 21:39:39 +0000486 fClips.reset();
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000487
bsalomon@google.com934c5702012-03-20 21:17:58 +0000488 this->resetDrawTracking();
reed@google.comac10a2d2010-12-22 21:39:39 +0000489}
490
491void GrInOrderDrawBuffer::playback(GrDrawTarget* target) {
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000492 GrAssert(kReserved_GeometrySrcType != this->getGeomSrc().fVertexSrc);
493 GrAssert(kReserved_GeometrySrcType != this->getGeomSrc().fIndexSrc);
bsalomon@google.com3f5a95e2012-03-08 16:41:42 +0000494
reed@google.comac10a2d2010-12-22 21:39:39 +0000495 GrAssert(NULL != target);
496 GrAssert(target != this); // not considered and why?
497
bsalomon@google.com898d9e52011-04-26 13:22:33 +0000498 int numDraws = fDraws.count();
reed@google.comac10a2d2010-12-22 21:39:39 +0000499 if (!numDraws) {
500 return;
501 }
502
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000503 fVertexPool.unlock();
504 fIndexPool.unlock();
reed@google.comac10a2d2010-12-22 21:39:39 +0000505
reed@google.comac10a2d2010-12-22 21:39:39 +0000506 GrDrawTarget::AutoClipRestore acr(target);
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000507 AutoGeometryPush agp(target);
bsalomon@google.coma5d056a2012-03-27 15:59:58 +0000508 GrDrawState* prevDrawState = target->drawState();
509 prevDrawState->ref();
reed@google.comac10a2d2010-12-22 21:39:39 +0000510
bsalomon@google.com6a77cc52011-04-28 17:33:34 +0000511 int currState = ~0;
512 int currClip = ~0;
513 int currClear = 0;
reed@google.comac10a2d2010-12-22 21:39:39 +0000514
bsalomon@google.com898d9e52011-04-26 13:22:33 +0000515 for (int i = 0; i < numDraws; ++i) {
bsalomon@google.com0b335c12011-04-25 19:17:44 +0000516 while (currClear < fClears.count() &&
517 i == fClears[currClear].fBeforeDrawIdx) {
bsalomon@google.com6aa25c32011-04-27 19:55:29 +0000518 target->clear(&fClears[currClear].fRect, fClears[currClear].fColor);
bsalomon@google.com0b335c12011-04-25 19:17:44 +0000519 ++currClear;
520 }
521
reed@google.comac10a2d2010-12-22 21:39:39 +0000522 const Draw& draw = fDraws[i];
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000523 if (draw.fStateChanged) {
reed@google.comac10a2d2010-12-22 21:39:39 +0000524 ++currState;
bsalomon@google.coma5d056a2012-03-27 15:59:58 +0000525 GrDrawState* ds = &GrDrawTarget::accessSavedDrawState(fStates[currState]);
526 target->setDrawState(ds);
reed@google.comac10a2d2010-12-22 21:39:39 +0000527 }
528 if (draw.fClipChanged) {
529 ++currClip;
530 target->setClip(fClips[currClip]);
531 }
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000532
533 target->setVertexSourceToBuffer(draw.fVertexLayout, draw.fVertexBuffer);
534
reed@google.comac10a2d2010-12-22 21:39:39 +0000535 if (draw.fIndexCount) {
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000536 target->setIndexSourceToBuffer(draw.fIndexBuffer);
537 }
538
539 if (draw.fIndexCount) {
540 target->drawIndexed(draw.fPrimitiveType,
reed@google.comac10a2d2010-12-22 21:39:39 +0000541 draw.fStartVertex,
542 draw.fStartIndex,
543 draw.fVertexCount,
544 draw.fIndexCount);
545 } else {
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000546 target->drawNonIndexed(draw.fPrimitiveType,
reed@google.comac10a2d2010-12-22 21:39:39 +0000547 draw.fStartVertex,
548 draw.fVertexCount);
549 }
550 }
bsalomon@google.com0b335c12011-04-25 19:17:44 +0000551 while (currClear < fClears.count()) {
552 GrAssert(fDraws.count() == fClears[currClear].fBeforeDrawIdx);
bsalomon@google.com6aa25c32011-04-27 19:55:29 +0000553 target->clear(&fClears[currClear].fRect, fClears[currClear].fColor);
bsalomon@google.com0b335c12011-04-25 19:17:44 +0000554 ++currClear;
555 }
bsalomon@google.coma5d056a2012-03-27 15:59:58 +0000556 target->setDrawState(prevDrawState);
557 prevDrawState->unref();
reed@google.comac10a2d2010-12-22 21:39:39 +0000558}
559
bsalomon@google.com97805382012-03-13 14:32:07 +0000560void GrInOrderDrawBuffer::setAutoFlushTarget(GrDrawTarget* target) {
561 GrSafeAssign(fAutoFlushTarget, target);
562}
563
564void GrInOrderDrawBuffer::willReserveVertexAndIndexSpace(
565 GrVertexLayout vertexLayout,
566 int vertexCount,
567 int indexCount) {
568 if (NULL != fAutoFlushTarget) {
569 // We use geometryHints() to know whether to flush the draw buffer. We
570 // can't flush if we are inside an unbalanced pushGeometrySource.
571 // Moreover, flushing blows away vertex and index data that was
572 // previously reserved. So if the vertex or index data is pulled from
573 // reserved space and won't be released by this request then we can't
574 // flush.
575 bool insideGeoPush = fGeoPoolStateStack.count() > 1;
576
577 bool unreleasedVertexSpace =
578 !vertexCount &&
579 kReserved_GeometrySrcType == this->getGeomSrc().fVertexSrc;
580
581 bool unreleasedIndexSpace =
582 !indexCount &&
583 kReserved_GeometrySrcType == this->getGeomSrc().fIndexSrc;
584
585 // we don't want to finalize any reserved geom on the target since
586 // we don't know that the client has finished writing to it.
587 bool targetHasReservedGeom =
588 fAutoFlushTarget->hasReservedVerticesOrIndices();
589
590 int vcount = vertexCount;
591 int icount = indexCount;
592
593 if (!insideGeoPush &&
594 !unreleasedVertexSpace &&
595 !unreleasedIndexSpace &&
596 !targetHasReservedGeom &&
597 this->geometryHints(vertexLayout, &vcount, &icount)) {
598
599 this->flushTo(fAutoFlushTarget);
600 }
601 }
602}
603
reed@google.comac10a2d2010-12-22 21:39:39 +0000604bool GrInOrderDrawBuffer::geometryHints(GrVertexLayout vertexLayout,
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000605 int* vertexCount,
606 int* indexCount) const {
607 // we will recommend a flush if the data could fit in a single
608 // preallocated buffer but none are left and it can't fit
609 // in the current buffer (which may not be prealloced).
reed@google.comac10a2d2010-12-22 21:39:39 +0000610 bool flush = false;
611 if (NULL != indexCount) {
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000612 int32_t currIndices = fIndexPool.currentBufferIndices();
613 if (*indexCount > currIndices &&
614 (!fIndexPool.preallocatedBuffersRemaining() &&
615 *indexCount <= fIndexPool.preallocatedBufferIndices())) {
616
617 flush = true;
618 }
619 *indexCount = currIndices;
reed@google.comac10a2d2010-12-22 21:39:39 +0000620 }
621 if (NULL != vertexCount) {
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000622 int32_t currVertices = fVertexPool.currentBufferVertices(vertexLayout);
623 if (*vertexCount > currVertices &&
624 (!fVertexPool.preallocatedBuffersRemaining() &&
625 *vertexCount <= fVertexPool.preallocatedBufferVertices(vertexLayout))) {
reed@google.comac10a2d2010-12-22 21:39:39 +0000626
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000627 flush = true;
reed@google.comac10a2d2010-12-22 21:39:39 +0000628 }
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000629 *vertexCount = currVertices;
reed@google.comac10a2d2010-12-22 21:39:39 +0000630 }
631 return flush;
632}
633
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000634bool GrInOrderDrawBuffer::onReserveVertexSpace(GrVertexLayout vertexLayout,
635 int vertexCount,
636 void** vertices) {
637 GeometryPoolState& poolState = fGeoPoolStateStack.back();
638 GrAssert(vertexCount > 0);
639 GrAssert(NULL != vertices);
640 GrAssert(0 == poolState.fUsedPoolVertexBytes);
641
642 *vertices = fVertexPool.makeSpace(vertexLayout,
643 vertexCount,
644 &poolState.fPoolVertexBuffer,
645 &poolState.fPoolStartVertex);
646 return NULL != *vertices;
647}
648
649bool GrInOrderDrawBuffer::onReserveIndexSpace(int indexCount, void** indices) {
650 GeometryPoolState& poolState = fGeoPoolStateStack.back();
651 GrAssert(indexCount > 0);
652 GrAssert(NULL != indices);
653 GrAssert(0 == poolState.fUsedPoolIndexBytes);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000654
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000655 *indices = fIndexPool.makeSpace(indexCount,
656 &poolState.fPoolIndexBuffer,
657 &poolState.fPoolStartIndex);
658 return NULL != *indices;
reed@google.comac10a2d2010-12-22 21:39:39 +0000659}
660
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000661void GrInOrderDrawBuffer::releaseReservedVertexSpace() {
662 GeometryPoolState& poolState = fGeoPoolStateStack.back();
663 const GeometrySrcState& geoSrc = this->getGeomSrc();
664
665 GrAssert(kReserved_GeometrySrcType == geoSrc.fVertexSrc);
bsalomon@google.com3f5a95e2012-03-08 16:41:42 +0000666
667 // When the caller reserved vertex buffer space we gave it back a pointer
668 // provided by the vertex buffer pool. At each draw we tracked the largest
669 // offset into the pool's pointer that was referenced. Now we return to the
670 // pool any portion at the tail of the allocation that no draw referenced.
671 size_t reservedVertexBytes = VertexSize(geoSrc.fVertexLayout) *
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000672 geoSrc.fVertexCount;
673 fVertexPool.putBack(reservedVertexBytes -
674 poolState.fUsedPoolVertexBytes);
675 poolState.fUsedPoolVertexBytes = 0;
bsalomon@google.com3f5a95e2012-03-08 16:41:42 +0000676 poolState.fPoolVertexBuffer = NULL;
677 poolState.fPoolStartVertex = 0;
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000678}
679
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000680void GrInOrderDrawBuffer::releaseReservedIndexSpace() {
681 GeometryPoolState& poolState = fGeoPoolStateStack.back();
682 const GeometrySrcState& geoSrc = this->getGeomSrc();
683
684 GrAssert(kReserved_GeometrySrcType == geoSrc.fIndexSrc);
bsalomon@google.com3f5a95e2012-03-08 16:41:42 +0000685
686 // Similar to releaseReservedVertexSpace we return any unused portion at
687 // the tail
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000688 size_t reservedIndexBytes = sizeof(uint16_t) * geoSrc.fIndexCount;
689 fIndexPool.putBack(reservedIndexBytes - poolState.fUsedPoolIndexBytes);
690 poolState.fUsedPoolIndexBytes = 0;
bsalomon@google.com3f5a95e2012-03-08 16:41:42 +0000691 poolState.fPoolIndexBuffer = NULL;
692 poolState.fPoolStartIndex = 0;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000693}
694
bsalomon@google.combcdbbe62011-04-12 15:40:00 +0000695void GrInOrderDrawBuffer::onSetVertexSourceToArray(const void* vertexArray,
696 int vertexCount) {
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000697
698 GeometryPoolState& poolState = fGeoPoolStateStack.back();
699 GrAssert(0 == poolState.fUsedPoolVertexBytes);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000700#if GR_DEBUG
701 bool success =
702#endif
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000703 fVertexPool.appendVertices(this->getGeomSrc().fVertexLayout,
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000704 vertexCount,
705 vertexArray,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000706 &poolState.fPoolVertexBuffer,
707 &poolState.fPoolStartVertex);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000708 GR_DEBUGASSERT(success);
709}
710
bsalomon@google.combcdbbe62011-04-12 15:40:00 +0000711void GrInOrderDrawBuffer::onSetIndexSourceToArray(const void* indexArray,
712 int indexCount) {
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000713 GeometryPoolState& poolState = fGeoPoolStateStack.back();
714 GrAssert(0 == poolState.fUsedPoolIndexBytes);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000715#if GR_DEBUG
716 bool success =
717#endif
718 fIndexPool.appendIndices(indexCount,
719 indexArray,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000720 &poolState.fPoolIndexBuffer,
721 &poolState.fPoolStartIndex);
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000722 GR_DEBUGASSERT(success);
reed@google.comac10a2d2010-12-22 21:39:39 +0000723}
724
bsalomon@google.com3f5a95e2012-03-08 16:41:42 +0000725void GrInOrderDrawBuffer::releaseVertexArray() {
726 // When the client provides an array as the vertex source we handled it
727 // by copying their array into reserved space.
728 this->GrInOrderDrawBuffer::releaseReservedVertexSpace();
729}
730
731void GrInOrderDrawBuffer::releaseIndexArray() {
732 // When the client provides an array as the index source we handled it
733 // by copying their array into reserved space.
734 this->GrInOrderDrawBuffer::releaseReservedIndexSpace();
735}
736
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000737void GrInOrderDrawBuffer::geometrySourceWillPush() {
738 GeometryPoolState& poolState = fGeoPoolStateStack.push_back();
739 poolState.fUsedPoolVertexBytes = 0;
740 poolState.fUsedPoolIndexBytes = 0;
bsalomon@google.com934c5702012-03-20 21:17:58 +0000741 this->resetDrawTracking();
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000742#if GR_DEBUG
743 poolState.fPoolVertexBuffer = (GrVertexBuffer*)~0;
744 poolState.fPoolStartVertex = ~0;
745 poolState.fPoolIndexBuffer = (GrIndexBuffer*)~0;
746 poolState.fPoolStartIndex = ~0;
747#endif
748}
749
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000750void GrInOrderDrawBuffer::geometrySourceWillPop(
751 const GeometrySrcState& restoredState) {
752 GrAssert(fGeoPoolStateStack.count() > 1);
753 fGeoPoolStateStack.pop_back();
754 GeometryPoolState& poolState = fGeoPoolStateStack.back();
755 // we have to assume that any slack we had in our vertex/index data
756 // is now unreleasable because data may have been appended later in the
757 // pool.
758 if (kReserved_GeometrySrcType == restoredState.fVertexSrc ||
759 kArray_GeometrySrcType == restoredState.fVertexSrc) {
760 poolState.fUsedPoolVertexBytes =
761 VertexSize(restoredState.fVertexLayout) *
762 restoredState.fVertexCount;
763 }
764 if (kReserved_GeometrySrcType == restoredState.fIndexSrc ||
765 kArray_GeometrySrcType == restoredState.fIndexSrc) {
bsalomon@google.com3f5a95e2012-03-08 16:41:42 +0000766 poolState.fUsedPoolIndexBytes = sizeof(uint16_t) *
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000767 restoredState.fIndexCount;
768 }
bsalomon@google.com934c5702012-03-20 21:17:58 +0000769 this->resetDrawTracking();
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000770}
771
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000772bool GrInOrderDrawBuffer::needsNewState() const {
773 if (fStates.empty()) {
774 return true;
775 } else {
tomhudson@google.com93813632011-10-27 20:21:16 +0000776 const GrDrawState& old = this->accessSavedDrawState(fStates.back());
bsalomon@google.coma5d056a2012-03-27 15:59:58 +0000777 return old != this->getDrawState();
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000778 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000779}
780
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000781void GrInOrderDrawBuffer::pushState() {
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000782 const GrDrawState& drawState = this->getDrawState();
tomhudson@google.com93813632011-10-27 20:21:16 +0000783 for (int s = 0; s < GrDrawState::kNumStages; ++s) {
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000784 GrSafeRef(drawState.getTexture(s));
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000785 }
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000786 GrSafeRef(drawState.getRenderTarget());
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000787 this->saveCurrentDrawState(&fStates.push_back());
788 }
bsalomon@google.comd302f142011-03-03 13:54:13 +0000789
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000790bool GrInOrderDrawBuffer::needsNewClip() const {
bsalomon@google.com8f9cbd62011-12-09 15:55:34 +0000791 if (this->getDrawState().isClipState()) {
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000792 if (fClips.empty() || (fClipSet && fClips.back() != fClip)) {
793 return true;
794 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000795 }
796 return false;
797}
bsalomon@google.comd302f142011-03-03 13:54:13 +0000798
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000799void GrInOrderDrawBuffer::pushClip() {
800 fClips.push_back() = fClip;
801 fClipSet = false;
reed@google.comac10a2d2010-12-22 21:39:39 +0000802}
bsalomon@google.comd302f142011-03-03 13:54:13 +0000803
bsalomon@google.comdea2f8d2011-08-01 15:51:05 +0000804void GrInOrderDrawBuffer::clipWillBeSet(const GrClip& newClip) {
805 INHERITED::clipWillBeSet(newClip);
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000806 fClipSet = true;
807}