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 559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
570 | 570 |
571 GrAutoTRestore<bool> flushRestore(&fFlushing); | 571 GrAutoTRestore<bool> flushRestore(&fFlushing); |
572 fFlushing = true; | 572 fFlushing = true; |
573 | 573 |
574 fVertexPool.unmap(); | 574 fVertexPool.unmap(); |
575 fIndexPool.unmap(); | 575 fIndexPool.unmap(); |
576 | 576 |
577 GrDrawTarget::AutoClipRestore acr(fDstGpu); | 577 GrDrawTarget::AutoClipRestore acr(fDstGpu); |
578 AutoGeometryAndStatePush agasp(fDstGpu, kPreserve_ASRInit); | 578 AutoGeometryAndStatePush agasp(fDstGpu, kPreserve_ASRInit); |
579 | 579 |
580 GrDrawState playbackState; | 580 GrDrawState* prevDrawState = SkRef(fDstGpu->drawState()); |
581 GrDrawState* prevDrawState = fDstGpu->drawState(); | |
582 prevDrawState->ref(); | |
583 fDstGpu->setDrawState(&playbackState); | |
584 | 581 |
585 GrClipData clipData; | 582 GrClipData clipData; |
586 | 583 |
587 StateAllocator::Iter stateIter(&fStates); | 584 StateAllocator::Iter stateIter(&fStates); |
588 ClipAllocator::Iter clipIter(&fClips); | 585 ClipAllocator::Iter clipIter(&fClips); |
589 ClearAllocator::Iter clearIter(&fClears); | 586 ClearAllocator::Iter clearIter(&fClears); |
590 DrawAllocator::Iter drawIter(&fDraws); | 587 DrawAllocator::Iter drawIter(&fDraws); |
591 StencilPathAllocator::Iter stencilPathIter(&fStencilPaths); | 588 StencilPathAllocator::Iter stencilPathIter(&fStencilPaths); |
592 DrawPathAllocator::Iter drawPathIter(&fDrawPath); | 589 DrawPathAllocator::Iter drawPathIter(&fDrawPath); |
593 DrawPathsAllocator::Iter drawPathsIter(&fDrawPaths); | 590 DrawPathsAllocator::Iter drawPathsIter(&fDrawPaths); |
594 CopySurfaceAllocator::Iter copySurfaceIter(&fCopySurfaces); | 591 CopySurfaceAllocator::Iter copySurfaceIter(&fCopySurfaces); |
595 | 592 |
596 int currCmdMarker = 0; | 593 int currCmdMarker = 0; |
597 | 594 |
598 fDstGpu->saveActiveTraceMarkers(); | 595 fDstGpu->saveActiveTraceMarkers(); |
599 for (int c = 0; c < numCmds; ++c) { | 596 for (int c = 0; c < numCmds; ++c) { |
600 GrGpuTraceMarker newMarker("", -1); | 597 GrGpuTraceMarker newMarker("", -1); |
601 if (cmd_has_trace_marker(fCmds[c])) { | 598 if (cmd_has_trace_marker(fCmds[c])) { |
602 SkString traceString = fGpuCmdMarkers[currCmdMarker].toString(); | 599 SkString traceString = fGpuCmdMarkers[currCmdMarker].toString(); |
603 newMarker.fMarker = traceString.c_str(); | 600 newMarker.fMarker = traceString.c_str(); |
604 fDstGpu->addGpuTraceMarker(&newMarker); | 601 fDstGpu->addGpuTraceMarker(&newMarker); |
605 ++currCmdMarker; | 602 ++currCmdMarker; |
606 } | 603 } |
607 switch (strip_trace_bit(fCmds[c])) { | 604 switch (strip_trace_bit(fCmds[c])) { |
608 case kDraw_Cmd: { | 605 case kDraw_Cmd: { |
| 606 SkASSERT(fDstGpu->drawState() != prevDrawState); |
609 SkAssertResult(drawIter.next()); | 607 SkAssertResult(drawIter.next()); |
610 fDstGpu->setVertexSourceToBuffer(drawIter->fVertexBuffer); | 608 fDstGpu->setVertexSourceToBuffer(drawIter->fVertexBuffer); |
611 if (drawIter->isIndexed()) { | 609 if (drawIter->isIndexed()) { |
612 fDstGpu->setIndexSourceToBuffer(drawIter->fIndexBuffer); | 610 fDstGpu->setIndexSourceToBuffer(drawIter->fIndexBuffer); |
613 } | 611 } |
614 fDstGpu->executeDraw(*drawIter); | 612 fDstGpu->executeDraw(*drawIter); |
615 break; | 613 break; |
616 } | 614 } |
617 case kStencilPath_Cmd: { | 615 case kStencilPath_Cmd: { |
| 616 SkASSERT(fDstGpu->drawState() != prevDrawState); |
618 SkAssertResult(stencilPathIter.next()); | 617 SkAssertResult(stencilPathIter.next()); |
619 fDstGpu->stencilPath(stencilPathIter->fPath.get(), stencilPathIt
er->fFill); | 618 fDstGpu->stencilPath(stencilPathIter->fPath.get(), stencilPathIt
er->fFill); |
620 break; | 619 break; |
621 } | 620 } |
622 case kDrawPath_Cmd: { | 621 case kDrawPath_Cmd: { |
| 622 SkASSERT(fDstGpu->drawState() != prevDrawState); |
623 SkAssertResult(drawPathIter.next()); | 623 SkAssertResult(drawPathIter.next()); |
624 fDstGpu->executeDrawPath(drawPathIter->fPath.get(), drawPathIter
->fFill, | 624 fDstGpu->executeDrawPath(drawPathIter->fPath.get(), drawPathIter
->fFill, |
625 NULL != drawPathIter->fDstCopy.texture(
) ? | 625 NULL != drawPathIter->fDstCopy.texture(
) ? |
626 &drawPathIter->fDstCopy : | 626 &drawPathIter->fDstCopy : |
627 NULL); | 627 NULL); |
628 break; | 628 break; |
629 } | 629 } |
630 case kDrawPaths_Cmd: { | 630 case kDrawPaths_Cmd: { |
| 631 SkASSERT(fDstGpu->drawState() != prevDrawState); |
631 SkAssertResult(drawPathsIter.next()); | 632 SkAssertResult(drawPathsIter.next()); |
632 const GrDeviceCoordTexture* dstCopy = | 633 const GrDeviceCoordTexture* dstCopy = |
633 NULL !=drawPathsIter->fDstCopy.texture() ? &drawPathsIter->f
DstCopy : NULL; | 634 NULL !=drawPathsIter->fDstCopy.texture() ? &drawPathsIter->f
DstCopy : NULL; |
634 fDstGpu->executeDrawPaths(drawPathsIter->fPathCount, drawPathsIt
er->fPaths, | 635 fDstGpu->executeDrawPaths(drawPathsIter->fPathCount, drawPathsIt
er->fPaths, |
635 drawPathsIter->fTransforms, drawPathsI
ter->fFill, | 636 drawPathsIter->fTransforms, drawPathsI
ter->fFill, |
636 drawPathsIter->fStroke, dstCopy); | 637 drawPathsIter->fStroke, dstCopy); |
637 break; | 638 break; |
638 } | 639 } |
639 case kSetState_Cmd: | 640 case kSetState_Cmd: |
640 SkAssertResult(stateIter.next()); | 641 SkAssertResult(stateIter.next()); |
641 stateIter->restoreTo(&playbackState); | 642 fDstGpu->setDrawState(stateIter.get()); |
642 break; | 643 break; |
643 case kSetClip_Cmd: | 644 case kSetClip_Cmd: |
644 SkAssertResult(clipIter.next()); | 645 SkAssertResult(clipIter.next()); |
645 clipData.fClipStack = &clipIter->fStack; | 646 clipData.fClipStack = &clipIter->fStack; |
646 clipData.fOrigin = clipIter->fOrigin; | 647 clipData.fOrigin = clipIter->fOrigin; |
647 fDstGpu->setClip(&clipData); | 648 fDstGpu->setClip(&clipData); |
648 break; | 649 break; |
649 case kClear_Cmd: | 650 case kClear_Cmd: |
650 SkAssertResult(clearIter.next()); | 651 SkAssertResult(clearIter.next()); |
651 if (GrColor_ILLEGAL == clearIter->fColor) { | 652 if (GrColor_ILLEGAL == clearIter->fColor) { |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
913 poolState.fUsedPoolVertexBytes = restoredState.fVertexSize * restoredSta
te.fVertexCount; | 914 poolState.fUsedPoolVertexBytes = restoredState.fVertexSize * restoredSta
te.fVertexCount; |
914 } | 915 } |
915 if (kReserved_GeometrySrcType == restoredState.fIndexSrc || | 916 if (kReserved_GeometrySrcType == restoredState.fIndexSrc || |
916 kArray_GeometrySrcType == restoredState.fIndexSrc) { | 917 kArray_GeometrySrcType == restoredState.fIndexSrc) { |
917 poolState.fUsedPoolIndexBytes = sizeof(uint16_t) * | 918 poolState.fUsedPoolIndexBytes = sizeof(uint16_t) * |
918 restoredState.fIndexCount; | 919 restoredState.fIndexCount; |
919 } | 920 } |
920 } | 921 } |
921 | 922 |
922 bool GrInOrderDrawBuffer::needsNewState() const { | 923 bool GrInOrderDrawBuffer::needsNewState() const { |
923 return fStates.empty() || !fStates.back().isEqual(this->getDrawState()); | 924 return fStates.empty() || fStates.back() != this->getDrawState(); |
924 } | 925 } |
925 | 926 |
926 bool GrInOrderDrawBuffer::needsNewClip() const { | 927 bool GrInOrderDrawBuffer::needsNewClip() const { |
927 if (this->getDrawState().isClipState()) { | 928 if (this->getDrawState().isClipState()) { |
928 if (fClipSet && | 929 if (fClipSet && |
929 (fClips.empty() || | 930 (fClips.empty() || |
930 fClips.back().fStack != *this->getClip()->fClipStack || | 931 fClips.back().fStack != *this->getClip()->fClipStack || |
931 fClips.back().fOrigin != this->getClip()->fOrigin)) { | 932 fClips.back().fOrigin != this->getClip()->fOrigin)) { |
932 return true; | 933 return true; |
933 } | 934 } |
(...skipping 13 matching lines...) Expand all Loading... |
947 } | 948 } |
948 | 949 |
949 void GrInOrderDrawBuffer::recordClip() { | 950 void GrInOrderDrawBuffer::recordClip() { |
950 fClips.push_back().fStack = *this->getClip()->fClipStack; | 951 fClips.push_back().fStack = *this->getClip()->fClipStack; |
951 fClips.back().fOrigin = this->getClip()->fOrigin; | 952 fClips.back().fOrigin = this->getClip()->fOrigin; |
952 fClipSet = false; | 953 fClipSet = false; |
953 this->addToCmdBuffer(kSetClip_Cmd); | 954 this->addToCmdBuffer(kSetClip_Cmd); |
954 } | 955 } |
955 | 956 |
956 void GrInOrderDrawBuffer::recordState() { | 957 void GrInOrderDrawBuffer::recordState() { |
957 fStates.push_back().saveFrom(this->getDrawState()); | 958 fStates.push_back() = this->getDrawState(); |
958 this->addToCmdBuffer(kSetState_Cmd); | 959 this->addToCmdBuffer(kSetState_Cmd); |
959 } | 960 } |
960 | 961 |
961 GrInOrderDrawBuffer::DrawRecord* GrInOrderDrawBuffer::recordDraw(const DrawInfo&
info) { | 962 GrInOrderDrawBuffer::DrawRecord* GrInOrderDrawBuffer::recordDraw(const DrawInfo&
info) { |
962 this->addToCmdBuffer(kDraw_Cmd); | 963 this->addToCmdBuffer(kDraw_Cmd); |
963 return &fDraws.push_back(info); | 964 return &fDraws.push_back(info); |
964 } | 965 } |
965 | 966 |
966 GrInOrderDrawBuffer::StencilPath* GrInOrderDrawBuffer::recordStencilPath() { | 967 GrInOrderDrawBuffer::StencilPath* GrInOrderDrawBuffer::recordStencilPath() { |
967 this->addToCmdBuffer(kStencilPath_Cmd); | 968 this->addToCmdBuffer(kStencilPath_Cmd); |
(...skipping 18 matching lines...) Expand all Loading... |
986 GrInOrderDrawBuffer::CopySurface* GrInOrderDrawBuffer::recordCopySurface() { | 987 GrInOrderDrawBuffer::CopySurface* GrInOrderDrawBuffer::recordCopySurface() { |
987 this->addToCmdBuffer(kCopySurface_Cmd); | 988 this->addToCmdBuffer(kCopySurface_Cmd); |
988 return &fCopySurfaces.push_back(); | 989 return &fCopySurfaces.push_back(); |
989 } | 990 } |
990 | 991 |
991 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { | 992 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { |
992 INHERITED::clipWillBeSet(newClipData); | 993 INHERITED::clipWillBeSet(newClipData); |
993 fClipSet = true; | 994 fClipSet = true; |
994 fClipProxyState = kUnknown_ClipProxyState; | 995 fClipProxyState = kUnknown_ClipProxyState; |
995 } | 996 } |
OLD | NEW |