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

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

Issue 845103005: GrBatchPrototype (Closed) Base URL: https://skia.googlesource.com/skia.git@lc2
Patch Set: update devrect 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"
11 #include "GrDrawTargetCaps.h" 11 #include "GrDrawTargetCaps.h"
12 #include "GrGpu.h" 12 #include "GrGpu.h"
13 #include "GrTemplates.h" 13 #include "GrTemplates.h"
14 #include "GrFontCache.h" 14 #include "GrFontCache.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, vertexPool, indexPool) 20 : INHERITED(gpu, vertexPool, indexPool)
21 , fCmdBuffer(kCmdBufferInitialSizeInBytes) 21 , fCmdBuffer(kCmdBufferInitialSizeInBytes)
22 , fPrevState(NULL) 22 , fPrevState(NULL)
23 , fDrawID(0) { 23 , fDrawID(0)
24 , fBatchBuffer(gpu, vertexPool, indexPool) {
24 25
25 SkASSERT(vertexPool); 26 SkASSERT(vertexPool);
26 SkASSERT(indexPool); 27 SkASSERT(indexPool);
27 28
28 fPathIndexBuffer.setReserve(kPathIdxBufferMinReserve); 29 fPathIndexBuffer.setReserve(kPathIdxBufferMinReserve);
29 fPathTransformBuffer.setReserve(kPathXformBufferMinReserve); 30 fPathTransformBuffer.setReserve(kPathXformBufferMinReserve);
30 } 31 }
31 32
32 GrInOrderDrawBuffer::~GrInOrderDrawBuffer() { 33 GrInOrderDrawBuffer::~GrInOrderDrawBuffer() {
33 this->reset(); 34 this->reset();
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 draw->fInfo.adjustInstanceCount(-instancesConcated); 260 draw->fInfo.adjustInstanceCount(-instancesConcated);
260 } else { 261 } else {
261 return; 262 return;
262 } 263 }
263 } else { 264 } else {
264 draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info)); 265 draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info));
265 } 266 }
266 this->recordTraceMarkersIfNecessary(); 267 this->recordTraceMarkersIfNecessary();
267 } 268 }
268 269
270 void GrInOrderDrawBuffer::onBatchDraw(GrBatch* batch,
271 const GrDrawState& ds,
272 GrPrimitiveType type,
273 const GrScissorState& scissorState,
274 const GrDeviceCoordTexture* dstCopy) {
275 if (!this->recordStateAndShouldDraw(batch, ds, GrGpu::PrimTypeToDrawType(typ e), scissorState,
276 dstCopy)) {
277 return;
278 }
279
280 // Check if there is a Batch Draw we can batch with
281 if (kBatchDraw != strip_trace_bit(fCmdBuffer.back().fType)) {
282 GrNEW_APPEND_TO_RECORDER(fCmdBuffer, BatchDraw, (batch));
283 return;
284 }
285
286 BatchDraw* draw = static_cast<BatchDraw*>(&fCmdBuffer.back());
287 if (draw->fBatch->combineIfPossible(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 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 440
415 441
416 CmdBuffer::Iter iter(fCmdBuffer); 442 CmdBuffer::Iter iter(fCmdBuffer);
417 443
418 int currCmdMarker = 0; 444 int currCmdMarker = 0;
419 445
420 // Updated every time we find a set state cmd to reflect the current state i n the playback 446 // Updated every time we find a set state cmd to reflect the current state i n the playback
421 // stream. 447 // stream.
422 SetState* currentState = NULL; 448 SetState* currentState = NULL;
423 449
450 // TODO to prevent flushing the batch buffer too much, we only flush when wa sBatch && !isBatch
451 // In the long term we can delete this and just flush once at the end of all geometry generation
452 bool wasBatch = false;
453
424 while (iter.next()) { 454 while (iter.next()) {
425 GrGpuTraceMarker newMarker("", -1); 455 GrGpuTraceMarker newMarker("", -1);
426 SkString traceString; 456 SkString traceString;
427 if (cmd_has_trace_marker(iter->fType)) { 457 if (cmd_has_trace_marker(iter->fType)) {
428 traceString = fGpuCmdMarkers[currCmdMarker].toString(); 458 traceString = fGpuCmdMarkers[currCmdMarker].toString();
429 newMarker.fMarker = traceString.c_str(); 459 newMarker.fMarker = traceString.c_str();
430 this->getGpu()->addGpuTraceMarker(&newMarker); 460 this->getGpu()->addGpuTraceMarker(&newMarker);
431 ++currCmdMarker; 461 ++currCmdMarker;
432 } 462 }
433 463
434 if (kSetState_Cmd == strip_trace_bit(iter->fType)) { 464 if (kSetState_Cmd == strip_trace_bit(iter->fType)) {
435 SetState* ss = reinterpret_cast<SetState*>(iter.get()); 465 SetState* ss = reinterpret_cast<SetState*>(iter.get());
436 466
437 this->getGpu()->buildProgramDesc(&ss->fDesc, *ss->fPrimitiveProcesso r, ss->fState, 467 // TODO sometimes we have a prim proc, othertimes we have a GrBatch. Eventually we will
438 ss->fState.descInfo(), ss->fState.d rawType(), 468 // only have GrBatch and we can delete this
439 ss->fBatchTracker); 469 if (ss->fPrimitiveProcessor) {
440 currentState = ss; 470 // TODO see note above, this gets deleted once everyone uses bat ch drawing
471 if (wasBatch) {
472 wasBatch = false;
473 fBatchBuffer.flush();
474 }
441 475
476 this->getGpu()->buildProgramDesc(&ss->fDesc, *ss->fPrimitiveProc essor, ss->fState,
477 ss->fState.descInfo(), ss->fSta te.drawType(),
478 ss->fBatchTracker);
479 } else {
480 wasBatch = true;
481 }
482 currentState = ss;
442 } else { 483 } else {
443 iter->execute(this, currentState); 484 iter->execute(this, currentState);
444 } 485 }
445 486
446 if (cmd_has_trace_marker(iter->fType)) { 487 if (cmd_has_trace_marker(iter->fType)) {
447 this->getGpu()->removeGpuTraceMarker(&newMarker); 488 this->getGpu()->removeGpuTraceMarker(&newMarker);
448 } 489 }
449 } 490 }
450 491
492 // TODO see note above, one last catch
493 if (wasBatch) {
494 fBatchBuffer.flush();
495 }
496
451 SkASSERT(fGpuCmdMarkers.count() == currCmdMarker); 497 SkASSERT(fGpuCmdMarkers.count() == currCmdMarker);
452 ++fDrawID; 498 ++fDrawID;
453 } 499 }
454 500
455 void GrInOrderDrawBuffer::Draw::execute(GrInOrderDrawBuffer* buf, const SetState * state) { 501 void GrInOrderDrawBuffer::Draw::execute(GrInOrderDrawBuffer* buf, const SetState * state) {
456 SkASSERT(state); 502 SkASSERT(state);
457 DrawArgs args(state->fPrimitiveProcessor.get(), &state->fState, &state->fDes c, 503 DrawArgs args(state->fPrimitiveProcessor.get(), &state->fState, &state->fDes c,
458 &state->fBatchTracker); 504 &state->fBatchTracker);
459 buf->getGpu()->draw(args, fInfo); 505 buf->getGpu()->draw(args, fInfo);
460 } 506 }
(...skipping 19 matching lines...) Expand all
480 void GrInOrderDrawBuffer::DrawPaths::execute(GrInOrderDrawBuffer* buf, const Set State* state) { 526 void GrInOrderDrawBuffer::DrawPaths::execute(GrInOrderDrawBuffer* buf, const Set State* state) {
481 SkASSERT(state); 527 SkASSERT(state);
482 DrawArgs args(state->fPrimitiveProcessor.get(), &state->fState, &state->fDes c, 528 DrawArgs args(state->fPrimitiveProcessor.get(), &state->fState, &state->fDes c,
483 &state->fBatchTracker); 529 &state->fBatchTracker);
484 buf->getGpu()->drawPaths(args, this->pathRange(), 530 buf->getGpu()->drawPaths(args, this->pathRange(),
485 &buf->fPathIndexBuffer[fIndicesLocation], fIndexType , 531 &buf->fPathIndexBuffer[fIndicesLocation], fIndexType ,
486 &buf->fPathTransformBuffer[fTransformsLocation], fTr ansformType, 532 &buf->fPathTransformBuffer[fTransformsLocation], fTr ansformType,
487 fCount, fStencilSettings); 533 fCount, fStencilSettings);
488 } 534 }
489 535
536 void GrInOrderDrawBuffer::BatchDraw::execute(GrInOrderDrawBuffer* buf, const Set State* state) {
537 SkASSERT(state);
538 fBatch->generateGeometry(buf->getBatchBuffer(), &state->fState);
539
540 }
541
490 void GrInOrderDrawBuffer::SetState::execute(GrInOrderDrawBuffer*, const SetState *) {} 542 void GrInOrderDrawBuffer::SetState::execute(GrInOrderDrawBuffer*, const SetState *) {}
491 543
492 void GrInOrderDrawBuffer::Clear::execute(GrInOrderDrawBuffer* buf, const SetStat e*) { 544 void GrInOrderDrawBuffer::Clear::execute(GrInOrderDrawBuffer* buf, const SetStat e*) {
493 if (GrColor_ILLEGAL == fColor) { 545 if (GrColor_ILLEGAL == fColor) {
494 buf->getGpu()->discard(this->renderTarget()); 546 buf->getGpu()->discard(this->renderTarget());
495 } else { 547 } else {
496 buf->getGpu()->clear(&fRect, fColor, fCanIgnoreRect, this->renderTarget( )); 548 buf->getGpu()->clear(&fRect, fColor, fCanIgnoreRect, this->renderTarget( ));
497 } 549 }
498 } 550 }
499 551
(...skipping 28 matching lines...) Expand all
528 (ds, primProc, *this->getGpu()->caps (), scissor, 580 (ds, primProc, *this->getGpu()->caps (), scissor,
529 dstCopy, drawType)); 581 dstCopy, drawType));
530 if (ss->fState.mustSkip()) { 582 if (ss->fState.mustSkip()) {
531 fCmdBuffer.pop_back(); 583 fCmdBuffer.pop_back();
532 return false; 584 return false;
533 } 585 }
534 586
535 ss->fPrimitiveProcessor->initBatchTracker(&ss->fBatchTracker, 587 ss->fPrimitiveProcessor->initBatchTracker(&ss->fBatchTracker,
536 ss->fState.getInitBatchTracker()); 588 ss->fState.getInitBatchTracker());
537 589
538 if (fPrevState && 590 if (fPrevState && fPrevState->fPrimitiveProcessor.get() &&
539 fPrevState->fPrimitiveProcessor->canMakeEqual(fPrevState->fBatchTracker, 591 fPrevState->fPrimitiveProcessor->canMakeEqual(fPrevState->fBatchTracker,
540 *ss->fPrimitiveProcessor, 592 *ss->fPrimitiveProcessor,
541 ss->fBatchTracker) && 593 ss->fBatchTracker) &&
542 fPrevState->fState.isEqual(ss->fState)) { 594 fPrevState->fState.isEqual(ss->fState)) {
543 fCmdBuffer.pop_back(); 595 fCmdBuffer.pop_back();
544 } else { 596 } else {
545 fPrevState = ss; 597 fPrevState = ss;
546 this->recordTraceMarkersIfNecessary(); 598 this->recordTraceMarkersIfNecessary();
547 } 599 }
548 return true; 600 return true;
549 } 601 }
550 602
603 bool GrInOrderDrawBuffer::recordStateAndShouldDraw(GrBatch* batch,
604 const GrDrawState& ds,
605 GrGpu::DrawType drawType,
606 const GrScissorState& scissor ,
607 const GrDeviceCoordTexture* d stCopy) {
608 // TODO this gets much simpler when we have batches everywhere.
609 // If the previous command is also a set state, then we check to see if it h as a Batch. If so,
610 // and we can make the two batches equal, and we can combine the states, the n we make them equal
611 SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState,
612 (batch, ds, *this->getGpu()->caps(), scissor,
613 dstCopy, drawType));
614 if (ss->fState.mustSkip()) {
615 fCmdBuffer.pop_back();
616 return false;
617 }
618
619 batch->initBatchTracker(ss->fState.getInitBatchTracker());
620
621 if (fPrevState && !fPrevState->fPrimitiveProcessor.get() &&
622 fPrevState->fState.isEqual(ss->fState)) {
623 fCmdBuffer.pop_back();
624 } else {
625 fPrevState = ss;
626 this->recordTraceMarkersIfNecessary();
627 }
628 return true;
629 }
630
551 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { 631 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() {
552 SkASSERT(!fCmdBuffer.empty()); 632 SkASSERT(!fCmdBuffer.empty());
553 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); 633 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType));
554 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); 634 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers();
555 if (activeTraceMarkers.count() > 0) { 635 if (activeTraceMarkers.count() > 0) {
556 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); 636 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType);
557 fGpuCmdMarkers.push_back(activeTraceMarkers); 637 fGpuCmdMarkers.push_back(activeTraceMarkers);
558 } 638 }
559 } 639 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698