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" |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
317 if (!this->recordStateAndShouldDraw(ds, GrGpu::kDrawPath_DrawType, scissorSt
ate, dstCopy)) { | 317 if (!this->recordStateAndShouldDraw(ds, GrGpu::kDrawPath_DrawType, scissorSt
ate, dstCopy)) { |
318 return; | 318 return; |
319 } | 319 } |
320 DrawPath* dp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, DrawPath, (path)); | 320 DrawPath* dp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, DrawPath, (path)); |
321 dp->fStencilSettings = stencilSettings; | 321 dp->fStencilSettings = stencilSettings; |
322 this->recordTraceMarkersIfNecessary(); | 322 this->recordTraceMarkersIfNecessary(); |
323 } | 323 } |
324 | 324 |
325 void GrInOrderDrawBuffer::onDrawPaths(const GrDrawState& ds, | 325 void GrInOrderDrawBuffer::onDrawPaths(const GrDrawState& ds, |
326 const GrPathRange* pathRange, | 326 const GrPathRange* pathRange, |
327 const uint32_t indices[], | 327 const void* indices, |
| 328 PathIndexType indexType, |
| 329 const float transformValues[], |
| 330 PathTransformType transformType, |
328 int count, | 331 int count, |
329 const float transforms[], | |
330 PathTransformType transformsType, | |
331 const GrClipMaskManager::ScissorState& sci
ssorState, | 332 const GrClipMaskManager::ScissorState& sci
ssorState, |
332 const GrStencilSettings& stencilSettings, | 333 const GrStencilSettings& stencilSettings, |
333 const GrDeviceCoordTexture* dstCopy) { | 334 const GrDeviceCoordTexture* dstCopy) { |
334 SkASSERT(pathRange); | 335 SkASSERT(pathRange); |
335 SkASSERT(indices); | 336 SkASSERT(indices); |
336 SkASSERT(transforms); | 337 SkASSERT(transformValues); |
337 | 338 |
338 if (!this->recordStateAndShouldDraw(ds, GrGpu::kDrawPath_DrawType, scissorSt
ate, dstCopy)) { | 339 if (!this->recordStateAndShouldDraw(ds, GrGpu::kDrawPath_DrawType, scissorSt
ate, dstCopy)) { |
339 return; | 340 return; |
340 } | 341 } |
341 | 342 |
342 uint32_t* savedIndices = fPathIndexBuffer.append(count, indices); | 343 int indexBytes = GrPathRange::PathIndexSizeInBytes(indexType); |
343 float* savedTransforms = fPathTransformBuffer.append(count * | 344 if (int misalign = fPathIndexBuffer.count() % indexBytes) { |
344 GrPathRendering::PathTransformSize(transformsTy
pe), transforms); | 345 // Add padding to the index buffer so the indices are aligned properly. |
| 346 fPathIndexBuffer.append(indexBytes - misalign); |
| 347 } |
| 348 |
| 349 char* savedIndices = fPathIndexBuffer.append(count * indexBytes, |
| 350 reinterpret_cast<const char*>(i
ndices)); |
| 351 float* savedTransforms = fPathTransformBuffer.append( |
| 352 count * GrPathRendering::PathTransformSize(tran
sformType), |
| 353 transformValues); |
345 | 354 |
346 if (kDrawPaths_Cmd == strip_trace_bit(fCmdBuffer.back().fType)) { | 355 if (kDrawPaths_Cmd == strip_trace_bit(fCmdBuffer.back().fType)) { |
347 // The previous command was also DrawPaths. Try to collapse this call in
to the one | 356 // The previous command was also DrawPaths. Try to collapse this call in
to the one |
348 // before. Note that stencilling all the paths at once, then covering, m
ay not be | 357 // before. Note that stencilling all the paths at once, then covering, m
ay not be |
349 // equivalent to two separate draw calls if there is overlap. Blending w
on't work, | 358 // equivalent to two separate draw calls if there is overlap. Blending w
on't work, |
350 // and the combined calls may also cancel each other's winding numbers i
n some | 359 // and the combined calls may also cancel each other's winding numbers i
n some |
351 // places. For now the winding numbers are only an issue if the fill is
even/odd, | 360 // places. For now the winding numbers are only an issue if the fill is
even/odd, |
352 // because DrawPaths is currently only used for glyphs, and glyphs in th
e same | 361 // because DrawPaths is currently only used for glyphs, and glyphs in th
e same |
353 // font tend to all wind in the same direction. | 362 // font tend to all wind in the same direction. |
354 DrawPaths* previous = static_cast<DrawPaths*>(&fCmdBuffer.back()); | 363 DrawPaths* previous = static_cast<DrawPaths*>(&fCmdBuffer.back()); |
355 if (pathRange == previous->pathRange() && | 364 if (pathRange == previous->pathRange() && |
356 transformsType == previous->fTransformsType && | 365 indexType == previous->fIndexType && |
| 366 transformType == previous->fTransformType && |
357 stencilSettings == previous->fStencilSettings && | 367 stencilSettings == previous->fStencilSettings && |
358 path_fill_type_is_winding(stencilSettings) && | 368 path_fill_type_is_winding(stencilSettings) && |
359 !ds.willBlendWithDst()) { | 369 !ds.willBlendWithDst()) { |
360 // Fold this DrawPaths call into the one previous. | 370 // Fold this DrawPaths call into the one previous. |
361 previous->fCount += count; | 371 previous->fCount += count; |
362 return; | 372 return; |
363 } | 373 } |
364 } | 374 } |
365 | 375 |
366 DrawPaths* dp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, DrawPaths, (pathRange))
; | 376 DrawPaths* dp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, DrawPaths, (pathRange))
; |
367 dp->fIndicesLocation = savedIndices - fPathIndexBuffer.begin(); | 377 dp->fIndicesLocation = savedIndices - fPathIndexBuffer.begin(); |
| 378 dp->fIndexType = indexType; |
| 379 dp->fTransformsLocation = savedTransforms - fPathTransformBuffer.begin(); |
| 380 dp->fTransformType = transformType; |
368 dp->fCount = count; | 381 dp->fCount = count; |
369 dp->fTransformsLocation = savedTransforms - fPathTransformBuffer.begin(); | |
370 dp->fTransformsType = transformsType; | |
371 dp->fStencilSettings = stencilSettings; | 382 dp->fStencilSettings = stencilSettings; |
372 | 383 |
373 this->recordTraceMarkersIfNecessary(); | 384 this->recordTraceMarkersIfNecessary(); |
374 } | 385 } |
375 | 386 |
376 void GrInOrderDrawBuffer::onClear(const SkIRect* rect, GrColor color, | 387 void GrInOrderDrawBuffer::onClear(const SkIRect* rect, GrColor color, |
377 bool canIgnoreRect, GrRenderTarget* renderTarg
et) { | 388 bool canIgnoreRect, GrRenderTarget* renderTarg
et) { |
378 SkASSERT(renderTarget); | 389 SkASSERT(renderTarget); |
379 SkIRect r; | 390 SkIRect r; |
380 if (NULL == rect) { | 391 if (NULL == rect) { |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
515 void GrInOrderDrawBuffer::DrawPath::execute(GrInOrderDrawBuffer* buf, | 526 void GrInOrderDrawBuffer::DrawPath::execute(GrInOrderDrawBuffer* buf, |
516 const GrOptDrawState* optState) { | 527 const GrOptDrawState* optState) { |
517 SkASSERT(optState); | 528 SkASSERT(optState); |
518 buf->fDstGpu->drawPath(*optState, this->path(), fStencilSettings); | 529 buf->fDstGpu->drawPath(*optState, this->path(), fStencilSettings); |
519 } | 530 } |
520 | 531 |
521 void GrInOrderDrawBuffer::DrawPaths::execute(GrInOrderDrawBuffer* buf, | 532 void GrInOrderDrawBuffer::DrawPaths::execute(GrInOrderDrawBuffer* buf, |
522 const GrOptDrawState* optState) { | 533 const GrOptDrawState* optState) { |
523 SkASSERT(optState); | 534 SkASSERT(optState); |
524 buf->fDstGpu->drawPaths(*optState, this->pathRange(), | 535 buf->fDstGpu->drawPaths(*optState, this->pathRange(), |
525 &buf->fPathIndexBuffer[fIndicesLocation], fCount, | 536 &buf->fPathIndexBuffer[fIndicesLocation], fIndexType
, |
526 &buf->fPathTransformBuffer[fTransformsLocation], fTr
ansformsType, | 537 &buf->fPathTransformBuffer[fTransformsLocation], fTr
ansformType, |
527 fStencilSettings); | 538 fCount, fStencilSettings); |
528 } | 539 } |
529 | 540 |
530 void GrInOrderDrawBuffer::SetState::execute(GrInOrderDrawBuffer*, const GrOptDra
wState*) {} | 541 void GrInOrderDrawBuffer::SetState::execute(GrInOrderDrawBuffer*, const GrOptDra
wState*) {} |
531 | 542 |
532 void GrInOrderDrawBuffer::Clear::execute(GrInOrderDrawBuffer* buf, const GrOptDr
awState*) { | 543 void GrInOrderDrawBuffer::Clear::execute(GrInOrderDrawBuffer* buf, const GrOptDr
awState*) { |
533 if (GrColor_ILLEGAL == fColor) { | 544 if (GrColor_ILLEGAL == fColor) { |
534 buf->fDstGpu->discard(this->renderTarget()); | 545 buf->fDstGpu->discard(this->renderTarget()); |
535 } else { | 546 } else { |
536 buf->fDstGpu->clear(&fRect, fColor, fCanIgnoreRect, this->renderTarget()
); | 547 buf->fDstGpu->clear(&fRect, fColor, fCanIgnoreRect, this->renderTarget()
); |
537 } | 548 } |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
747 | 758 |
748 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { | 759 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { |
749 SkASSERT(!fCmdBuffer.empty()); | 760 SkASSERT(!fCmdBuffer.empty()); |
750 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); | 761 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); |
751 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); | 762 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); |
752 if (activeTraceMarkers.count() > 0) { | 763 if (activeTraceMarkers.count() > 0) { |
753 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); | 764 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); |
754 fGpuCmdMarkers.push_back(activeTraceMarkers); | 765 fGpuCmdMarkers.push_back(activeTraceMarkers); |
755 } | 766 } |
756 } | 767 } |
OLD | NEW |