Fix pure virtual call from destructor and turn VertBench back on



git-svn-id: http://skia.googlecode.com/svn/trunk@2556 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/bench/VertBench.cpp b/bench/VertBench.cpp
index 8cdecff..98df449 100644
--- a/bench/VertBench.cpp
+++ b/bench/VertBench.cpp
@@ -82,12 +82,11 @@
     virtual void onDraw(SkCanvas* canvas) {
         SkPaint paint;
         this->setupPaint(&paint);
-#if 0
+
         for (int i = 0; i < N; i++) {
             canvas->drawVertices(SkCanvas::kTriangles_VertexMode, PTS,
                                  fPts, NULL, fColors, NULL, fIdx, IDX, paint);
         }
-#endif
     }
 private:
     typedef SkBenchmark INHERITED;
diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp
index 97ec3ba..f604845 100644
--- a/src/gpu/GrDrawTarget.cpp
+++ b/src/gpu/GrDrawTarget.cpp
@@ -430,13 +430,20 @@
 }
 
 GrDrawTarget::~GrDrawTarget() {
+    GrAssert(1 == fGeoSrcStateStack.count());
+    GeometrySrcState& geoSrc = fGeoSrcStateStack.back();
+    GrAssert(kNone_GeometrySrcType == geoSrc.fIndexSrc);
+    GrAssert(kNone_GeometrySrcType == geoSrc.fVertexSrc);
+}
+
+void GrDrawTarget::releaseGeometry() {
     int popCnt = fGeoSrcStateStack.count() - 1;
     while (popCnt) {
         this->popGeometrySource();
         --popCnt;
     }
-    this->releasePreviousVertexSource();
-    this->releasePreviousIndexSource();
+    this->resetVertexSource();
+    this->resetIndexSource();
 }
 
 void GrDrawTarget::setClip(const GrClip& clip) {
diff --git a/src/gpu/GrDrawTarget.h b/src/gpu/GrDrawTarget.h
index 16326a9..7d311aa 100644
--- a/src/gpu/GrDrawTarget.h
+++ b/src/gpu/GrDrawTarget.h
@@ -1366,6 +1366,10 @@
 
     Caps fCaps;
 
+    // subclasses must call this in their destructors to ensure all vertex
+    // and index sources have been released (including those held by 
+    // pushGeometrySource())
+    void releaseGeometry();
 private:
     // called when setting a new vert/idx source to unref prev vb/ib
     void releasePreviousVertexSource();
diff --git a/src/gpu/GrGpuGL.cpp b/src/gpu/GrGpuGL.cpp
index 012fdc1..7865592 100644
--- a/src/gpu/GrGpuGL.cpp
+++ b/src/gpu/GrGpuGL.cpp
@@ -309,6 +309,8 @@
 }
 
 GrGpuGL::~GrGpuGL() {
+    // This must be called by before the GrDrawTarget destructor
+    this->releaseGeometry();
     // This subclass must do this before the base class destructor runs
     // since we will unref the GrGLInterface.
     this->releaseResources();
diff --git a/src/gpu/GrInOrderDrawBuffer.cpp b/src/gpu/GrInOrderDrawBuffer.cpp
index db20846..837d2c1 100644
--- a/src/gpu/GrInOrderDrawBuffer.cpp
+++ b/src/gpu/GrInOrderDrawBuffer.cpp
@@ -44,6 +44,8 @@
 
 GrInOrderDrawBuffer::~GrInOrderDrawBuffer() {
     this->reset();
+    // This must be called by before the GrDrawTarget destructor
+    this->releaseGeometry();
     GrSafeUnref(fQuadIndexBuffer);
 }