Incrementally flush GrDrawTarget

BUG=skia:

Review URL: https://codereview.chromium.org/1386463004
diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp
index e7c1c8b..de22d0d 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,28 +118,26 @@
     }
     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();
+    this->reset();
 
     fFlushing = false;
-    this->reset();
 }
 
 void GrDrawTarget::reset() {
+    fFirstUnpreparedBatch = 0;
     fBatches.reset();
 }
 
@@ -434,6 +433,10 @@
         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 3c28b1e..8c85e0a 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 @@
     GrContext*                                  fContext;
     GrGpu*                                      fGpu;
     GrResourceProvider*                         fResourceProvider;
+    GrBatchFlushState                           fFlushState;
     bool                                        fFlushing;
-    GrBatchToken                                fLastFlushToken;
+    int                                         fFirstUnpreparedBatch;
 
     typedef SkRefCnt INHERITED;
 };