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