Remove some validation and asserts from tessellating path renderer.

In some cases, resolving an intersection can cause a vertex to go
slightly out-of-order with edges which have already been processed.
This doesn't cause any algorithmic errors, but it's difficult to detect
without impacting performance significantly.

Also, the GPU infrastructure fires asserts when attempting
to allocate 0-length vertex buffers. Early-out instead,
since there's nothing to draw.

Review URL: https://codereview.chromium.org/1032253005
diff --git a/src/gpu/GrTessellatingPathRenderer.cpp b/src/gpu/GrTessellatingPathRenderer.cpp
index 3d4a81c..e9e8da2 100644
--- a/src/gpu/GrTessellatingPathRenderer.cpp
+++ b/src/gpu/GrTessellatingPathRenderer.cpp
@@ -355,9 +355,6 @@
             Vertex* v = first->fNext;
             while (v != fTail) {
                 SkASSERT(v && v->fPrev && v->fNext);
-#ifdef SK_DEBUG
-                validate();
-#endif
                 Vertex* prev = v->fPrev;
                 Vertex* curr = v;
                 Vertex* next = v->fNext;
@@ -376,27 +373,10 @@
                     }
                 } else {
                     v = v->fNext;
-                    SkASSERT(v != fTail);
                 }
             }
             return data;
         }
-
-#ifdef SK_DEBUG
-        void validate() {
-            int winding = sweep_lt(fHead->fPoint, fTail->fPoint) ? 1 : -1;
-            Vertex* top = winding < 0 ? fTail : fHead;
-            Vertex* bottom = winding < 0 ? fHead : fTail;
-            Edge e(top, bottom, winding);
-            for (Vertex* v = fHead->fNext; v != fTail; v = v->fNext) {
-                if (fSide == kRight_Side) {
-                    SkASSERT(!e.isRightOf(v));
-                } else if (fSide == Poly::kLeft_Side) {
-                    SkASSERT(!e.isLeftOf(v));
-                }
-            }
-        }
-#endif
     };
     Poly* addVertex(Vertex* v, Side side, SkChunkAlloc& alloc) {
         LOG("addVertex() to %d at %g (%g, %g), %s side\n", fID, v->fID, v->fPoint.fX, v->fPoint.fY,
@@ -410,9 +390,6 @@
             fActive = ALLOC_NEW(MonotonePoly, (), alloc);
         }
         if (fActive->addVertex(v, side, alloc)) {
-#ifdef SK_DEBUG
-            fActive->validate();
-#endif
             if (fTail) {
                 fActive->fPrev = fTail;
                 fTail->fNext = fActive;
@@ -477,67 +454,6 @@
     return poly;
 }
 
-#ifdef SK_DEBUG
-void validate_edges(Edge* head) {
-    for (Edge* e = head; e != NULL; e = e->fRight) {
-        SkASSERT(e->fTop != e->fBottom);
-        if (e->fLeft) {
-            SkASSERT(e->fLeft->fRight == e);
-            if (sweep_gt(e->fTop->fPoint, e->fLeft->fTop->fPoint)) {
-                SkASSERT(e->fLeft->isLeftOf(e->fTop));
-            }
-            if (sweep_lt(e->fBottom->fPoint, e->fLeft->fBottom->fPoint)) {
-                SkASSERT(e->fLeft->isLeftOf(e->fBottom));
-            }
-        } else {
-            SkASSERT(e == head);
-        }
-        if (e->fRight) {
-            SkASSERT(e->fRight->fLeft == e);
-            if (sweep_gt(e->fTop->fPoint, e->fRight->fTop->fPoint)) {
-                SkASSERT(e->fRight->isRightOf(e->fTop));
-            }
-            if (sweep_lt(e->fBottom->fPoint, e->fRight->fBottom->fPoint)) {
-                SkASSERT(e->fRight->isRightOf(e->fBottom));
-            }
-        }
-    }
-}
-
-void validate_connectivity(Vertex* v) {
-    for (Edge* e = v->fFirstEdgeAbove; e != NULL; e = e->fNextEdgeAbove) {
-        SkASSERT(e->fBottom == v);
-        if (e->fPrevEdgeAbove) {
-            SkASSERT(e->fPrevEdgeAbove->fNextEdgeAbove == e);
-            SkASSERT(e->fPrevEdgeAbove->isLeftOf(e->fTop));
-        } else {
-            SkASSERT(e == v->fFirstEdgeAbove);
-        }
-        if (e->fNextEdgeAbove) {
-            SkASSERT(e->fNextEdgeAbove->fPrevEdgeAbove == e);
-            SkASSERT(e->fNextEdgeAbove->isRightOf(e->fTop));
-        } else {
-            SkASSERT(e == v->fLastEdgeAbove);
-        }
-    }
-    for (Edge* e = v->fFirstEdgeBelow; e != NULL; e = e->fNextEdgeBelow) {
-        SkASSERT(e->fTop == v);
-        if (e->fPrevEdgeBelow) {
-            SkASSERT(e->fPrevEdgeBelow->fNextEdgeBelow == e);
-            SkASSERT(e->fPrevEdgeBelow->isLeftOf(e->fBottom));
-        } else {
-            SkASSERT(e == v->fFirstEdgeBelow);
-        }
-        if (e->fNextEdgeBelow) {
-            SkASSERT(e->fNextEdgeBelow->fPrevEdgeBelow == e);
-            SkASSERT(e->fNextEdgeBelow->isRightOf(e->fBottom));
-        } else {
-            SkASSERT(e == v->fLastEdgeBelow);
-        }
-    }
-}
-#endif
-
 Vertex* append_point_to_contour(const SkPoint& p, Vertex* prev, Vertex** head,
                                 SkChunkAlloc& alloc) {
     Vertex* v = ALLOC_NEW(Vertex, (p), alloc);
@@ -783,7 +699,6 @@
 void insert_edge_above(Edge* edge, Vertex* v) {
     if (edge->fTop->fPoint == edge->fBottom->fPoint ||
         sweep_gt(edge->fTop->fPoint, edge->fBottom->fPoint)) {
-        SkASSERT(false);
         return;
     }
     LOG("insert edge (%g -> %g) above vertex %g\n", edge->fTop->fID, edge->fBottom->fID, v->fID);
@@ -802,7 +717,6 @@
 void insert_edge_below(Edge* edge, Vertex* v) {
     if (edge->fTop->fPoint == edge->fBottom->fPoint ||
         sweep_gt(edge->fTop->fPoint, edge->fBottom->fPoint)) {
-        SkASSERT(false);
         return;
     }
     LOG("insert edge (%g -> %g) below vertex %g\n", edge->fTop->fID, edge->fBottom->fID, v->fID);
@@ -1040,9 +954,6 @@
             split_edge(edge, v, activeEdges, alloc);
             split_edge(other, v, activeEdges, alloc);
         }
-#ifdef SK_DEBUG
-        validate_connectivity(v);
-#endif
         return v;
     }
     return NULL;
@@ -1193,9 +1104,6 @@
 #if LOGGING_ENABLED
         LOG("\nvertex %g: (%g,%g)\n", v->fID, v->fPoint.fX, v->fPoint.fY);
 #endif
-#ifdef SK_DEBUG
-        validate_connectivity(v);
-#endif
         Edge* leftEnclosingEdge = NULL;
         Edge* rightEnclosingEdge = NULL;
         bool restartChecks;
@@ -1224,11 +1132,6 @@
 
             }
         } while (restartChecks);
-        SkASSERT(!leftEnclosingEdge || leftEnclosingEdge->isLeftOf(v));
-        SkASSERT(!rightEnclosingEdge || rightEnclosingEdge->isRightOf(v));
-#ifdef SK_DEBUG
-        validate_edges(activeEdges);
-#endif
         for (Edge* e = v->fFirstEdgeAbove; e; e = e->fNextEdgeAbove) {
             remove_edge(e, &activeEdges);
         }
@@ -1254,17 +1157,9 @@
 #if LOGGING_ENABLED
         LOG("\nvertex %g: (%g,%g)\n", v->fID, v->fPoint.fX, v->fPoint.fY);
 #endif
-#ifdef SK_DEBUG
-        validate_connectivity(v);
-#endif
         Edge* leftEnclosingEdge = NULL;
         Edge* rightEnclosingEdge = NULL;
         find_enclosing_edges(v, activeEdges, &leftEnclosingEdge, &rightEnclosingEdge);
-        SkASSERT(!leftEnclosingEdge || leftEnclosingEdge->isLeftOf(v));
-        SkASSERT(!rightEnclosingEdge || rightEnclosingEdge->isRightOf(v));
-#ifdef SK_DEBUG
-        validate_edges(activeEdges);
-#endif
         Poly* leftPoly = NULL;
         Poly* rightPoly = NULL;
         if (v->fFirstEdgeAbove) {
@@ -1356,9 +1251,6 @@
             }
             v->fLastEdgeBelow->fRightPoly = rightPoly;
         }
-#ifdef SK_DEBUG
-        validate_edges(activeEdges);
-#endif
 #if LOGGING_ENABLED
         LOG("\nactive edges:\n");
         for (Edge* e = activeEdges; e != NULL; e = e->fRight) {
@@ -1507,6 +1399,9 @@
                 count += (poly->fCount - 2) * (WIREFRAME ? 6 : 3);
             }
         }
+        if (0 == count) {
+            return;
+        }
 
         size_t stride = gp->getVertexStride();
         const GrVertexBuffer* vertexBuffer;