aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/GrInOrderDrawBuffer.cpp
diff options
context:
space:
mode:
authorGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-04-09 15:38:19 +0000
committerGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-04-09 15:38:19 +0000
commit116ad84d3126b0db22b2312ca59ed70e5c56f6fc (patch)
tree11d44b1e01e22afbbfec00e39467eeaf2d17c959 /src/gpu/GrInOrderDrawBuffer.cpp
parent686bcb871b8425603b9accbf72e27a9309f786d8 (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.cpp39
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;