Index: src/gpu/GrInOrderDrawBuffer.cpp |
diff --git a/src/gpu/GrInOrderDrawBuffer.cpp b/src/gpu/GrInOrderDrawBuffer.cpp |
index deea72b90d961197fb148a4f0bf5090078122d34..9d77e78d678cb66f79b408db9029ddd94902561f 100644 |
--- a/src/gpu/GrInOrderDrawBuffer.cpp |
+++ b/src/gpu/GrInOrderDrawBuffer.cpp |
@@ -530,12 +530,13 @@ void GrInOrderDrawBuffer::reset() { |
SkASSERT(1 == fGeoPoolStateStack.count()); |
this->resetVertexSource(); |
this->resetIndexSource(); |
- int numDraws = fDraws.count(); |
- for (int d = 0; d < numDraws; ++d) { |
+ |
+ DrawAllocator::Iter draw(&fDraws); |
+ while (draw.next()) { |
// we always have a VB, but not always an IB |
- SkASSERT(NULL != fDraws[d].fVertexBuffer); |
- fDraws[d].fVertexBuffer->unref(); |
- SkSafeUnref(fDraws[d].fIndexBuffer); |
+ SkASSERT(NULL != draw.get().fVertexBuffer); |
+ draw.get().fVertexBuffer->unref(); |
+ SkSafeUnref(draw.get().fIndexBuffer); |
} |
fCmds.reset(); |
fDraws.reset(); |
@@ -584,14 +585,16 @@ void GrInOrderDrawBuffer::flush() { |
GrClipData clipData; |
- int currState = 0; |
- int currClip = 0; |
- int currClear = 0; |
- int currDraw = 0; |
- int currStencilPath = 0; |
- int currDrawPath = 0; |
- int currDrawPaths = 0; |
- int currCopySurface = 0; |
+ StateAllocator::Iter stateIter(&fStates); |
+ ClipAllocator::Iter clipIter(&fClips); |
+ ClipOriginAllocator::Iter clipOriginIter(&fClipOrigins); |
+ ClearAllocator::Iter clearIter(&fClears); |
+ DrawAllocator::Iter drawIter(&fDraws); |
+ StencilPathAllocator::Iter stencilPathIter(&fStencilPaths); |
+ DrawPathAllocator::Iter drawPathIter(&fDrawPath); |
+ DrawPathsAllocator::Iter drawPathsIter(&fDrawPaths); |
+ CopySurfaceAllocator::Iter copySurfaceIter(&fCopySurfaces); |
+ |
int currCmdMarker = 0; |
fDstGpu->saveActiveTraceMarkers(); |
@@ -605,65 +608,66 @@ void GrInOrderDrawBuffer::flush() { |
} |
switch (strip_trace_bit(fCmds[c])) { |
case kDraw_Cmd: { |
- const DrawRecord& draw = fDraws[currDraw]; |
+ SkAssertResult(drawIter.next()); |
+ const DrawRecord& draw = drawIter.get(); |
fDstGpu->setVertexSourceToBuffer(draw.fVertexBuffer); |
if (draw.isIndexed()) { |
fDstGpu->setIndexSourceToBuffer(draw.fIndexBuffer); |
} |
fDstGpu->executeDraw(draw); |
- ++currDraw; |
break; |
} |
case kStencilPath_Cmd: { |
- const StencilPath& sp = fStencilPaths[currStencilPath]; |
+ SkAssertResult(stencilPathIter.next()); |
+ const StencilPath& sp = stencilPathIter.get(); |
fDstGpu->stencilPath(sp.fPath.get(), sp.fFill); |
- ++currStencilPath; |
break; |
} |
case kDrawPath_Cmd: { |
- const DrawPath& cp = fDrawPath[currDrawPath]; |
+ SkAssertResult(drawPathIter.next()); |
+ const DrawPath& cp = drawPathIter.get(); |
fDstGpu->executeDrawPath(cp.fPath.get(), cp.fFill, |
NULL != cp.fDstCopy.texture() ? &cp.fDstCopy : NULL); |
- ++currDrawPath; |
break; |
} |
case kDrawPaths_Cmd: { |
- DrawPaths& dp = fDrawPaths[currDrawPaths]; |
+ SkAssertResult(drawPathsIter.next()); |
+ const DrawPaths& dp = drawPathsIter.get(); |
const GrDeviceCoordTexture* dstCopy = |
NULL != dp.fDstCopy.texture() ? &dp.fDstCopy : NULL; |
fDstGpu->executeDrawPaths(dp.fPathCount, dp.fPaths, |
dp.fTransforms, dp.fFill, dp.fStroke, |
dstCopy); |
- ++currDrawPaths; |
break; |
} |
case kSetState_Cmd: |
- fStates[currState].restoreTo(&playbackState); |
- ++currState; |
+ SkAssertResult(stateIter.next()); |
+ stateIter.get().restoreTo(&playbackState); |
break; |
case kSetClip_Cmd: |
- clipData.fClipStack = &fClips[currClip]; |
- clipData.fOrigin = fClipOrigins[currClip]; |
+ SkAssertResult(clipIter.next()); |
+ SkAssertResult(clipOriginIter.next()); |
+ clipData.fClipStack = &clipIter.get(); |
+ clipData.fOrigin = clipOriginIter.get(); |
fDstGpu->setClip(&clipData); |
- ++currClip; |
break; |
case kClear_Cmd: |
- if (GrColor_ILLEGAL == fClears[currClear].fColor) { |
- fDstGpu->discard(fClears[currClear].fRenderTarget); |
+ SkAssertResult(clearIter.next()); |
+ if (GrColor_ILLEGAL == clearIter.get().fColor) { |
+ fDstGpu->discard(clearIter.get().fRenderTarget); |
} else { |
- fDstGpu->clear(&fClears[currClear].fRect, |
- fClears[currClear].fColor, |
- fClears[currClear].fCanIgnoreRect, |
- fClears[currClear].fRenderTarget); |
+ fDstGpu->clear(&clearIter.get().fRect, |
+ clearIter.get().fColor, |
+ clearIter.get().fCanIgnoreRect, |
+ clearIter.get().fRenderTarget); |
} |
- ++currClear; |
break; |
case kCopySurface_Cmd: |
- fDstGpu->copySurface(fCopySurfaces[currCopySurface].fDst.get(), |
- fCopySurfaces[currCopySurface].fSrc.get(), |
- fCopySurfaces[currCopySurface].fSrcRect, |
- fCopySurfaces[currCopySurface].fDstPoint); |
- ++currCopySurface; |
+ SkAssertResult(copySurfaceIter.next()); |
+ fDstGpu->copySurface(copySurfaceIter.get().fDst.get(), |
+ copySurfaceIter.get().fSrc.get(), |
+ copySurfaceIter.get().fSrcRect, |
+ copySurfaceIter.get().fDstPoint); |
break; |
} |
if (cmd_has_trace_marker(fCmds[c])) { |
@@ -672,12 +676,16 @@ void GrInOrderDrawBuffer::flush() { |
} |
fDstGpu->restoreActiveTraceMarkers(); |
// we should have consumed all the states, clips, etc. |
- SkASSERT(fStates.count() == currState); |
- SkASSERT(fClips.count() == currClip); |
- SkASSERT(fClipOrigins.count() == currClip); |
- SkASSERT(fClears.count() == currClear); |
- SkASSERT(fDraws.count() == currDraw); |
- SkASSERT(fCopySurfaces.count() == currCopySurface); |
+ SkASSERT(!stateIter.next()); |
+ SkASSERT(!clipIter.next()); |
+ SkASSERT(!clipOriginIter.next()); |
+ SkASSERT(!clearIter.next()); |
+ SkASSERT(!drawIter.next()); |
+ SkASSERT(!copySurfaceIter.next()); |
+ SkASSERT(!stencilPathIter.next()); |
+ SkASSERT(!drawPathIter.next()); |
+ SkASSERT(!drawPathsIter.next()); |
+ |
SkASSERT(fGpuCmdMarkers.count() == currCmdMarker); |
fDstGpu->setDrawState(prevDrawState); |