Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(898)

Side by Side Diff: src/gpu/GrInOrderDrawBuffer.cpp

Issue 845103005: GrBatchPrototype (Closed) Base URL: https://skia.googlesource.com/skia.git@lc2
Patch Set: cleanup Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698