OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "GrInOrderDrawBuffer.h" | 8 #include "GrInOrderDrawBuffer.h" |
9 | 9 |
10 #include "GrBufferAllocPool.h" | 10 #include "GrBufferAllocPool.h" |
11 #include "GrDrawTargetCaps.h" | 11 #include "GrDrawTargetCaps.h" |
12 #include "GrTextStrike.h" | 12 #include "GrTextStrike.h" |
13 #include "GrGpu.h" | 13 #include "GrGpu.h" |
14 #include "GrTemplates.h" | 14 #include "GrTemplates.h" |
15 #include "GrTexture.h" | 15 #include "GrTexture.h" |
16 | 16 |
17 GrInOrderDrawBuffer::GrInOrderDrawBuffer(GrGpu* gpu, | 17 GrInOrderDrawBuffer::GrInOrderDrawBuffer(GrGpu* gpu, |
18 GrVertexBufferAllocPool* vertexPool, | 18 GrVertexBufferAllocPool* vertexPool, |
19 GrIndexBufferAllocPool* indexPool) | 19 GrIndexBufferAllocPool* indexPool) |
20 : INHERITED(gpu->getContext()) | 20 : INHERITED(gpu->getContext()) |
21 , fCmdBuffer(kCmdBufferInitialSizeInBytes) | 21 , fCmdBuffer(kCmdBufferInitialSizeInBytes) |
22 , fLastState(NULL) | 22 , fLastState(NULL) |
23 , fLastClip(NULL) | |
24 , fDstGpu(gpu) | 23 , fDstGpu(gpu) |
25 , fClipSet(true) | |
26 , fClipProxyState(kUnknown_ClipProxyState) | |
27 , fVertexPool(*vertexPool) | 24 , fVertexPool(*vertexPool) |
28 , fIndexPool(*indexPool) | 25 , fIndexPool(*indexPool) |
29 , fFlushing(false) | 26 , fFlushing(false) |
30 , fDrawID(0) { | 27 , fDrawID(0) { |
31 | 28 |
32 fDstGpu->ref(); | 29 fDstGpu->ref(); |
33 fCaps.reset(SkRef(fDstGpu->caps())); | 30 fCaps.reset(SkRef(fDstGpu->caps())); |
34 | 31 |
35 SkASSERT(vertexPool); | 32 SkASSERT(vertexPool); |
36 SkASSERT(indexPool); | 33 SkASSERT(indexPool); |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 vertColor = (GrColor*) ((intptr_t) vertColor + vstride); | 166 vertColor = (GrColor*) ((intptr_t) vertColor + vstride); |
170 } | 167 } |
171 | 168 |
172 this->setIndexSourceToBuffer(this->getContext()->getQuadIndexBuffer()); | 169 this->setIndexSourceToBuffer(this->getContext()->getQuadIndexBuffer()); |
173 this->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6, &devBounds); | 170 this->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6, &devBounds); |
174 | 171 |
175 // to ensure that stashing the drawState ptr is valid | 172 // to ensure that stashing the drawState ptr is valid |
176 SkASSERT(this->drawState() == drawState); | 173 SkASSERT(this->drawState() == drawState); |
177 } | 174 } |
178 | 175 |
179 bool GrInOrderDrawBuffer::quickInsideClip(const SkRect& devBounds) { | 176 int GrInOrderDrawBuffer::concatInstancedDraw(const DrawInfo& info, |
180 if (!this->getDrawState().isClipState()) { | 177 const GrClipMaskManager::ScissorSta
te& scissorState) { |
181 return true; | |
182 } | |
183 if (kUnknown_ClipProxyState == fClipProxyState) { | |
184 SkIRect rect; | |
185 bool iior; | |
186 this->getClip()->getConservativeBounds(this->getDrawState().getRenderTar
get(), &rect, &iior); | |
187 if (iior) { | |
188 // The clip is a rect. We will remember that in fProxyClip. It is co
mmon for an edge (or | |
189 // all edges) of the clip to be at the edge of the RT. However, we g
et that clipping for | |
190 // free via the viewport. We don't want to think that clipping must
be enabled in this | |
191 // case. So we extend the clip outward from the edge to avoid these
false negatives. | |
192 fClipProxyState = kValid_ClipProxyState; | |
193 fClipProxy = SkRect::Make(rect); | |
194 | |
195 if (fClipProxy.fLeft <= 0) { | |
196 fClipProxy.fLeft = SK_ScalarMin; | |
197 } | |
198 if (fClipProxy.fTop <= 0) { | |
199 fClipProxy.fTop = SK_ScalarMin; | |
200 } | |
201 if (fClipProxy.fRight >= this->getDrawState().getRenderTarget()->wid
th()) { | |
202 fClipProxy.fRight = SK_ScalarMax; | |
203 } | |
204 if (fClipProxy.fBottom >= this->getDrawState().getRenderTarget()->he
ight()) { | |
205 fClipProxy.fBottom = SK_ScalarMax; | |
206 } | |
207 } else { | |
208 fClipProxyState = kInvalid_ClipProxyState; | |
209 } | |
210 } | |
211 if (kValid_ClipProxyState == fClipProxyState) { | |
212 return fClipProxy.contains(devBounds); | |
213 } | |
214 SkPoint originOffset = {SkIntToScalar(this->getClip()->fOrigin.fX), | |
215 SkIntToScalar(this->getClip()->fOrigin.fY)}; | |
216 SkRect clipSpaceBounds = devBounds; | |
217 clipSpaceBounds.offset(originOffset); | |
218 return this->getClip()->fClipStack->quickContains(clipSpaceBounds); | |
219 } | |
220 | |
221 int GrInOrderDrawBuffer::concatInstancedDraw(const DrawInfo& info) { | |
222 SkASSERT(!fCmdBuffer.empty()); | 178 SkASSERT(!fCmdBuffer.empty()); |
223 SkASSERT(info.isInstanced()); | 179 SkASSERT(info.isInstanced()); |
224 | 180 |
225 const GeometrySrcState& geomSrc = this->getGeomSrc(); | 181 const GeometrySrcState& geomSrc = this->getGeomSrc(); |
226 const GrDrawState& drawState = this->getDrawState(); | 182 const GrDrawState& drawState = this->getDrawState(); |
227 | 183 |
228 // we only attempt to concat the case when reserved verts are used with a cl
ient-specified index | 184 // we only attempt to concat the case when reserved verts are used with a cl
ient-specified index |
229 // buffer. To make this work with client-specified VBs we'd need to know if
the VB was updated | 185 // buffer. To make this work with client-specified VBs we'd need to know if
the VB was updated |
230 // between draws. | 186 // between draws. |
231 if (kReserved_GeometrySrcType != geomSrc.fVertexSrc || | 187 if (kReserved_GeometrySrcType != geomSrc.fVertexSrc || |
232 kBuffer_GeometrySrcType != geomSrc.fIndexSrc) { | 188 kBuffer_GeometrySrcType != geomSrc.fIndexSrc) { |
233 return 0; | 189 return 0; |
234 } | 190 } |
235 // Check if there is a draw info that is compatible that uses the same VB fr
om the pool and | 191 // Check if there is a draw info that is compatible that uses the same VB fr
om the pool and |
236 // the same IB | 192 // the same IB |
237 if (kDraw_Cmd != strip_trace_bit(fCmdBuffer.back().fType)) { | 193 if (kDraw_Cmd != strip_trace_bit(fCmdBuffer.back().fType)) { |
238 return 0; | 194 return 0; |
239 } | 195 } |
240 | 196 |
241 Draw* draw = static_cast<Draw*>(&fCmdBuffer.back()); | 197 Draw* draw = static_cast<Draw*>(&fCmdBuffer.back()); |
242 GeometryPoolState& poolState = fGeoPoolStateStack.back(); | 198 GeometryPoolState& poolState = fGeoPoolStateStack.back(); |
243 const GrVertexBuffer* vertexBuffer = poolState.fPoolVertexBuffer; | 199 const GrVertexBuffer* vertexBuffer = poolState.fPoolVertexBuffer; |
244 | 200 |
245 if (!draw->fInfo.isInstanced() || | 201 if (!draw->fInfo.isInstanced() || |
246 draw->fInfo.verticesPerInstance() != info.verticesPerInstance() || | 202 draw->fInfo.verticesPerInstance() != info.verticesPerInstance() || |
247 draw->fInfo.indicesPerInstance() != info.indicesPerInstance() || | 203 draw->fInfo.indicesPerInstance() != info.indicesPerInstance() || |
248 draw->vertexBuffer() != vertexBuffer || | 204 draw->vertexBuffer() != vertexBuffer || |
249 draw->indexBuffer() != geomSrc.fIndexBuffer) { | 205 draw->indexBuffer() != geomSrc.fIndexBuffer || |
| 206 draw->fScissorState != scissorState) { |
250 return 0; | 207 return 0; |
251 } | 208 } |
252 // info does not yet account for the offset from the start of the pool's VB
while the previous | 209 // info does not yet account for the offset from the start of the pool's VB
while the previous |
253 // draw record does. | 210 // draw record does. |
254 int adjustedStartVertex = poolState.fPoolStartVertex + info.startVertex(); | 211 int adjustedStartVertex = poolState.fPoolStartVertex + info.startVertex(); |
255 if (draw->fInfo.startVertex() + draw->fInfo.vertexCount() != adjustedStartVe
rtex) { | 212 if (draw->fInfo.startVertex() + draw->fInfo.vertexCount() != adjustedStartVe
rtex) { |
256 return 0; | 213 return 0; |
257 } | 214 } |
258 | 215 |
259 SkASSERT(poolState.fPoolStartVertex == draw->fInfo.startVertex() + draw->fIn
fo.vertexCount()); | 216 SkASSERT(poolState.fPoolStartVertex == draw->fInfo.startVertex() + draw->fIn
fo.vertexCount()); |
(...skipping 16 matching lines...) Expand all Loading... |
276 fGpuCmdMarkers.back().addSet(this->getActiveTraceMarkers()); | 233 fGpuCmdMarkers.back().addSet(this->getActiveTraceMarkers()); |
277 } else { | 234 } else { |
278 fGpuCmdMarkers.push_back(this->getActiveTraceMarkers()); | 235 fGpuCmdMarkers.push_back(this->getActiveTraceMarkers()); |
279 draw->fType = add_trace_bit(draw->fType); | 236 draw->fType = add_trace_bit(draw->fType); |
280 } | 237 } |
281 } | 238 } |
282 | 239 |
283 return instancesToConcat; | 240 return instancesToConcat; |
284 } | 241 } |
285 | 242 |
286 class AutoClipReenable { | 243 void GrInOrderDrawBuffer::onDraw(const DrawInfo& info, |
287 public: | 244 const GrClipMaskManager::ScissorState& scissorS
tate) { |
288 AutoClipReenable() : fDrawState(NULL) {} | |
289 ~AutoClipReenable() { | |
290 if (fDrawState) { | |
291 fDrawState->enableState(GrDrawState::kClip_StateBit); | |
292 } | |
293 } | |
294 void set(GrDrawState* drawState) { | |
295 if (drawState->isClipState()) { | |
296 fDrawState = drawState; | |
297 drawState->disableState(GrDrawState::kClip_StateBit); | |
298 } | |
299 } | |
300 private: | |
301 GrDrawState* fDrawState; | |
302 }; | |
303 | |
304 void GrInOrderDrawBuffer::onDraw(const DrawInfo& info) { | |
305 | 245 |
306 GeometryPoolState& poolState = fGeoPoolStateStack.back(); | 246 GeometryPoolState& poolState = fGeoPoolStateStack.back(); |
307 const GrDrawState& drawState = this->getDrawState(); | 247 const GrDrawState& drawState = this->getDrawState(); |
308 AutoClipReenable acr; | |
309 | 248 |
310 if (drawState.isClipState() && | |
311 info.getDevBounds() && | |
312 this->quickInsideClip(*info.getDevBounds())) { | |
313 acr.set(this->drawState()); | |
314 } | |
315 | |
316 this->recordClipIfNecessary(); | |
317 this->recordStateIfNecessary(); | 249 this->recordStateIfNecessary(); |
318 | 250 |
319 const GrVertexBuffer* vb; | 251 const GrVertexBuffer* vb; |
320 if (kBuffer_GeometrySrcType == this->getGeomSrc().fVertexSrc) { | 252 if (kBuffer_GeometrySrcType == this->getGeomSrc().fVertexSrc) { |
321 vb = this->getGeomSrc().fVertexBuffer; | 253 vb = this->getGeomSrc().fVertexBuffer; |
322 } else { | 254 } else { |
323 vb = poolState.fPoolVertexBuffer; | 255 vb = poolState.fPoolVertexBuffer; |
324 } | 256 } |
325 | 257 |
326 const GrIndexBuffer* ib = NULL; | 258 const GrIndexBuffer* ib = NULL; |
327 if (info.isIndexed()) { | 259 if (info.isIndexed()) { |
328 if (kBuffer_GeometrySrcType == this->getGeomSrc().fIndexSrc) { | 260 if (kBuffer_GeometrySrcType == this->getGeomSrc().fIndexSrc) { |
329 ib = this->getGeomSrc().fIndexBuffer; | 261 ib = this->getGeomSrc().fIndexBuffer; |
330 } else { | 262 } else { |
331 ib = poolState.fPoolIndexBuffer; | 263 ib = poolState.fPoolIndexBuffer; |
332 } | 264 } |
333 } | 265 } |
334 | 266 |
335 Draw* draw; | 267 Draw* draw; |
336 if (info.isInstanced()) { | 268 if (info.isInstanced()) { |
337 int instancesConcated = this->concatInstancedDraw(info); | 269 int instancesConcated = this->concatInstancedDraw(info, scissorState); |
338 if (info.instanceCount() > instancesConcated) { | 270 if (info.instanceCount() > instancesConcated) { |
339 draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info, vb, ib)); | 271 draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info, scissorStat
e, vb, ib)); |
340 draw->fInfo.adjustInstanceCount(-instancesConcated); | 272 draw->fInfo.adjustInstanceCount(-instancesConcated); |
341 } else { | 273 } else { |
342 return; | 274 return; |
343 } | 275 } |
344 } else { | 276 } else { |
345 draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info, vb, ib)); | 277 draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info, scissorState, v
b, ib)); |
346 } | 278 } |
347 this->recordTraceMarkersIfNecessary(); | 279 this->recordTraceMarkersIfNecessary(); |
348 | 280 |
349 // Adjust the starting vertex and index when we are using reserved or array
sources to | 281 // Adjust the starting vertex and index when we are using reserved or array
sources to |
350 // compensate for the fact that the data was inserted into a larger vb/ib ow
ned by the pool. | 282 // compensate for the fact that the data was inserted into a larger vb/ib ow
ned by the pool. |
351 if (kBuffer_GeometrySrcType != this->getGeomSrc().fVertexSrc) { | 283 if (kBuffer_GeometrySrcType != this->getGeomSrc().fVertexSrc) { |
352 size_t bytes = (info.vertexCount() + info.startVertex()) * drawState.get
VertexStride(); | 284 size_t bytes = (info.vertexCount() + info.startVertex()) * drawState.get
VertexStride(); |
353 poolState.fUsedPoolVertexBytes = SkTMax(poolState.fUsedPoolVertexBytes,
bytes); | 285 poolState.fUsedPoolVertexBytes = SkTMax(poolState.fUsedPoolVertexBytes,
bytes); |
354 draw->fInfo.adjustStartVertex(poolState.fPoolStartVertex); | 286 draw->fInfo.adjustStartVertex(poolState.fPoolStartVertex); |
355 } | 287 } |
356 | 288 |
357 if (info.isIndexed() && kBuffer_GeometrySrcType != this->getGeomSrc().fIndex
Src) { | 289 if (info.isIndexed() && kBuffer_GeometrySrcType != this->getGeomSrc().fIndex
Src) { |
358 size_t bytes = (info.indexCount() + info.startIndex()) * sizeof(uint16_t
); | 290 size_t bytes = (info.indexCount() + info.startIndex()) * sizeof(uint16_t
); |
359 poolState.fUsedPoolIndexBytes = SkTMax(poolState.fUsedPoolIndexBytes, by
tes); | 291 poolState.fUsedPoolIndexBytes = SkTMax(poolState.fUsedPoolIndexBytes, by
tes); |
360 draw->fInfo.adjustStartIndex(poolState.fPoolStartIndex); | 292 draw->fInfo.adjustStartIndex(poolState.fPoolStartIndex); |
361 } | 293 } |
362 } | 294 } |
363 | 295 |
364 void GrInOrderDrawBuffer::onStencilPath(const GrPath* path, GrPathRendering::Fil
lType fill) { | 296 void GrInOrderDrawBuffer::onStencilPath(const GrPath* path, |
365 this->recordClipIfNecessary(); | 297 const GrClipMaskManager::ScissorState& s
cissorState, |
| 298 const GrStencilSettings& stencilSettings
) { |
366 // Only compare the subset of GrDrawState relevant to path stenciling? | 299 // Only compare the subset of GrDrawState relevant to path stenciling? |
367 this->recordStateIfNecessary(); | 300 this->recordStateIfNecessary(); |
368 StencilPath* sp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, StencilPath, (path)); | 301 StencilPath* sp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, StencilPath, (path)); |
369 sp->fFill = fill; | 302 sp->fScissorState = scissorState; |
| 303 sp->fStencilSettings = stencilSettings; |
370 this->recordTraceMarkersIfNecessary(); | 304 this->recordTraceMarkersIfNecessary(); |
371 } | 305 } |
372 | 306 |
373 void GrInOrderDrawBuffer::onDrawPath(const GrPath* path, | 307 void GrInOrderDrawBuffer::onDrawPath(const GrPath* path, |
374 GrPathRendering::FillType fill, | 308 const GrClipMaskManager::ScissorState& scis
sorState, |
| 309 const GrStencilSettings& stencilSettings, |
375 const GrDeviceCoordTexture* dstCopy) { | 310 const GrDeviceCoordTexture* dstCopy) { |
376 this->recordClipIfNecessary(); | |
377 // TODO: Only compare the subset of GrDrawState relevant to path covering? | 311 // TODO: Only compare the subset of GrDrawState relevant to path covering? |
378 this->recordStateIfNecessary(); | 312 this->recordStateIfNecessary(); |
379 DrawPath* dp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, DrawPath, (path)); | 313 DrawPath* dp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, DrawPath, (path)); |
380 dp->fFill = fill; | |
381 if (dstCopy) { | 314 if (dstCopy) { |
382 dp->fDstCopy = *dstCopy; | 315 dp->fDstCopy = *dstCopy; |
383 } | 316 } |
| 317 dp->fScissorState = scissorState; |
| 318 dp->fStencilSettings = stencilSettings; |
384 this->recordTraceMarkersIfNecessary(); | 319 this->recordTraceMarkersIfNecessary(); |
385 } | 320 } |
386 | 321 |
387 void GrInOrderDrawBuffer::onDrawPaths(const GrPathRange* pathRange, | 322 void GrInOrderDrawBuffer::onDrawPaths(const GrPathRange* pathRange, |
388 const uint32_t indices[], int count, | 323 const uint32_t indices[], |
389 const float transforms[], PathTransformTyp
e transformsType, | 324 int count, |
390 GrPathRendering::FillType fill, | 325 const float transforms[], |
| 326 PathTransformType transformsType, |
| 327 const GrClipMaskManager::ScissorState& sci
ssorState, |
| 328 const GrStencilSettings& stencilSettings, |
391 const GrDeviceCoordTexture* dstCopy) { | 329 const GrDeviceCoordTexture* dstCopy) { |
392 SkASSERT(pathRange); | 330 SkASSERT(pathRange); |
393 SkASSERT(indices); | 331 SkASSERT(indices); |
394 SkASSERT(transforms); | 332 SkASSERT(transforms); |
395 | 333 |
396 this->recordClipIfNecessary(); | |
397 this->recordStateIfNecessary(); | 334 this->recordStateIfNecessary(); |
398 | 335 |
399 int sizeOfIndices = sizeof(uint32_t) * count; | 336 int sizeOfIndices = sizeof(uint32_t) * count; |
400 int sizeOfTransforms = sizeof(float) * count * | 337 int sizeOfTransforms = sizeof(float) * count * |
401 GrPathRendering::PathTransformSize(transformsType); | 338 GrPathRendering::PathTransformSize(transformsType); |
402 | 339 |
403 DrawPaths* dp = GrNEW_APPEND_WITH_DATA_TO_RECORDER(fCmdBuffer, DrawPaths, (p
athRange), | 340 DrawPaths* dp = GrNEW_APPEND_WITH_DATA_TO_RECORDER(fCmdBuffer, DrawPaths, (p
athRange), |
404 sizeOfIndices + sizeOfTra
nsforms); | 341 sizeOfIndices + sizeOfTra
nsforms); |
405 memcpy(dp->indices(), indices, sizeOfIndices); | 342 memcpy(dp->indices(), indices, sizeOfIndices); |
406 dp->fCount = count; | 343 dp->fCount = count; |
407 memcpy(dp->transforms(), transforms, sizeOfTransforms); | 344 memcpy(dp->transforms(), transforms, sizeOfTransforms); |
408 dp->fTransformsType = transformsType; | 345 dp->fTransformsType = transformsType; |
409 dp->fFill = fill; | 346 dp->fScissorState = scissorState; |
| 347 dp->fStencilSettings = stencilSettings; |
410 if (dstCopy) { | 348 if (dstCopy) { |
411 dp->fDstCopy = *dstCopy; | 349 dp->fDstCopy = *dstCopy; |
412 } | 350 } |
413 | 351 |
414 this->recordTraceMarkersIfNecessary(); | 352 this->recordTraceMarkersIfNecessary(); |
415 } | 353 } |
416 | 354 |
417 void GrInOrderDrawBuffer::onClear(const SkIRect* rect, GrColor color, | 355 void GrInOrderDrawBuffer::onClear(const SkIRect* rect, GrColor color, |
418 bool canIgnoreRect, GrRenderTarget* renderTarg
et) { | 356 bool canIgnoreRect, GrRenderTarget* renderTarg
et) { |
419 SkIRect r; | 357 SkIRect r; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 this->recordTraceMarkersIfNecessary(); | 397 this->recordTraceMarkersIfNecessary(); |
460 } | 398 } |
461 | 399 |
462 void GrInOrderDrawBuffer::reset() { | 400 void GrInOrderDrawBuffer::reset() { |
463 SkASSERT(1 == fGeoPoolStateStack.count()); | 401 SkASSERT(1 == fGeoPoolStateStack.count()); |
464 this->resetVertexSource(); | 402 this->resetVertexSource(); |
465 this->resetIndexSource(); | 403 this->resetIndexSource(); |
466 | 404 |
467 fCmdBuffer.reset(); | 405 fCmdBuffer.reset(); |
468 fLastState = NULL; | 406 fLastState = NULL; |
469 fLastClip = NULL; | |
470 fVertexPool.reset(); | 407 fVertexPool.reset(); |
471 fIndexPool.reset(); | 408 fIndexPool.reset(); |
472 fGpuCmdMarkers.reset(); | 409 fGpuCmdMarkers.reset(); |
473 fClipSet = true; | |
474 } | 410 } |
475 | 411 |
476 void GrInOrderDrawBuffer::flush() { | 412 void GrInOrderDrawBuffer::flush() { |
477 if (fFlushing) { | 413 if (fFlushing) { |
478 return; | 414 return; |
479 } | 415 } |
480 | 416 |
481 this->getContext()->getFontCache()->updateTextures(); | 417 this->getContext()->getFontCache()->updateTextures(); |
482 | 418 |
483 SkASSERT(kReserved_GeometrySrcType != this->getGeomSrc().fVertexSrc); | 419 SkASSERT(kReserved_GeometrySrcType != this->getGeomSrc().fVertexSrc); |
484 SkASSERT(kReserved_GeometrySrcType != this->getGeomSrc().fIndexSrc); | 420 SkASSERT(kReserved_GeometrySrcType != this->getGeomSrc().fIndexSrc); |
485 | 421 |
486 if (fCmdBuffer.empty()) { | 422 if (fCmdBuffer.empty()) { |
487 return; | 423 return; |
488 } | 424 } |
489 | 425 |
490 GrAutoTRestore<bool> flushRestore(&fFlushing); | 426 GrAutoTRestore<bool> flushRestore(&fFlushing); |
491 fFlushing = true; | 427 fFlushing = true; |
492 | 428 |
493 fVertexPool.unmap(); | 429 fVertexPool.unmap(); |
494 fIndexPool.unmap(); | 430 fIndexPool.unmap(); |
495 | 431 |
496 GrDrawTarget::AutoClipRestore acr(fDstGpu); | |
497 AutoGeometryAndStatePush agasp(fDstGpu, kPreserve_ASRInit); | |
498 | |
499 GrDrawState* prevDrawState = SkRef(fDstGpu->drawState()); | 432 GrDrawState* prevDrawState = SkRef(fDstGpu->drawState()); |
500 | 433 |
501 CmdBuffer::Iter iter(fCmdBuffer); | 434 CmdBuffer::Iter iter(fCmdBuffer); |
502 | 435 |
503 int currCmdMarker = 0; | 436 int currCmdMarker = 0; |
504 fDstGpu->saveActiveTraceMarkers(); | 437 fDstGpu->saveActiveTraceMarkers(); |
505 | 438 |
506 while (iter.next()) { | 439 while (iter.next()) { |
507 GrGpuTraceMarker newMarker("", -1); | 440 GrGpuTraceMarker newMarker("", -1); |
508 SkString traceString; | 441 SkString traceString; |
(...skipping 24 matching lines...) Expand all Loading... |
533 prevDrawState->unref(); | 466 prevDrawState->unref(); |
534 this->reset(); | 467 this->reset(); |
535 ++fDrawID; | 468 ++fDrawID; |
536 } | 469 } |
537 | 470 |
538 void GrInOrderDrawBuffer::Draw::execute(GrClipTarget* gpu) { | 471 void GrInOrderDrawBuffer::Draw::execute(GrClipTarget* gpu) { |
539 gpu->setVertexSourceToBuffer(this->vertexBuffer()); | 472 gpu->setVertexSourceToBuffer(this->vertexBuffer()); |
540 if (fInfo.isIndexed()) { | 473 if (fInfo.isIndexed()) { |
541 gpu->setIndexSourceToBuffer(this->indexBuffer()); | 474 gpu->setIndexSourceToBuffer(this->indexBuffer()); |
542 } | 475 } |
543 gpu->executeDraw(fInfo); | 476 gpu->executeDraw(fInfo, fScissorState); |
544 } | 477 } |
545 | 478 |
546 void GrInOrderDrawBuffer::StencilPath::execute(GrClipTarget* gpu) { | 479 void GrInOrderDrawBuffer::StencilPath::execute(GrClipTarget* gpu) { |
547 gpu->stencilPath(this->path(), fFill); | 480 gpu->executeStencilPath(this->path(), fScissorState, fStencilSettings); |
548 } | 481 } |
549 | 482 |
550 void GrInOrderDrawBuffer::DrawPath::execute(GrClipTarget* gpu) { | 483 void GrInOrderDrawBuffer::DrawPath::execute(GrClipTarget* gpu) { |
551 gpu->executeDrawPath(this->path(), fFill, fDstCopy.texture() ? &fDstCopy : N
ULL); | 484 gpu->executeDrawPath(this->path(), fScissorState, fStencilSettings, |
| 485 fDstCopy.texture() ? &fDstCopy : NULL); |
552 } | 486 } |
553 | 487 |
554 void GrInOrderDrawBuffer::DrawPaths::execute(GrClipTarget* gpu) { | 488 void GrInOrderDrawBuffer::DrawPaths::execute(GrClipTarget* gpu) { |
555 gpu->executeDrawPaths(this->pathRange(), this->indices(), fCount, this->tran
sforms(), | 489 gpu->executeDrawPaths(this->pathRange(), this->indices(), fCount, this->tran
sforms(), |
556 fTransformsType, fFill, fDstCopy.texture() ? &fDstCopy
: NULL); | 490 fTransformsType, fScissorState, fStencilSettings, |
| 491 fDstCopy.texture() ? &fDstCopy : NULL); |
557 } | 492 } |
558 | 493 |
559 void GrInOrderDrawBuffer::SetState::execute(GrClipTarget* gpu) { | 494 void GrInOrderDrawBuffer::SetState::execute(GrClipTarget* gpu) { |
560 gpu->setDrawState(&fState); | 495 gpu->setDrawState(&fState); |
561 } | 496 } |
562 | 497 |
563 void GrInOrderDrawBuffer::SetClip::execute(GrClipTarget* gpu) { | |
564 // Our fClipData is referenced directly, so we must remain alive for the ent
ire | |
565 // duration of the flush (after which the gpu's previous clip is restored). | |
566 gpu->setClip(&fClipData); | |
567 } | |
568 | |
569 void GrInOrderDrawBuffer::Clear::execute(GrClipTarget* gpu) { | 498 void GrInOrderDrawBuffer::Clear::execute(GrClipTarget* gpu) { |
570 if (GrColor_ILLEGAL == fColor) { | 499 if (GrColor_ILLEGAL == fColor) { |
571 gpu->discard(this->renderTarget()); | 500 gpu->discard(this->renderTarget()); |
572 } else { | 501 } else { |
573 gpu->clear(&fRect, fColor, fCanIgnoreRect, this->renderTarget()); | 502 gpu->clear(&fRect, fColor, fCanIgnoreRect, this->renderTarget()); |
574 } | 503 } |
575 } | 504 } |
576 | 505 |
577 void GrInOrderDrawBuffer::ClearStencilClip::execute(GrClipTarget* gpu) { | 506 void GrInOrderDrawBuffer::ClearStencilClip::execute(GrClipTarget* gpu) { |
578 gpu->clearStencilClip(fRect, fInsideClip, this->renderTarget()); | 507 gpu->clearStencilClip(fRect, fInsideClip, this->renderTarget()); |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
791 // So here we just destruct the previous state and reinit with a new
copy of curr. | 720 // So here we just destruct the previous state and reinit with a new
copy of curr. |
792 // Note that this goes away when we move GrIODB over to taking optim
ized snapshots | 721 // Note that this goes away when we move GrIODB over to taking optim
ized snapshots |
793 // of draw states. | 722 // of draw states. |
794 fLastState->~GrDrawState(); | 723 fLastState->~GrDrawState(); |
795 SkNEW_PLACEMENT_ARGS(fLastState, GrDrawState, (curr)); | 724 SkNEW_PLACEMENT_ARGS(fLastState, GrDrawState, (curr)); |
796 this->convertDrawStateToPendingExec(fLastState); | 725 this->convertDrawStateToPendingExec(fLastState); |
797 break; | 726 break; |
798 } | 727 } |
799 } | 728 } |
800 | 729 |
801 void GrInOrderDrawBuffer::recordClipIfNecessary() { | |
802 if (this->getDrawState().isClipState() && | |
803 fClipSet && | |
804 (!fLastClip || *fLastClip != *this->getClip())) { | |
805 fLastClip = &GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetClip, (this->getCli
p()))->fClipData; | |
806 this->recordTraceMarkersIfNecessary(); | |
807 fClipSet = false; | |
808 } | |
809 } | |
810 | |
811 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { | 730 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { |
812 SkASSERT(!fCmdBuffer.empty()); | 731 SkASSERT(!fCmdBuffer.empty()); |
813 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); | 732 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); |
814 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); | 733 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); |
815 if (activeTraceMarkers.count() > 0) { | 734 if (activeTraceMarkers.count() > 0) { |
816 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); | 735 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); |
817 fGpuCmdMarkers.push_back(activeTraceMarkers); | 736 fGpuCmdMarkers.push_back(activeTraceMarkers); |
818 } | 737 } |
819 } | 738 } |
820 | |
821 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { | |
822 INHERITED::clipWillBeSet(newClipData); | |
823 fClipSet = true; | |
824 fClipProxyState = kUnknown_ClipProxyState; | |
825 } | |
OLD | NEW |