| 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 |