Chromium Code Reviews| 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 |