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 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
541 fCmds.reset(); | 541 fCmds.reset(); |
542 fDraws.reset(); | 542 fDraws.reset(); |
543 fStencilPaths.reset(); | 543 fStencilPaths.reset(); |
544 fDrawPath.reset(); | 544 fDrawPath.reset(); |
545 fDrawPaths.reset(); | 545 fDrawPaths.reset(); |
546 fStates.reset(); | 546 fStates.reset(); |
547 fClears.reset(); | 547 fClears.reset(); |
548 fVertexPool.reset(); | 548 fVertexPool.reset(); |
549 fIndexPool.reset(); | 549 fIndexPool.reset(); |
550 fClips.reset(); | 550 fClips.reset(); |
551 fClipOrigins.reset(); | |
552 fCopySurfaces.reset(); | 551 fCopySurfaces.reset(); |
553 fGpuCmdMarkers.reset(); | 552 fGpuCmdMarkers.reset(); |
554 fClipSet = true; | 553 fClipSet = true; |
555 } | 554 } |
556 | 555 |
557 void GrInOrderDrawBuffer::flush() { | 556 void GrInOrderDrawBuffer::flush() { |
558 if (fFlushing) { | 557 if (fFlushing) { |
559 return; | 558 return; |
560 } | 559 } |
561 | 560 |
(...skipping 18 matching lines...) Expand all Loading... |
580 | 579 |
581 GrDrawState playbackState; | 580 GrDrawState playbackState; |
582 GrDrawState* prevDrawState = fDstGpu->drawState(); | 581 GrDrawState* prevDrawState = fDstGpu->drawState(); |
583 prevDrawState->ref(); | 582 prevDrawState->ref(); |
584 fDstGpu->setDrawState(&playbackState); | 583 fDstGpu->setDrawState(&playbackState); |
585 | 584 |
586 GrClipData clipData; | 585 GrClipData clipData; |
587 | 586 |
588 StateAllocator::Iter stateIter(&fStates); | 587 StateAllocator::Iter stateIter(&fStates); |
589 ClipAllocator::Iter clipIter(&fClips); | 588 ClipAllocator::Iter clipIter(&fClips); |
590 ClipOriginAllocator::Iter clipOriginIter(&fClipOrigins); | |
591 ClearAllocator::Iter clearIter(&fClears); | 589 ClearAllocator::Iter clearIter(&fClears); |
592 DrawAllocator::Iter drawIter(&fDraws); | 590 DrawAllocator::Iter drawIter(&fDraws); |
593 StencilPathAllocator::Iter stencilPathIter(&fStencilPaths); | 591 StencilPathAllocator::Iter stencilPathIter(&fStencilPaths); |
594 DrawPathAllocator::Iter drawPathIter(&fDrawPath); | 592 DrawPathAllocator::Iter drawPathIter(&fDrawPath); |
595 DrawPathsAllocator::Iter drawPathsIter(&fDrawPaths); | 593 DrawPathsAllocator::Iter drawPathsIter(&fDrawPaths); |
596 CopySurfaceAllocator::Iter copySurfaceIter(&fCopySurfaces); | 594 CopySurfaceAllocator::Iter copySurfaceIter(&fCopySurfaces); |
597 | 595 |
598 int currCmdMarker = 0; | 596 int currCmdMarker = 0; |
599 | 597 |
600 fDstGpu->saveActiveTraceMarkers(); | 598 fDstGpu->saveActiveTraceMarkers(); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
637 drawPathsIter->fTransforms, drawPathsI
ter->fFill, | 635 drawPathsIter->fTransforms, drawPathsI
ter->fFill, |
638 drawPathsIter->fStroke, dstCopy); | 636 drawPathsIter->fStroke, dstCopy); |
639 break; | 637 break; |
640 } | 638 } |
641 case kSetState_Cmd: | 639 case kSetState_Cmd: |
642 SkAssertResult(stateIter.next()); | 640 SkAssertResult(stateIter.next()); |
643 stateIter->restoreTo(&playbackState); | 641 stateIter->restoreTo(&playbackState); |
644 break; | 642 break; |
645 case kSetClip_Cmd: | 643 case kSetClip_Cmd: |
646 SkAssertResult(clipIter.next()); | 644 SkAssertResult(clipIter.next()); |
647 SkAssertResult(clipOriginIter.next()); | 645 clipData.fClipStack = &clipIter->fStack; |
648 clipData.fClipStack = clipIter.get(); | 646 clipData.fOrigin = clipIter->fOrigin; |
649 clipData.fOrigin = *clipOriginIter; | |
650 fDstGpu->setClip(&clipData); | 647 fDstGpu->setClip(&clipData); |
651 break; | 648 break; |
652 case kClear_Cmd: | 649 case kClear_Cmd: |
653 SkAssertResult(clearIter.next()); | 650 SkAssertResult(clearIter.next()); |
654 if (GrColor_ILLEGAL == clearIter->fColor) { | 651 if (GrColor_ILLEGAL == clearIter->fColor) { |
655 fDstGpu->discard(clearIter->fRenderTarget); | 652 fDstGpu->discard(clearIter->fRenderTarget); |
656 } else { | 653 } else { |
657 fDstGpu->clear(&clearIter->fRect, | 654 fDstGpu->clear(&clearIter->fRect, |
658 clearIter->fColor, | 655 clearIter->fColor, |
659 clearIter->fCanIgnoreRect, | 656 clearIter->fCanIgnoreRect, |
660 clearIter->fRenderTarget); | 657 clearIter->fRenderTarget); |
661 } | 658 } |
662 break; | 659 break; |
663 case kCopySurface_Cmd: | 660 case kCopySurface_Cmd: |
664 SkAssertResult(copySurfaceIter.next()); | 661 SkAssertResult(copySurfaceIter.next()); |
665 fDstGpu->copySurface(copySurfaceIter->fDst.get(), | 662 fDstGpu->copySurface(copySurfaceIter->fDst.get(), |
666 copySurfaceIter->fSrc.get(), | 663 copySurfaceIter->fSrc.get(), |
667 copySurfaceIter->fSrcRect, | 664 copySurfaceIter->fSrcRect, |
668 copySurfaceIter->fDstPoint); | 665 copySurfaceIter->fDstPoint); |
669 break; | 666 break; |
670 } | 667 } |
671 if (cmd_has_trace_marker(fCmds[c])) { | 668 if (cmd_has_trace_marker(fCmds[c])) { |
672 fDstGpu->removeGpuTraceMarker(&newMarker); | 669 fDstGpu->removeGpuTraceMarker(&newMarker); |
673 } | 670 } |
674 } | 671 } |
675 fDstGpu->restoreActiveTraceMarkers(); | 672 fDstGpu->restoreActiveTraceMarkers(); |
676 // we should have consumed all the states, clips, etc. | 673 // we should have consumed all the states, clips, etc. |
677 SkASSERT(!stateIter.next()); | 674 SkASSERT(!stateIter.next()); |
678 SkASSERT(!clipIter.next()); | 675 SkASSERT(!clipIter.next()); |
679 SkASSERT(!clipOriginIter.next()); | |
680 SkASSERT(!clearIter.next()); | 676 SkASSERT(!clearIter.next()); |
681 SkASSERT(!drawIter.next()); | 677 SkASSERT(!drawIter.next()); |
682 SkASSERT(!copySurfaceIter.next()); | 678 SkASSERT(!copySurfaceIter.next()); |
683 SkASSERT(!stencilPathIter.next()); | 679 SkASSERT(!stencilPathIter.next()); |
684 SkASSERT(!drawPathIter.next()); | 680 SkASSERT(!drawPathIter.next()); |
685 SkASSERT(!drawPathsIter.next()); | 681 SkASSERT(!drawPathsIter.next()); |
686 | 682 |
687 SkASSERT(fGpuCmdMarkers.count() == currCmdMarker); | 683 SkASSERT(fGpuCmdMarkers.count() == currCmdMarker); |
688 | 684 |
689 fDstGpu->setDrawState(prevDrawState); | 685 fDstGpu->setDrawState(prevDrawState); |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
921 poolState.fUsedPoolIndexBytes = sizeof(uint16_t) * | 917 poolState.fUsedPoolIndexBytes = sizeof(uint16_t) * |
922 restoredState.fIndexCount; | 918 restoredState.fIndexCount; |
923 } | 919 } |
924 } | 920 } |
925 | 921 |
926 bool GrInOrderDrawBuffer::needsNewState() const { | 922 bool GrInOrderDrawBuffer::needsNewState() const { |
927 return fStates.empty() || !fStates.back().isEqual(this->getDrawState()); | 923 return fStates.empty() || !fStates.back().isEqual(this->getDrawState()); |
928 } | 924 } |
929 | 925 |
930 bool GrInOrderDrawBuffer::needsNewClip() const { | 926 bool GrInOrderDrawBuffer::needsNewClip() const { |
931 SkASSERT(fClips.count() == fClipOrigins.count()); | |
932 if (this->getDrawState().isClipState()) { | 927 if (this->getDrawState().isClipState()) { |
933 if (fClipSet && | 928 if (fClipSet && |
934 (fClips.empty() || | 929 (fClips.empty() || |
935 fClips.back() != *this->getClip()->fClipStack || | 930 fClips.back().fStack != *this->getClip()->fClipStack || |
936 fClipOrigins.back() != this->getClip()->fOrigin)) { | 931 fClips.back().fOrigin != this->getClip()->fOrigin)) { |
937 return true; | 932 return true; |
938 } | 933 } |
939 } | 934 } |
940 return false; | 935 return false; |
941 } | 936 } |
942 | 937 |
943 void GrInOrderDrawBuffer::addToCmdBuffer(uint8_t cmd) { | 938 void GrInOrderDrawBuffer::addToCmdBuffer(uint8_t cmd) { |
944 SkASSERT(!cmd_has_trace_marker(cmd)); | 939 SkASSERT(!cmd_has_trace_marker(cmd)); |
945 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); | 940 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); |
946 if (activeTraceMarkers.count() > 0) { | 941 if (activeTraceMarkers.count() > 0) { |
947 fCmds.push_back(add_trace_bit(cmd)); | 942 fCmds.push_back(add_trace_bit(cmd)); |
948 fGpuCmdMarkers.push_back(activeTraceMarkers); | 943 fGpuCmdMarkers.push_back(activeTraceMarkers); |
949 } else { | 944 } else { |
950 fCmds.push_back(cmd); | 945 fCmds.push_back(cmd); |
951 } | 946 } |
952 } | 947 } |
953 | 948 |
954 void GrInOrderDrawBuffer::recordClip() { | 949 void GrInOrderDrawBuffer::recordClip() { |
955 fClips.push_back(*this->getClip()->fClipStack); | 950 fClips.push_back().fStack = *this->getClip()->fClipStack; |
956 fClipOrigins.push_back() = this->getClip()->fOrigin; | 951 fClips.back().fOrigin = this->getClip()->fOrigin; |
957 fClipSet = false; | 952 fClipSet = false; |
958 this->addToCmdBuffer(kSetClip_Cmd); | 953 this->addToCmdBuffer(kSetClip_Cmd); |
959 } | 954 } |
960 | 955 |
961 void GrInOrderDrawBuffer::recordState() { | 956 void GrInOrderDrawBuffer::recordState() { |
962 fStates.push_back().saveFrom(this->getDrawState()); | 957 fStates.push_back().saveFrom(this->getDrawState()); |
963 this->addToCmdBuffer(kSetState_Cmd); | 958 this->addToCmdBuffer(kSetState_Cmd); |
964 } | 959 } |
965 | 960 |
966 GrInOrderDrawBuffer::DrawRecord* GrInOrderDrawBuffer::recordDraw(const DrawInfo&
info) { | 961 GrInOrderDrawBuffer::DrawRecord* GrInOrderDrawBuffer::recordDraw(const DrawInfo&
info) { |
(...skipping 19 matching lines...) Expand all Loading... |
986 GrInOrderDrawBuffer::Clear* GrInOrderDrawBuffer::recordClear() { | 981 GrInOrderDrawBuffer::Clear* GrInOrderDrawBuffer::recordClear() { |
987 this->addToCmdBuffer(kClear_Cmd); | 982 this->addToCmdBuffer(kClear_Cmd); |
988 return &fClears.push_back(); | 983 return &fClears.push_back(); |
989 } | 984 } |
990 | 985 |
991 GrInOrderDrawBuffer::CopySurface* GrInOrderDrawBuffer::recordCopySurface() { | 986 GrInOrderDrawBuffer::CopySurface* GrInOrderDrawBuffer::recordCopySurface() { |
992 this->addToCmdBuffer(kCopySurface_Cmd); | 987 this->addToCmdBuffer(kCopySurface_Cmd); |
993 return &fCopySurfaces.push_back(); | 988 return &fCopySurfaces.push_back(); |
994 } | 989 } |
995 | 990 |
996 | |
997 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { | 991 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { |
998 INHERITED::clipWillBeSet(newClipData); | 992 INHERITED::clipWillBeSet(newClipData); |
999 fClipSet = true; | 993 fClipSet = true; |
1000 fClipProxyState = kUnknown_ClipProxyState; | 994 fClipProxyState = kUnknown_ClipProxyState; |
1001 } | 995 } |
OLD | NEW |