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 "GrBufferAllocPool.h" | 10 #include "GrBufferAllocPool.h" |
(...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
523 Clear* clr = this->recordClear(); | 523 Clear* clr = this->recordClear(); |
524 clr->fColor = GrColor_ILLEGAL; | 524 clr->fColor = GrColor_ILLEGAL; |
525 clr->fRenderTarget = renderTarget; | 525 clr->fRenderTarget = renderTarget; |
526 renderTarget->ref(); | 526 renderTarget->ref(); |
527 } | 527 } |
528 | 528 |
529 void GrInOrderDrawBuffer::reset() { | 529 void GrInOrderDrawBuffer::reset() { |
530 SkASSERT(1 == fGeoPoolStateStack.count()); | 530 SkASSERT(1 == fGeoPoolStateStack.count()); |
531 this->resetVertexSource(); | 531 this->resetVertexSource(); |
532 this->resetIndexSource(); | 532 this->resetIndexSource(); |
533 int numDraws = fDraws.count(); | 533 |
534 for (int d = 0; d < numDraws; ++d) { | 534 DrawAllocator::Iter draw(&fDraws); |
| 535 while (draw.next()) { |
535 // we always have a VB, but not always an IB | 536 // we always have a VB, but not always an IB |
536 SkASSERT(NULL != fDraws[d].fVertexBuffer); | 537 SkASSERT(NULL != draw.get().fVertexBuffer); |
537 fDraws[d].fVertexBuffer->unref(); | 538 draw.get().fVertexBuffer->unref(); |
538 SkSafeUnref(fDraws[d].fIndexBuffer); | 539 SkSafeUnref(draw.get().fIndexBuffer); |
539 } | 540 } |
540 fCmds.reset(); | 541 fCmds.reset(); |
541 fDraws.reset(); | 542 fDraws.reset(); |
542 fStencilPaths.reset(); | 543 fStencilPaths.reset(); |
543 fDrawPath.reset(); | 544 fDrawPath.reset(); |
544 fDrawPaths.reset(); | 545 fDrawPaths.reset(); |
545 fStates.reset(); | 546 fStates.reset(); |
546 fClears.reset(); | 547 fClears.reset(); |
547 fVertexPool.reset(); | 548 fVertexPool.reset(); |
548 fIndexPool.reset(); | 549 fIndexPool.reset(); |
(...skipping 28 matching lines...) Expand all Loading... |
577 GrDrawTarget::AutoClipRestore acr(fDstGpu); | 578 GrDrawTarget::AutoClipRestore acr(fDstGpu); |
578 AutoGeometryAndStatePush agasp(fDstGpu, kPreserve_ASRInit); | 579 AutoGeometryAndStatePush agasp(fDstGpu, kPreserve_ASRInit); |
579 | 580 |
580 GrDrawState playbackState; | 581 GrDrawState playbackState; |
581 GrDrawState* prevDrawState = fDstGpu->drawState(); | 582 GrDrawState* prevDrawState = fDstGpu->drawState(); |
582 prevDrawState->ref(); | 583 prevDrawState->ref(); |
583 fDstGpu->setDrawState(&playbackState); | 584 fDstGpu->setDrawState(&playbackState); |
584 | 585 |
585 GrClipData clipData; | 586 GrClipData clipData; |
586 | 587 |
587 int currState = 0; | 588 StateAllocator::Iter stateIter(&fStates); |
588 int currClip = 0; | 589 ClipAllocator::Iter clipIter(&fClips); |
589 int currClear = 0; | 590 ClipOriginAllocator::Iter clipOriginIter(&fClipOrigins); |
590 int currDraw = 0; | 591 ClearAllocator::Iter clearIter(&fClears); |
591 int currStencilPath = 0; | 592 DrawAllocator::Iter drawIter(&fDraws); |
592 int currDrawPath = 0; | 593 StencilPathAllocator::Iter stencilPathIter(&fStencilPaths); |
593 int currDrawPaths = 0; | 594 DrawPathAllocator::Iter drawPathIter(&fDrawPath); |
594 int currCopySurface = 0; | 595 DrawPathsAllocator::Iter drawPathsIter(&fDrawPaths); |
| 596 CopySurfaceAllocator::Iter copySurfaceIter(&fCopySurfaces); |
| 597 |
595 int currCmdMarker = 0; | 598 int currCmdMarker = 0; |
596 | 599 |
597 fDstGpu->saveActiveTraceMarkers(); | 600 fDstGpu->saveActiveTraceMarkers(); |
598 for (int c = 0; c < numCmds; ++c) { | 601 for (int c = 0; c < numCmds; ++c) { |
599 GrGpuTraceMarker newMarker("", -1); | 602 GrGpuTraceMarker newMarker("", -1); |
600 if (cmd_has_trace_marker(fCmds[c])) { | 603 if (cmd_has_trace_marker(fCmds[c])) { |
601 SkString traceString = fGpuCmdMarkers[currCmdMarker].toString(); | 604 SkString traceString = fGpuCmdMarkers[currCmdMarker].toString(); |
602 newMarker.fMarker = traceString.c_str(); | 605 newMarker.fMarker = traceString.c_str(); |
603 fDstGpu->addGpuTraceMarker(&newMarker); | 606 fDstGpu->addGpuTraceMarker(&newMarker); |
604 ++currCmdMarker; | 607 ++currCmdMarker; |
605 } | 608 } |
606 switch (strip_trace_bit(fCmds[c])) { | 609 switch (strip_trace_bit(fCmds[c])) { |
607 case kDraw_Cmd: { | 610 case kDraw_Cmd: { |
608 const DrawRecord& draw = fDraws[currDraw]; | 611 SkAssertResult(drawIter.next()); |
| 612 const DrawRecord& draw = drawIter.get(); |
609 fDstGpu->setVertexSourceToBuffer(draw.fVertexBuffer); | 613 fDstGpu->setVertexSourceToBuffer(draw.fVertexBuffer); |
610 if (draw.isIndexed()) { | 614 if (draw.isIndexed()) { |
611 fDstGpu->setIndexSourceToBuffer(draw.fIndexBuffer); | 615 fDstGpu->setIndexSourceToBuffer(draw.fIndexBuffer); |
612 } | 616 } |
613 fDstGpu->executeDraw(draw); | 617 fDstGpu->executeDraw(draw); |
614 ++currDraw; | |
615 break; | 618 break; |
616 } | 619 } |
617 case kStencilPath_Cmd: { | 620 case kStencilPath_Cmd: { |
618 const StencilPath& sp = fStencilPaths[currStencilPath]; | 621 SkAssertResult(stencilPathIter.next()); |
| 622 const StencilPath& sp = stencilPathIter.get(); |
619 fDstGpu->stencilPath(sp.fPath.get(), sp.fFill); | 623 fDstGpu->stencilPath(sp.fPath.get(), sp.fFill); |
620 ++currStencilPath; | |
621 break; | 624 break; |
622 } | 625 } |
623 case kDrawPath_Cmd: { | 626 case kDrawPath_Cmd: { |
624 const DrawPath& cp = fDrawPath[currDrawPath]; | 627 SkAssertResult(drawPathIter.next()); |
| 628 const DrawPath& cp = drawPathIter.get(); |
625 fDstGpu->executeDrawPath(cp.fPath.get(), cp.fFill, | 629 fDstGpu->executeDrawPath(cp.fPath.get(), cp.fFill, |
626 NULL != cp.fDstCopy.texture() ? &cp.fDs
tCopy : NULL); | 630 NULL != cp.fDstCopy.texture() ? &cp.fDs
tCopy : NULL); |
627 ++currDrawPath; | |
628 break; | 631 break; |
629 } | 632 } |
630 case kDrawPaths_Cmd: { | 633 case kDrawPaths_Cmd: { |
631 DrawPaths& dp = fDrawPaths[currDrawPaths]; | 634 SkAssertResult(drawPathsIter.next()); |
| 635 const DrawPaths& dp = drawPathsIter.get(); |
632 const GrDeviceCoordTexture* dstCopy = | 636 const GrDeviceCoordTexture* dstCopy = |
633 NULL != dp.fDstCopy.texture() ? &dp.fDstCopy : NULL; | 637 NULL != dp.fDstCopy.texture() ? &dp.fDstCopy : NULL; |
634 fDstGpu->executeDrawPaths(dp.fPathCount, dp.fPaths, | 638 fDstGpu->executeDrawPaths(dp.fPathCount, dp.fPaths, |
635 dp.fTransforms, dp.fFill, dp.fStroke, | 639 dp.fTransforms, dp.fFill, dp.fStroke, |
636 dstCopy); | 640 dstCopy); |
637 ++currDrawPaths; | |
638 break; | 641 break; |
639 } | 642 } |
640 case kSetState_Cmd: | 643 case kSetState_Cmd: |
641 fStates[currState].restoreTo(&playbackState); | 644 SkAssertResult(stateIter.next()); |
642 ++currState; | 645 stateIter.get().restoreTo(&playbackState); |
643 break; | 646 break; |
644 case kSetClip_Cmd: | 647 case kSetClip_Cmd: |
645 clipData.fClipStack = &fClips[currClip]; | 648 SkAssertResult(clipIter.next()); |
646 clipData.fOrigin = fClipOrigins[currClip]; | 649 SkAssertResult(clipOriginIter.next()); |
| 650 clipData.fClipStack = &clipIter.get(); |
| 651 clipData.fOrigin = clipOriginIter.get(); |
647 fDstGpu->setClip(&clipData); | 652 fDstGpu->setClip(&clipData); |
648 ++currClip; | |
649 break; | 653 break; |
650 case kClear_Cmd: | 654 case kClear_Cmd: |
651 if (GrColor_ILLEGAL == fClears[currClear].fColor) { | 655 SkAssertResult(clearIter.next()); |
652 fDstGpu->discard(fClears[currClear].fRenderTarget); | 656 if (GrColor_ILLEGAL == clearIter.get().fColor) { |
| 657 fDstGpu->discard(clearIter.get().fRenderTarget); |
653 } else { | 658 } else { |
654 fDstGpu->clear(&fClears[currClear].fRect, | 659 fDstGpu->clear(&clearIter.get().fRect, |
655 fClears[currClear].fColor, | 660 clearIter.get().fColor, |
656 fClears[currClear].fCanIgnoreRect, | 661 clearIter.get().fCanIgnoreRect, |
657 fClears[currClear].fRenderTarget); | 662 clearIter.get().fRenderTarget); |
658 } | 663 } |
659 ++currClear; | |
660 break; | 664 break; |
661 case kCopySurface_Cmd: | 665 case kCopySurface_Cmd: |
662 fDstGpu->copySurface(fCopySurfaces[currCopySurface].fDst.get(), | 666 SkAssertResult(copySurfaceIter.next()); |
663 fCopySurfaces[currCopySurface].fSrc.get(), | 667 fDstGpu->copySurface(copySurfaceIter.get().fDst.get(), |
664 fCopySurfaces[currCopySurface].fSrcRect, | 668 copySurfaceIter.get().fSrc.get(), |
665 fCopySurfaces[currCopySurface].fDstPoint); | 669 copySurfaceIter.get().fSrcRect, |
666 ++currCopySurface; | 670 copySurfaceIter.get().fDstPoint); |
667 break; | 671 break; |
668 } | 672 } |
669 if (cmd_has_trace_marker(fCmds[c])) { | 673 if (cmd_has_trace_marker(fCmds[c])) { |
670 fDstGpu->removeGpuTraceMarker(&newMarker); | 674 fDstGpu->removeGpuTraceMarker(&newMarker); |
671 } | 675 } |
672 } | 676 } |
673 fDstGpu->restoreActiveTraceMarkers(); | 677 fDstGpu->restoreActiveTraceMarkers(); |
674 // we should have consumed all the states, clips, etc. | 678 // we should have consumed all the states, clips, etc. |
675 SkASSERT(fStates.count() == currState); | 679 SkASSERT(!stateIter.next()); |
676 SkASSERT(fClips.count() == currClip); | 680 SkASSERT(!clipIter.next()); |
677 SkASSERT(fClipOrigins.count() == currClip); | 681 SkASSERT(!clipOriginIter.next()); |
678 SkASSERT(fClears.count() == currClear); | 682 SkASSERT(!clearIter.next()); |
679 SkASSERT(fDraws.count() == currDraw); | 683 SkASSERT(!drawIter.next()); |
680 SkASSERT(fCopySurfaces.count() == currCopySurface); | 684 SkASSERT(!copySurfaceIter.next()); |
| 685 SkASSERT(!stencilPathIter.next()); |
| 686 SkASSERT(!drawPathIter.next()); |
| 687 SkASSERT(!drawPathsIter.next()); |
| 688 |
681 SkASSERT(fGpuCmdMarkers.count() == currCmdMarker); | 689 SkASSERT(fGpuCmdMarkers.count() == currCmdMarker); |
682 | 690 |
683 fDstGpu->setDrawState(prevDrawState); | 691 fDstGpu->setDrawState(prevDrawState); |
684 prevDrawState->unref(); | 692 prevDrawState->unref(); |
685 this->reset(); | 693 this->reset(); |
686 ++fDrawID; | 694 ++fDrawID; |
687 } | 695 } |
688 | 696 |
689 bool GrInOrderDrawBuffer::onCopySurface(GrSurface* dst, | 697 bool GrInOrderDrawBuffer::onCopySurface(GrSurface* dst, |
690 GrSurface* src, | 698 GrSurface* src, |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
986 this->addToCmdBuffer(kCopySurface_Cmd); | 994 this->addToCmdBuffer(kCopySurface_Cmd); |
987 return &fCopySurfaces.push_back(); | 995 return &fCopySurfaces.push_back(); |
988 } | 996 } |
989 | 997 |
990 | 998 |
991 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { | 999 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { |
992 INHERITED::clipWillBeSet(newClipData); | 1000 INHERITED::clipWillBeSet(newClipData); |
993 fClipSet = true; | 1001 fClipSet = true; |
994 fClipProxyState = kUnknown_ClipProxyState; | 1002 fClipProxyState = kUnknown_ClipProxyState; |
995 } | 1003 } |
OLD | NEW |