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