| Index: src/gpu/GrInOrderDrawBuffer.cpp
|
| diff --git a/src/gpu/GrInOrderDrawBuffer.cpp b/src/gpu/GrInOrderDrawBuffer.cpp
|
| index deea72b90d961197fb148a4f0bf5090078122d34..45c38848288233c0efac7210e2af550c315db808 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 drawIter(&fDraws);
|
| + while (drawIter.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 != drawIter->fVertexBuffer);
|
| + drawIter->fVertexBuffer->unref();
|
| + SkSafeUnref(drawIter->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,64 @@ void GrInOrderDrawBuffer::flush() {
|
| }
|
| switch (strip_trace_bit(fCmds[c])) {
|
| case kDraw_Cmd: {
|
| - const DrawRecord& draw = fDraws[currDraw];
|
| - fDstGpu->setVertexSourceToBuffer(draw.fVertexBuffer);
|
| - if (draw.isIndexed()) {
|
| - fDstGpu->setIndexSourceToBuffer(draw.fIndexBuffer);
|
| + SkAssertResult(drawIter.next());
|
| + fDstGpu->setVertexSourceToBuffer(drawIter->fVertexBuffer);
|
| + if (drawIter->isIndexed()) {
|
| + fDstGpu->setIndexSourceToBuffer(drawIter->fIndexBuffer);
|
| }
|
| - fDstGpu->executeDraw(draw);
|
| - ++currDraw;
|
| + fDstGpu->executeDraw(*drawIter);
|
| break;
|
| }
|
| case kStencilPath_Cmd: {
|
| - const StencilPath& sp = fStencilPaths[currStencilPath];
|
| - fDstGpu->stencilPath(sp.fPath.get(), sp.fFill);
|
| - ++currStencilPath;
|
| + SkAssertResult(stencilPathIter.next());
|
| + fDstGpu->stencilPath(stencilPathIter->fPath.get(), stencilPathIter->fFill);
|
| break;
|
| }
|
| case kDrawPath_Cmd: {
|
| - const DrawPath& cp = fDrawPath[currDrawPath];
|
| - fDstGpu->executeDrawPath(cp.fPath.get(), cp.fFill,
|
| - NULL != cp.fDstCopy.texture() ? &cp.fDstCopy : NULL);
|
| - ++currDrawPath;
|
| + SkAssertResult(drawPathIter.next());
|
| + fDstGpu->executeDrawPath(drawPathIter->fPath.get(), drawPathIter->fFill,
|
| + NULL != drawPathIter->fDstCopy.texture() ?
|
| + &drawPathIter->fDstCopy :
|
| + NULL);
|
| break;
|
| }
|
| case kDrawPaths_Cmd: {
|
| - DrawPaths& dp = fDrawPaths[currDrawPaths];
|
| + SkAssertResult(drawPathsIter.next());
|
| const GrDeviceCoordTexture* dstCopy =
|
| - NULL != dp.fDstCopy.texture() ? &dp.fDstCopy : NULL;
|
| - fDstGpu->executeDrawPaths(dp.fPathCount, dp.fPaths,
|
| - dp.fTransforms, dp.fFill, dp.fStroke,
|
| - dstCopy);
|
| - ++currDrawPaths;
|
| + NULL !=drawPathsIter->fDstCopy.texture() ? &drawPathsIter->fDstCopy : NULL;
|
| + fDstGpu->executeDrawPaths(drawPathsIter->fPathCount, drawPathsIter->fPaths,
|
| + drawPathsIter->fTransforms, drawPathsIter->fFill,
|
| + drawPathsIter->fStroke, dstCopy);
|
| break;
|
| }
|
| case kSetState_Cmd:
|
| - fStates[currState].restoreTo(&playbackState);
|
| - ++currState;
|
| + SkAssertResult(stateIter.next());
|
| + stateIter->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;
|
| 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->fColor) {
|
| + fDstGpu->discard(clearIter->fRenderTarget);
|
| } else {
|
| - fDstGpu->clear(&fClears[currClear].fRect,
|
| - fClears[currClear].fColor,
|
| - fClears[currClear].fCanIgnoreRect,
|
| - fClears[currClear].fRenderTarget);
|
| + fDstGpu->clear(&clearIter->fRect,
|
| + clearIter->fColor,
|
| + clearIter->fCanIgnoreRect,
|
| + clearIter->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->fDst.get(),
|
| + copySurfaceIter->fSrc.get(),
|
| + copySurfaceIter->fSrcRect,
|
| + copySurfaceIter->fDstPoint);
|
| break;
|
| }
|
| if (cmd_has_trace_marker(fCmds[c])) {
|
| @@ -672,12 +674,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);
|
|
|