diff options
author | bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-04-09 15:38:19 +0000 |
---|---|---|
committer | bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-04-09 15:38:19 +0000 |
commit | 116ad84d3126b0db22b2312ca59ed70e5c56f6fc (patch) | |
tree | 11d44b1e01e22afbbfec00e39467eeaf2d17c959 /src/gpu/GrInOrderDrawBuffer.cpp | |
parent | 686bcb871b8425603b9accbf72e27a9309f786d8 (diff) |
Make GrIODB record and play back copySurface.
Review URL: https://codereview.chromium.org/13581003
git-svn-id: http://skia.googlecode.com/svn/trunk@8574 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/gpu/GrInOrderDrawBuffer.cpp')
-rw-r--r-- | src/gpu/GrInOrderDrawBuffer.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/gpu/GrInOrderDrawBuffer.cpp b/src/gpu/GrInOrderDrawBuffer.cpp index 43779675bd..481a39546f 100644 --- a/src/gpu/GrInOrderDrawBuffer.cpp +++ b/src/gpu/GrInOrderDrawBuffer.cpp @@ -422,6 +422,7 @@ void GrInOrderDrawBuffer::reset() { fIndexPool.reset(); fClips.reset(); fClipOrigins.reset(); + fCopySurfaces.reset(); fClipSet = true; } @@ -456,6 +457,7 @@ bool GrInOrderDrawBuffer::flush() { int currClear = 0; int currDraw = 0; int currStencilPath = 0; + int currCopySurface = 0; for (int c = 0; c < numCmds; ++c) { switch (fCmds[c]) { @@ -492,6 +494,13 @@ bool GrInOrderDrawBuffer::flush() { fClears[currClear].fRenderTarget); ++currClear; break; + case kCopySurface_Cmd: + fDstGpu->copySurface(fCopySurfaces[currCopySurface].fDst.get(), + fCopySurfaces[currCopySurface].fSrc.get(), + fCopySurfaces[currCopySurface].fSrcRect, + fCopySurfaces[currCopySurface].fDstPoint); + ++currCopySurface; + break; } } // we should have consumed all the states, clips, etc. @@ -500,6 +509,7 @@ bool GrInOrderDrawBuffer::flush() { GrAssert(fClipOrigins.count() == currClip); GrAssert(fClears.count() == currClear); GrAssert(fDraws.count() == currDraw); + GrAssert(fCopySurfaces.count() == currCopySurface); fDstGpu->setDrawState(prevDrawState); prevDrawState->unref(); @@ -507,6 +517,29 @@ bool GrInOrderDrawBuffer::flush() { return true; } +bool GrInOrderDrawBuffer::onCopySurface(GrSurface* dst, + GrSurface* src, + const SkIRect& srcRect, + const SkIPoint& dstPoint) { + if (fDstGpu->canCopySurface(dst, src, srcRect, dstPoint)) { + CopySurface* cs = this->recordCopySurface(); + cs->fDst.reset(SkRef(dst)); + cs->fSrc.reset(SkRef(src)); + cs->fSrcRect = srcRect; + cs->fDstPoint = dstPoint; + return true; + } else { + return false; + } +} + +bool GrInOrderDrawBuffer::onCanCopySurface(GrSurface* dst, + GrSurface* src, + const SkIRect& srcRect, + const SkIPoint& dstPoint) { + return fDstGpu->canCopySurface(dst, src, srcRect, dstPoint); +} + void GrInOrderDrawBuffer::willReserveVertexAndIndexSpace( int vertexCount, int indexCount) { @@ -756,6 +789,12 @@ GrInOrderDrawBuffer::Clear* GrInOrderDrawBuffer::recordClear() { return &fClears.push_back(); } +GrInOrderDrawBuffer::CopySurface* GrInOrderDrawBuffer::recordCopySurface() { + fCmds.push_back(kCopySurface_Cmd); + return &fCopySurfaces.push_back(); +} + + void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { INHERITED::clipWillBeSet(newClipData); fClipSet = true; |