diff --git a/src/gpu/GrBatchFlushState.h b/src/gpu/GrBatchFlushState.h index 5e68e28285..f9b304d6a2 100644 --- a/src/gpu/GrBatchFlushState.h +++ b/src/gpu/GrBatchFlushState.h @@ -46,7 +46,7 @@ class GrBatchFlushState { public: GrBatchFlushState(GrGpu*, GrResourceProvider*, GrBatchToken lastFlushedToken); - ~GrBatchFlushState() { SkASSERT(fLastFlushedToken == fCurrentToken); } + ~GrBatchFlushState() { this->reset(); } void advanceToken() { ++fCurrentToken; } @@ -99,6 +99,11 @@ public: GrGpu* gpu() { return fGpu; } + void reset() { + fVertexPool.reset(); + fIndexPool.reset(); + } + private: GrGpu* fGpu; GrBatchUploader::TextureUploader fUploader; diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp index e7c1c8b5c1..1edb48c028 100644 --- a/src/gpu/GrDrawTarget.cpp +++ b/src/gpu/GrDrawTarget.cpp @@ -35,8 +35,9 @@ GrDrawTarget::GrDrawTarget(GrGpu* gpu, GrResourceProvider* resourceProvider) : fGpu(SkRef(gpu)) , fResourceProvider(resourceProvider) + , fFlushState(fGpu, fResourceProvider, 0) , fFlushing(false) - , fLastFlushToken(0) { + , fFirstUnpreparedBatch(0) { // TODO: Stop extracting the context (currently needed by GrClipMaskManager) fContext = fGpu->getContext(); fClipMaskManager.reset(new GrClipMaskManager(this)); @@ -117,29 +118,29 @@ void GrDrawTarget::flush() { } fFlushing = true; - GrBatchFlushState flushState(fGpu, fResourceProvider, fLastFlushToken); - // Loop over all batches and generate geometry - for (int i = 0; i < fBatches.count(); ++i) { - fBatches[i]->prepare(&flushState); + for (; fFirstUnpreparedBatch < fBatches.count(); ++fFirstUnpreparedBatch) { + fBatches[fFirstUnpreparedBatch]->prepare(&fFlushState); } // Upload all data to the GPU - flushState.preIssueDraws(); + fFlushState.preIssueDraws(); // Draw all the generated geometry. for (int i = 0; i < fBatches.count(); ++i) { - fBatches[i]->draw(&flushState); + fBatches[i]->draw(&fFlushState); } - fLastFlushToken = flushState.lastFlushedToken(); + SkASSERT(fFlushState.lastFlushedToken() == fFlushState.currentToken()); + this->reset(); fFlushing = false; - this->reset(); } void GrDrawTarget::reset() { + fFirstUnpreparedBatch = 0; fBatches.reset(); + fFlushState.reset(); } void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder, GrDrawBatch* batch) { @@ -434,6 +435,10 @@ void GrDrawTarget::recordBatch(GrBatch* batch) { GrBATCH_INFO("\t\tFirstBatch\n"); } fBatches.push_back().reset(SkRef(batch)); + if (fBatches.count() > kMaxLookback) { + SkASSERT(fBatches.count() - kMaxLookback - fFirstUnpreparedBatch == 1); + fBatches[fFirstUnpreparedBatch++]->prepare(&fFlushState); + } } /////////////////////////////////////////////////////////////////////////////// diff --git a/src/gpu/GrDrawTarget.h b/src/gpu/GrDrawTarget.h index 3c28b1e254..8c85e0ad2a 100644 --- a/src/gpu/GrDrawTarget.h +++ b/src/gpu/GrDrawTarget.h @@ -8,6 +8,7 @@ #ifndef GrDrawTarget_DEFINED #define GrDrawTarget_DEFINED +#include "GrBatchFlushState.h" #include "GrClip.h" #include "GrClipMaskManager.h" #include "GrContext.h" @@ -33,6 +34,7 @@ #include "SkXfermode.h" class GrBatch; +class GrBatchFlushState; class GrClip; class GrCaps; class GrPath; @@ -228,8 +230,9 @@ private: GrContext* fContext; GrGpu* fGpu; GrResourceProvider* fResourceProvider; + GrBatchFlushState fFlushState; bool fFlushing; - GrBatchToken fLastFlushToken; + int fFirstUnpreparedBatch; typedef SkRefCnt INHERITED; };