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

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, 10 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 , fBatchTarget(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 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 } 204 }
204 // Check if there is a draw info that is compatible that uses the same VB fr om the pool and 205 // Check if there is a draw info that is compatible that uses the same VB fr om the pool and
205 // the same IB 206 // the same IB
206 if (kDraw_Cmd != strip_trace_bit(fCmdBuffer.back().fType)) { 207 if (kDraw_Cmd != strip_trace_bit(fCmdBuffer.back().fType)) {
207 return 0; 208 return 0;
208 } 209 }
209 210
210 Draw* draw = static_cast<Draw*>(&fCmdBuffer.back()); 211 Draw* draw = static_cast<Draw*>(&fCmdBuffer.back());
211 212
212 if (!draw->fInfo.isInstanced() || 213 if (!draw->fInfo.isInstanced() ||
214 draw->fInfo.primitiveType() != info.primitiveType() ||
213 draw->fInfo.verticesPerInstance() != info.verticesPerInstance() || 215 draw->fInfo.verticesPerInstance() != info.verticesPerInstance() ||
214 draw->fInfo.indicesPerInstance() != info.indicesPerInstance() || 216 draw->fInfo.indicesPerInstance() != info.indicesPerInstance() ||
215 draw->fInfo.vertexBuffer() != info.vertexBuffer() || 217 draw->fInfo.vertexBuffer() != info.vertexBuffer() ||
216 draw->fInfo.indexBuffer() != geomSrc.fIndexBuffer) { 218 draw->fInfo.indexBuffer() != geomSrc.fIndexBuffer) {
217 return 0; 219 return 0;
218 } 220 }
219 if (draw->fInfo.startVertex() + draw->fInfo.vertexCount() != info.startVerte x()) { 221 if (draw->fInfo.startVertex() + draw->fInfo.vertexCount() != info.startVerte x()) {
220 return 0; 222 return 0;
221 } 223 }
222 224
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 draw->fInfo.adjustInstanceCount(-instancesConcated); 261 draw->fInfo.adjustInstanceCount(-instancesConcated);
260 } else { 262 } else {
261 return; 263 return;
262 } 264 }
263 } else { 265 } else {
264 draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info)); 266 draw = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, Draw, (info));
265 } 267 }
266 this->recordTraceMarkersIfNecessary(); 268 this->recordTraceMarkersIfNecessary();
267 } 269 }
268 270
271 void GrInOrderDrawBuffer::onDrawBatch(GrBatch* batch,
272 const GrPipelineBuilder& pipelineBuilder,
273 GrPrimitiveType type,
274 const GrScissorState& scissorState,
275 const GrDeviceCoordTexture* dstCopy) {
276 if (!this->recordStateAndShouldDraw(batch, pipelineBuilder, scissorState, ds tCopy)) {
277 return;
278 }
279
280 // Check if there is a Batch Draw we can batch with
281 if (kDrawBatch_Cmd != strip_trace_bit(fCmdBuffer.back().fType)) {
282 GrNEW_APPEND_TO_RECORDER(fCmdBuffer, DrawBatch, (batch));
283 return;
284 }
285
286 DrawBatch* draw = static_cast<DrawBatch*>(&fCmdBuffer.back());
287 if (draw->fBatch->combineIfPossible(batch)) {
288 return;
289 } else {
290 GrNEW_APPEND_TO_RECORDER(fCmdBuffer, DrawBatch, (batch));
291 }
292 this->recordTraceMarkersIfNecessary();
293 }
294
269 void GrInOrderDrawBuffer::onStencilPath(const GrPipelineBuilder& pipelineBuilder , 295 void GrInOrderDrawBuffer::onStencilPath(const GrPipelineBuilder& pipelineBuilder ,
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, pipelineBuilder.getRenderT arget())); 301 (path, pipelineBuilder.getRenderT arget()));
276 sp->fScissor = scissorState; 302 sp->fScissor = scissorState;
277 sp->fUseHWAA = pipelineBuilder.isHWAntialias(); 303 sp->fUseHWAA = pipelineBuilder.isHWAntialias();
278 sp->fViewMatrix = pathProc->viewMatrix(); 304 sp->fViewMatrix = pathProc->viewMatrix();
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 reset_data_buffer(&fPathIndexBuffer, kPathIdxBufferMinReserve); 429 reset_data_buffer(&fPathIndexBuffer, kPathIdxBufferMinReserve);
404 reset_data_buffer(&fPathTransformBuffer, kPathXformBufferMinReserve); 430 reset_data_buffer(&fPathTransformBuffer, kPathXformBufferMinReserve);
405 fGpuCmdMarkers.reset(); 431 fGpuCmdMarkers.reset();
406 } 432 }
407 433
408 void GrInOrderDrawBuffer::onFlush() { 434 void GrInOrderDrawBuffer::onFlush() {
409 if (fCmdBuffer.empty()) { 435 if (fCmdBuffer.empty()) {
410 return; 436 return;
411 } 437 }
412 438
413
414 CmdBuffer::Iter iter(fCmdBuffer); 439 CmdBuffer::Iter iter(fCmdBuffer);
415 440
416 int currCmdMarker = 0; 441 int currCmdMarker = 0;
417 442
418 // Updated every time we find a set state cmd to reflect the current state i n the playback 443 // Updated every time we find a set state cmd to reflect the current state i n the playback
419 // stream. 444 // stream.
420 SetState* currentState = NULL; 445 SetState* currentState = NULL;
421 446
447 // TODO to prevent flushing the batch buffer too much, we only flush when wa sBatch && !isBatch
448 // In the long term we can delete this and just flush once at the end of all geometry generation
449 bool wasBatch = false;
450
422 while (iter.next()) { 451 while (iter.next()) {
423 GrGpuTraceMarker newMarker("", -1); 452 GrGpuTraceMarker newMarker("", -1);
424 SkString traceString; 453 SkString traceString;
425 if (cmd_has_trace_marker(iter->fType)) { 454 if (cmd_has_trace_marker(iter->fType)) {
426 traceString = fGpuCmdMarkers[currCmdMarker].toString(); 455 traceString = fGpuCmdMarkers[currCmdMarker].toString();
427 newMarker.fMarker = traceString.c_str(); 456 newMarker.fMarker = traceString.c_str();
428 this->getGpu()->addGpuTraceMarker(&newMarker); 457 this->getGpu()->addGpuTraceMarker(&newMarker);
429 ++currCmdMarker; 458 ++currCmdMarker;
430 } 459 }
431 460
432 if (kSetState_Cmd == strip_trace_bit(iter->fType)) { 461 bool isSetState = kSetState_Cmd == strip_trace_bit(iter->fType);
462
463 if (!isSetState && kDrawBatch_Cmd != strip_trace_bit(iter->fType)) {
464 // TODO see note above, this gets deleted once everyone uses batch d rawing
465 if (wasBatch) {
466 wasBatch = false;
467 fBatchTarget.flush();
468 }
469 }
470
471 if (isSetState) {
433 SetState* ss = reinterpret_cast<SetState*>(iter.get()); 472 SetState* ss = reinterpret_cast<SetState*>(iter.get());
434 473
435 this->getGpu()->buildProgramDesc(&ss->fDesc, *ss->fPrimitiveProcesso r, ss->fPipeline, 474 // TODO sometimes we have a prim proc, othertimes we have a GrBatch. Eventually we will
436 ss->fPipeline.descInfo(), ss->fBatc hTracker); 475 // only have GrBatch and we can delete this
476 if (ss->fPrimitiveProcessor) {
477 this->getGpu()->buildProgramDesc(&ss->fDesc, *ss->fPrimitiveProc essor,
478 ss->fPipeline,
479 ss->fPipeline.descInfo(),
480 ss->fBatchTracker);
481 } else {
482 wasBatch = true;
483 }
437 currentState = ss; 484 currentState = ss;
438
439 } else { 485 } else {
440 iter->execute(this, currentState); 486 iter->execute(this, currentState);
441 } 487 }
442 488
443 if (cmd_has_trace_marker(iter->fType)) { 489 if (cmd_has_trace_marker(iter->fType)) {
444 this->getGpu()->removeGpuTraceMarker(&newMarker); 490 this->getGpu()->removeGpuTraceMarker(&newMarker);
445 } 491 }
446 } 492 }
447 493
494 // TODO see note above, one last catch
495 if (wasBatch) {
496 fBatchTarget.flush();
497 }
498
448 SkASSERT(fGpuCmdMarkers.count() == currCmdMarker); 499 SkASSERT(fGpuCmdMarkers.count() == currCmdMarker);
449 ++fDrawID; 500 ++fDrawID;
450 } 501 }
451 502
452 void GrInOrderDrawBuffer::Draw::execute(GrInOrderDrawBuffer* buf, const SetState * state) { 503 void GrInOrderDrawBuffer::Draw::execute(GrInOrderDrawBuffer* buf, const SetState * state) {
453 SkASSERT(state); 504 SkASSERT(state);
454 DrawArgs args(state->fPrimitiveProcessor.get(), &state->fPipeline, &state->f Desc, 505 DrawArgs args(state->fPrimitiveProcessor.get(), &state->fPipeline, &state->f Desc,
455 &state->fBatchTracker); 506 &state->fBatchTracker);
456 buf->getGpu()->draw(args, fInfo); 507 buf->getGpu()->draw(args, fInfo);
457 } 508 }
(...skipping 19 matching lines...) Expand all
477 void GrInOrderDrawBuffer::DrawPaths::execute(GrInOrderDrawBuffer* buf, const Set State* state) { 528 void GrInOrderDrawBuffer::DrawPaths::execute(GrInOrderDrawBuffer* buf, const Set State* state) {
478 SkASSERT(state); 529 SkASSERT(state);
479 DrawArgs args(state->fPrimitiveProcessor.get(), &state->fPipeline, &state->f Desc, 530 DrawArgs args(state->fPrimitiveProcessor.get(), &state->fPipeline, &state->f Desc,
480 &state->fBatchTracker); 531 &state->fBatchTracker);
481 buf->getGpu()->drawPaths(args, this->pathRange(), 532 buf->getGpu()->drawPaths(args, this->pathRange(),
482 &buf->fPathIndexBuffer[fIndicesLocation], fIndexType , 533 &buf->fPathIndexBuffer[fIndicesLocation], fIndexType ,
483 &buf->fPathTransformBuffer[fTransformsLocation], fTr ansformType, 534 &buf->fPathTransformBuffer[fTransformsLocation], fTr ansformType,
484 fCount, fStencilSettings); 535 fCount, fStencilSettings);
485 } 536 }
486 537
538 void GrInOrderDrawBuffer::DrawBatch::execute(GrInOrderDrawBuffer* buf, const Set State* state) {
539 SkASSERT(state);
540 fBatch->generateGeometry(buf->getBatchTarget(), &state->fPipeline);
541 }
542
487 void GrInOrderDrawBuffer::SetState::execute(GrInOrderDrawBuffer*, const SetState *) {} 543 void GrInOrderDrawBuffer::SetState::execute(GrInOrderDrawBuffer*, const SetState *) {}
488 544
489 void GrInOrderDrawBuffer::Clear::execute(GrInOrderDrawBuffer* buf, const SetStat e*) { 545 void GrInOrderDrawBuffer::Clear::execute(GrInOrderDrawBuffer* buf, const SetStat e*) {
490 if (GrColor_ILLEGAL == fColor) { 546 if (GrColor_ILLEGAL == fColor) {
491 buf->getGpu()->discard(this->renderTarget()); 547 buf->getGpu()->discard(this->renderTarget());
492 } else { 548 } else {
493 buf->getGpu()->clear(&fRect, fColor, fCanIgnoreRect, this->renderTarget( )); 549 buf->getGpu()->clear(&fRect, fColor, fCanIgnoreRect, this->renderTarget( ));
494 } 550 }
495 } 551 }
496 552
(...skipping 27 matching lines...) Expand all
524 (pipelineBuilder, primProc, *this->g etGpu()->caps(), 580 (pipelineBuilder, primProc, *this->g etGpu()->caps(),
525 scissor, dstCopy)); 581 scissor, dstCopy));
526 if (ss->fPipeline.mustSkip()) { 582 if (ss->fPipeline.mustSkip()) {
527 fCmdBuffer.pop_back(); 583 fCmdBuffer.pop_back();
528 return false; 584 return false;
529 } 585 }
530 586
531 ss->fPrimitiveProcessor->initBatchTracker(&ss->fBatchTracker, 587 ss->fPrimitiveProcessor->initBatchTracker(&ss->fBatchTracker,
532 ss->fPipeline.getInitBatchTracker( )); 588 ss->fPipeline.getInitBatchTracker( ));
533 589
534 if (fPrevState && 590 if (fPrevState && fPrevState->fPrimitiveProcessor.get() &&
535 fPrevState->fPrimitiveProcessor->canMakeEqual(fPrevState->fBatchTracker, 591 fPrevState->fPrimitiveProcessor->canMakeEqual(fPrevState->fBatchTracker,
536 *ss->fPrimitiveProcessor, 592 *ss->fPrimitiveProcessor,
537 ss->fBatchTracker) && 593 ss->fBatchTracker) &&
538 fPrevState->fPipeline.isEqual(ss->fPipeline)) { 594 fPrevState->fPipeline.isEqual(ss->fPipeline)) {
539 fCmdBuffer.pop_back(); 595 fCmdBuffer.pop_back();
540 } else { 596 } else {
541 fPrevState = ss; 597 fPrevState = ss;
542 this->recordTraceMarkersIfNecessary(); 598 this->recordTraceMarkersIfNecessary();
543 } 599 }
544 return true; 600 return true;
545 } 601 }
546 602
603 bool GrInOrderDrawBuffer::recordStateAndShouldDraw(GrBatch* batch,
604 const GrPipelineBuilder& pipe lineBuilder,
605 const GrScissorState& scissor ,
606 const GrDeviceCoordTexture* d stCopy) {
607 // TODO this gets much simpler when we have batches everywhere.
608 // If the previous command is also a set state, then we check to see if it h as a Batch. If so,
609 // and we can make the two batches equal, and we can combine the states, the n we make them equal
610 SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState,
611 (batch, pipelineBuilder, *this->getG pu()->caps(), scissor,
612 dstCopy));
613 if (ss->fPipeline.mustSkip()) {
614 fCmdBuffer.pop_back();
615 return false;
616 }
617
618 batch->initBatchTracker(ss->fPipeline.getInitBatchTracker());
619
620 if (fPrevState && !fPrevState->fPrimitiveProcessor.get() &&
621 fPrevState->fPipeline.isEqual(ss->fPipeline)) {
622 fCmdBuffer.pop_back();
623 } else {
624 fPrevState = ss;
625 this->recordTraceMarkersIfNecessary();
626 }
627 return true;
628 }
629
547 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { 630 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() {
548 SkASSERT(!fCmdBuffer.empty()); 631 SkASSERT(!fCmdBuffer.empty());
549 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); 632 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType));
550 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); 633 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers();
551 if (activeTraceMarkers.count() > 0) { 634 if (activeTraceMarkers.count() > 0) {
552 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); 635 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType);
553 fGpuCmdMarkers.push_back(activeTraceMarkers); 636 fGpuCmdMarkers.push_back(activeTraceMarkers);
554 } 637 }
555 } 638 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698