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 "GrDefaultGeoProcFactory.h" | 10 #include "GrDefaultGeoProcFactory.h" |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
259 draw->fInfo.adjustInstanceCount(-instancesConcated); | 259 draw->fInfo.adjustInstanceCount(-instancesConcated); |
260 } else { | 260 } else { |
261 return; | 261 return; |
262 } | 262 } |
263 } else { | 263 } else { |
264 draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info)); | 264 draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info)); |
265 } | 265 } |
266 this->recordTraceMarkersIfNecessary(); | 266 this->recordTraceMarkersIfNecessary(); |
267 } | 267 } |
268 | 268 |
269 void GrInOrderDrawBuffer::onBatchDraw(GrBatch* batch, | |
270 const GrDrawState& ds, | |
271 GrPrimitiveType type, | |
272 const GrScissorState& scissorState, | |
273 const GrDeviceCoordTexture* dstCopy) { | |
274 if (!this->recordStateAndShouldDraw(batch, ds, GrGpu::PrimTypeToDrawType(typ e), scissorState, | |
275 dstCopy)) { | |
276 return; | |
277 } | |
278 | |
279 // Check if there is a Batch Draw we can batch with | |
280 if (kBatchDraw != strip_trace_bit(fCmdBuffer.back().fType)) { | |
281 GrNEW_APPEND_TO_RECORDER(fCmdBuffer, BatchDraw, (batch)); | |
282 return; | |
283 } | |
284 | |
285 BatchDraw* draw = static_cast<BatchDraw*>(&fCmdBuffer.back()); | |
286 if (draw->fBatch->canMakeEqual(*batch)) { | |
bsalomon
2015/01/20 16:14:03
probably want to rename these... canMerge? canComb
| |
287 draw->fBatch->makeEqual(batch); | |
288 return; | |
289 } else { | |
290 GrNEW_APPEND_TO_RECORDER(fCmdBuffer, BatchDraw, (batch)); | |
291 } | |
292 this->recordTraceMarkersIfNecessary(); | |
293 } | |
294 | |
269 void GrInOrderDrawBuffer::onStencilPath(const GrDrawState& ds, | 295 void GrInOrderDrawBuffer::onStencilPath(const GrDrawState& ds, |
270 const GrPathProcessor* pathProc, | 296 const GrPathProcessor* pathProc, |
271 const GrPath* path, | 297 const GrPath* path, |
272 const GrScissorState& scissorState, | 298 const GrScissorState& scissorState, |
273 const GrStencilSettings& stencilSettings ) { | 299 const GrStencilSettings& stencilSettings ) { |
274 StencilPath* sp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, StencilPath, | 300 StencilPath* sp = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, StencilPath, |
275 (path, ds.getRenderTarget())); | 301 (path, ds.getRenderTarget())); |
276 sp->fScissor = scissorState; | 302 sp->fScissor = scissorState; |
277 sp->fUseHWAA = ds.isHWAntialias(); | 303 sp->fUseHWAA = ds.isHWAntialias(); |
278 sp->fViewMatrix = pathProc->viewMatrix(); | 304 sp->fViewMatrix = pathProc->viewMatrix(); |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
427 if (cmd_has_trace_marker(iter->fType)) { | 453 if (cmd_has_trace_marker(iter->fType)) { |
428 traceString = fGpuCmdMarkers[currCmdMarker].toString(); | 454 traceString = fGpuCmdMarkers[currCmdMarker].toString(); |
429 newMarker.fMarker = traceString.c_str(); | 455 newMarker.fMarker = traceString.c_str(); |
430 this->getGpu()->addGpuTraceMarker(&newMarker); | 456 this->getGpu()->addGpuTraceMarker(&newMarker); |
431 ++currCmdMarker; | 457 ++currCmdMarker; |
432 } | 458 } |
433 | 459 |
434 if (kSetState_Cmd == strip_trace_bit(iter->fType)) { | 460 if (kSetState_Cmd == strip_trace_bit(iter->fType)) { |
435 SetState* ss = reinterpret_cast<SetState*>(iter.get()); | 461 SetState* ss = reinterpret_cast<SetState*>(iter.get()); |
436 currentOptState = &ss->fState; | 462 currentOptState = &ss->fState; |
437 currentOptState->finalize(this->getGpu()); | 463 // Batch draws will finalize later. TODO remove this when we use ba tch everywhere |
464 if (currentOptState->getPrimitiveProcessor()) { | |
465 currentOptState->finalize(this->getGpu()); | |
466 } | |
438 } else { | 467 } else { |
439 iter->execute(this, currentOptState); | 468 iter->execute(this, currentOptState); |
440 } | 469 } |
441 | 470 |
442 if (cmd_has_trace_marker(iter->fType)) { | 471 if (cmd_has_trace_marker(iter->fType)) { |
443 this->getGpu()->removeGpuTraceMarker(&newMarker); | 472 this->getGpu()->removeGpuTraceMarker(&newMarker); |
444 } | 473 } |
445 } | 474 } |
446 | 475 |
447 SkASSERT(fGpuCmdMarkers.count() == currCmdMarker); | 476 SkASSERT(fGpuCmdMarkers.count() == currCmdMarker); |
(...skipping 24 matching lines...) Expand all Loading... | |
472 | 501 |
473 void GrInOrderDrawBuffer::DrawPaths::execute(GrInOrderDrawBuffer* buf, | 502 void GrInOrderDrawBuffer::DrawPaths::execute(GrInOrderDrawBuffer* buf, |
474 const GrOptDrawState* optState) { | 503 const GrOptDrawState* optState) { |
475 SkASSERT(optState); | 504 SkASSERT(optState); |
476 buf->getGpu()->drawPaths(*optState, this->pathRange(), | 505 buf->getGpu()->drawPaths(*optState, this->pathRange(), |
477 &buf->fPathIndexBuffer[fIndicesLocation], fIndexType , | 506 &buf->fPathIndexBuffer[fIndicesLocation], fIndexType , |
478 &buf->fPathTransformBuffer[fTransformsLocation], fTr ansformType, | 507 &buf->fPathTransformBuffer[fTransformsLocation], fTr ansformType, |
479 fCount, fStencilSettings); | 508 fCount, fStencilSettings); |
480 } | 509 } |
481 | 510 |
511 void GrInOrderDrawBuffer::BatchDraw::execute(GrInOrderDrawBuffer* buf, | |
512 const GrOptDrawState* optState) { | |
513 SkASSERT(optState); | |
514 fBatch->generateGeometry(buf->getGpu(), buf->getVertexAllocPool(), buf->getI ndexAllocPool(), | |
515 const_cast<GrOptDrawState*>(optState)); | |
516 fBatch->draw(buf->getGpu(), const_cast<GrOptDrawState*>(optState)); | |
517 } | |
518 | |
482 void GrInOrderDrawBuffer::SetState::execute(GrInOrderDrawBuffer*, const GrOptDra wState*) {} | 519 void GrInOrderDrawBuffer::SetState::execute(GrInOrderDrawBuffer*, const GrOptDra wState*) {} |
483 | 520 |
484 void GrInOrderDrawBuffer::Clear::execute(GrInOrderDrawBuffer* buf, const GrOptDr awState*) { | 521 void GrInOrderDrawBuffer::Clear::execute(GrInOrderDrawBuffer* buf, const GrOptDr awState*) { |
485 if (GrColor_ILLEGAL == fColor) { | 522 if (GrColor_ILLEGAL == fColor) { |
486 buf->getGpu()->discard(this->renderTarget()); | 523 buf->getGpu()->discard(this->renderTarget()); |
487 } else { | 524 } else { |
488 buf->getGpu()->clear(&fRect, fColor, fCanIgnoreRect, this->renderTarget( )); | 525 buf->getGpu()->clear(&fRect, fColor, fCanIgnoreRect, this->renderTarget( )); |
489 } | 526 } |
490 } | 527 } |
491 | 528 |
(...skipping 21 matching lines...) Expand all Loading... | |
513 } | 550 } |
514 | 551 |
515 bool GrInOrderDrawBuffer::recordStateAndShouldDraw(const GrDrawState& ds, | 552 bool GrInOrderDrawBuffer::recordStateAndShouldDraw(const GrDrawState& ds, |
516 const GrPrimitiveProcessor* p rimProc, | 553 const GrPrimitiveProcessor* p rimProc, |
517 GrGpu::DrawType drawType, | 554 GrGpu::DrawType drawType, |
518 const GrScissorState& scissor , | 555 const GrScissorState& scissor , |
519 const GrDeviceCoordTexture* d stCopy) { | 556 const GrDeviceCoordTexture* d stCopy) { |
520 SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState, | 557 SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState, |
521 (ds, primProc, *this->getGpu()->caps (), scissor, | 558 (ds, primProc, *this->getGpu()->caps (), scissor, |
522 dstCopy, drawType)); | 559 dstCopy, drawType)); |
560 return recordStateAndShouldDraw(ss); | |
561 } | |
562 | |
563 bool GrInOrderDrawBuffer::recordStateAndShouldDraw(GrBatch* batch, | |
564 const GrDrawState& ds, | |
565 GrGpu::DrawType drawType, | |
566 const GrScissorState& scissor , | |
567 const GrDeviceCoordTexture* d stCopy) { | |
568 // TODO this gets much simpler when we have batches everywhere. | |
569 // If the previous command is also a set state, then we check to see if it h as a Batch. If so, | |
570 // and we can make the two batches equal, and we can combine the states, the n we make them equal | |
571 SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState, | |
572 (batch, ds, *this->getGpu()->caps(), scissor, | |
573 dstCopy, drawType)); | |
574 return recordStateAndShouldDraw(ss); | |
575 } | |
576 | |
577 bool GrInOrderDrawBuffer::recordStateAndShouldDraw(SetState* ss) { | |
523 if (ss->fState.mustSkip()) { | 578 if (ss->fState.mustSkip()) { |
524 fCmdBuffer.pop_back(); | 579 fCmdBuffer.pop_back(); |
525 return false; | 580 return false; |
526 } | 581 } |
527 if (fPrevState && fPrevState->combineIfPossible(ss->fState)) { | 582 if (fPrevState && fPrevState->combineIfPossible(ss->fState)) { |
528 fCmdBuffer.pop_back(); | 583 fCmdBuffer.pop_back(); |
529 } else { | 584 } else { |
530 fPrevState = &ss->fState; | 585 fPrevState = &ss->fState; |
531 this->recordTraceMarkersIfNecessary(); | 586 this->recordTraceMarkersIfNecessary(); |
532 } | 587 } |
533 return true; | 588 return true; |
534 } | 589 } |
535 | 590 |
536 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { | 591 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { |
537 SkASSERT(!fCmdBuffer.empty()); | 592 SkASSERT(!fCmdBuffer.empty()); |
538 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); | 593 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); |
539 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); | 594 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); |
540 if (activeTraceMarkers.count() > 0) { | 595 if (activeTraceMarkers.count() > 0) { |
541 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); | 596 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); |
542 fGpuCmdMarkers.push_back(activeTraceMarkers); | 597 fGpuCmdMarkers.push_back(activeTraceMarkers); |
543 } | 598 } |
544 } | 599 } |
OLD | NEW |