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

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

Issue 815643005: Move program descriptor and primitive processor off of optstate (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: bug fix 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
« no previous file with comments | « src/gpu/GrInOrderDrawBuffer.h ('k') | src/gpu/GrOptDrawState.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 401 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 return; 412 return;
413 } 413 }
414 414
415 415
416 CmdBuffer::Iter iter(fCmdBuffer); 416 CmdBuffer::Iter iter(fCmdBuffer);
417 417
418 int currCmdMarker = 0; 418 int currCmdMarker = 0;
419 419
420 // Updated every time we find a set state cmd to reflect the current state i n the playback 420 // Updated every time we find a set state cmd to reflect the current state i n the playback
421 // stream. 421 // stream.
422 GrOptDrawState* currentOptState = NULL; 422 SetState* currentState = NULL;
423 423
424 while (iter.next()) { 424 while (iter.next()) {
425 GrGpuTraceMarker newMarker("", -1); 425 GrGpuTraceMarker newMarker("", -1);
426 SkString traceString; 426 SkString traceString;
427 if (cmd_has_trace_marker(iter->fType)) { 427 if (cmd_has_trace_marker(iter->fType)) {
428 traceString = fGpuCmdMarkers[currCmdMarker].toString(); 428 traceString = fGpuCmdMarkers[currCmdMarker].toString();
429 newMarker.fMarker = traceString.c_str(); 429 newMarker.fMarker = traceString.c_str();
430 this->getGpu()->addGpuTraceMarker(&newMarker); 430 this->getGpu()->addGpuTraceMarker(&newMarker);
431 ++currCmdMarker; 431 ++currCmdMarker;
432 } 432 }
433 433
434 if (kSetState_Cmd == strip_trace_bit(iter->fType)) { 434 if (kSetState_Cmd == strip_trace_bit(iter->fType)) {
435 SetState* ss = reinterpret_cast<SetState*>(iter.get()); 435 SetState* ss = reinterpret_cast<SetState*>(iter.get());
436 currentOptState = &ss->fState; 436
437 currentOptState->finalize(this->getGpu()); 437 this->getGpu()->buildProgramDesc(&ss->fDesc, *ss->fPrimitiveProcesso r, ss->fState,
438 ss->fState.descInfo(), ss->fState.d rawType(),
439 ss->fBatchTracker);
440 currentState = ss;
441
438 } else { 442 } else {
439 iter->execute(this, currentOptState); 443 iter->execute(this, currentState);
440 } 444 }
441 445
442 if (cmd_has_trace_marker(iter->fType)) { 446 if (cmd_has_trace_marker(iter->fType)) {
443 this->getGpu()->removeGpuTraceMarker(&newMarker); 447 this->getGpu()->removeGpuTraceMarker(&newMarker);
444 } 448 }
445 } 449 }
446 450
447 SkASSERT(fGpuCmdMarkers.count() == currCmdMarker); 451 SkASSERT(fGpuCmdMarkers.count() == currCmdMarker);
448 ++fDrawID; 452 ++fDrawID;
449 } 453 }
450 454
451 void GrInOrderDrawBuffer::Draw::execute(GrInOrderDrawBuffer* buf, const GrOptDra wState* optState) { 455 void GrInOrderDrawBuffer::Draw::execute(GrInOrderDrawBuffer* buf, const SetState * state) {
452 SkASSERT(optState); 456 SkASSERT(state);
453 buf->getGpu()->draw(*optState, fInfo); 457 DrawArgs args(state->fPrimitiveProcessor.get(), &state->fState, &state->fDes c,
458 &state->fBatchTracker);
459 buf->getGpu()->draw(args, fInfo);
454 } 460 }
455 461
456 void GrInOrderDrawBuffer::StencilPath::execute(GrInOrderDrawBuffer* buf, const G rOptDrawState*) { 462 void GrInOrderDrawBuffer::StencilPath::execute(GrInOrderDrawBuffer* buf, const S etState*) {
457 GrGpu::StencilPathState state; 463 GrGpu::StencilPathState state;
458 state.fRenderTarget = fRenderTarget.get(); 464 state.fRenderTarget = fRenderTarget.get();
459 state.fScissor = &fScissor; 465 state.fScissor = &fScissor;
460 state.fStencil = &fStencil; 466 state.fStencil = &fStencil;
461 state.fUseHWAA = fUseHWAA; 467 state.fUseHWAA = fUseHWAA;
462 state.fViewMatrix = &fViewMatrix; 468 state.fViewMatrix = &fViewMatrix;
463 469
464 buf->getGpu()->stencilPath(this->path(), state); 470 buf->getGpu()->stencilPath(this->path(), state);
465 } 471 }
466 472
467 void GrInOrderDrawBuffer::DrawPath::execute(GrInOrderDrawBuffer* buf, 473 void GrInOrderDrawBuffer::DrawPath::execute(GrInOrderDrawBuffer* buf, const SetS tate* state) {
468 const GrOptDrawState* optState) { 474 SkASSERT(state);
469 SkASSERT(optState); 475 DrawArgs args(state->fPrimitiveProcessor.get(), &state->fState, &state->fDes c,
470 buf->getGpu()->drawPath(*optState, this->path(), fStencilSettings); 476 &state->fBatchTracker);
477 buf->getGpu()->drawPath(args, this->path(), fStencilSettings);
471 } 478 }
472 479
473 void GrInOrderDrawBuffer::DrawPaths::execute(GrInOrderDrawBuffer* buf, 480 void GrInOrderDrawBuffer::DrawPaths::execute(GrInOrderDrawBuffer* buf, const Set State* state) {
474 const GrOptDrawState* optState) { 481 SkASSERT(state);
475 SkASSERT(optState); 482 DrawArgs args(state->fPrimitiveProcessor.get(), &state->fState, &state->fDes c,
476 buf->getGpu()->drawPaths(*optState, this->pathRange(), 483 &state->fBatchTracker);
484 buf->getGpu()->drawPaths(args, this->pathRange(),
477 &buf->fPathIndexBuffer[fIndicesLocation], fIndexType , 485 &buf->fPathIndexBuffer[fIndicesLocation], fIndexType ,
478 &buf->fPathTransformBuffer[fTransformsLocation], fTr ansformType, 486 &buf->fPathTransformBuffer[fTransformsLocation], fTr ansformType,
479 fCount, fStencilSettings); 487 fCount, fStencilSettings);
480 } 488 }
481 489
482 void GrInOrderDrawBuffer::SetState::execute(GrInOrderDrawBuffer*, const GrOptDra wState*) {} 490 void GrInOrderDrawBuffer::SetState::execute(GrInOrderDrawBuffer*, const SetState *) {}
483 491
484 void GrInOrderDrawBuffer::Clear::execute(GrInOrderDrawBuffer* buf, const GrOptDr awState*) { 492 void GrInOrderDrawBuffer::Clear::execute(GrInOrderDrawBuffer* buf, const SetStat e*) {
485 if (GrColor_ILLEGAL == fColor) { 493 if (GrColor_ILLEGAL == fColor) {
486 buf->getGpu()->discard(this->renderTarget()); 494 buf->getGpu()->discard(this->renderTarget());
487 } else { 495 } else {
488 buf->getGpu()->clear(&fRect, fColor, fCanIgnoreRect, this->renderTarget( )); 496 buf->getGpu()->clear(&fRect, fColor, fCanIgnoreRect, this->renderTarget( ));
489 } 497 }
490 } 498 }
491 499
492 void GrInOrderDrawBuffer::ClearStencilClip::execute(GrInOrderDrawBuffer* buf, 500 void GrInOrderDrawBuffer::ClearStencilClip::execute(GrInOrderDrawBuffer* buf, co nst SetState*) {
493 const GrOptDrawState*) {
494 buf->getGpu()->clearStencilClip(fRect, fInsideClip, this->renderTarget()); 501 buf->getGpu()->clearStencilClip(fRect, fInsideClip, this->renderTarget());
495 } 502 }
496 503
497 void GrInOrderDrawBuffer::CopySurface::execute(GrInOrderDrawBuffer* buf, const G rOptDrawState*) { 504 void GrInOrderDrawBuffer::CopySurface::execute(GrInOrderDrawBuffer* buf, const S etState*) {
498 buf->getGpu()->copySurface(this->dst(), this->src(), fSrcRect, fDstPoint); 505 buf->getGpu()->copySurface(this->dst(), this->src(), fSrcRect, fDstPoint);
499 } 506 }
500 507
501 bool GrInOrderDrawBuffer::onCopySurface(GrSurface* dst, 508 bool GrInOrderDrawBuffer::onCopySurface(GrSurface* dst,
502 GrSurface* src, 509 GrSurface* src,
503 const SkIRect& srcRect, 510 const SkIRect& srcRect,
504 const SkIPoint& dstPoint) { 511 const SkIPoint& dstPoint) {
505 if (getGpu()->canCopySurface(dst, src, srcRect, dstPoint)) { 512 if (getGpu()->canCopySurface(dst, src, srcRect, dstPoint)) {
506 CopySurface* cs = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, CopySurface, (dst , src)); 513 CopySurface* cs = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, CopySurface, (dst , src));
507 cs->fSrcRect = srcRect; 514 cs->fSrcRect = srcRect;
508 cs->fDstPoint = dstPoint; 515 cs->fDstPoint = dstPoint;
509 this->recordTraceMarkersIfNecessary(); 516 this->recordTraceMarkersIfNecessary();
510 return true; 517 return true;
511 } 518 }
512 return false; 519 return false;
513 } 520 }
514 521
515 bool GrInOrderDrawBuffer::recordStateAndShouldDraw(const GrDrawState& ds, 522 bool GrInOrderDrawBuffer::recordStateAndShouldDraw(const GrDrawState& ds,
516 const GrPrimitiveProcessor* p rimProc, 523 const GrPrimitiveProcessor* p rimProc,
517 GrGpu::DrawType drawType, 524 GrGpu::DrawType drawType,
518 const GrScissorState& scissor , 525 const GrScissorState& scissor ,
519 const GrDeviceCoordTexture* d stCopy) { 526 const GrDeviceCoordTexture* d stCopy) {
520 SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState, 527 SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState,
521 (ds, primProc, *this->getGpu()->caps (), scissor, 528 (ds, primProc, *this->getGpu()->caps (), scissor,
522 dstCopy, drawType)); 529 dstCopy, drawType));
523 if (ss->fState.mustSkip()) { 530 if (ss->fState.mustSkip()) {
524 fCmdBuffer.pop_back(); 531 fCmdBuffer.pop_back();
525 return false; 532 return false;
526 } 533 }
527 if (fPrevState && fPrevState->combineIfPossible(ss->fState)) { 534
535 ss->fPrimitiveProcessor->initBatchTracker(&ss->fBatchTracker,
536 ss->fState.getInitBatchTracker());
537
538 if (fPrevState &&
539 fPrevState->fPrimitiveProcessor->canMakeEqual(fPrevState->fBatchTracker,
540 *ss->fPrimitiveProcessor,
541 ss->fBatchTracker) &&
542 fPrevState->fState.isEqual(ss->fState)) {
528 fCmdBuffer.pop_back(); 543 fCmdBuffer.pop_back();
529 } else { 544 } else {
530 fPrevState = &ss->fState; 545 fPrevState = ss;
531 this->recordTraceMarkersIfNecessary(); 546 this->recordTraceMarkersIfNecessary();
532 } 547 }
533 return true; 548 return true;
534 } 549 }
535 550
536 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { 551 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() {
537 SkASSERT(!fCmdBuffer.empty()); 552 SkASSERT(!fCmdBuffer.empty());
538 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); 553 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType));
539 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); 554 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers();
540 if (activeTraceMarkers.count() > 0) { 555 if (activeTraceMarkers.count() > 0) {
541 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); 556 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType);
542 fGpuCmdMarkers.push_back(activeTraceMarkers); 557 fGpuCmdMarkers.push_back(activeTraceMarkers);
543 } 558 }
544 } 559 }
OLDNEW
« no previous file with comments | « src/gpu/GrInOrderDrawBuffer.h ('k') | src/gpu/GrOptDrawState.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698