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;