/* Allocate a new vertex buffer */
vbuf->max_vertices = vbuf->render->max_vertex_buffer_bytes / vbuf->vertex_size;
+ /* even number */
+ vbuf->max_vertices = vbuf->max_vertices & ~1;
+
/* Must always succeed -- driver gives us a
* 'max_vertex_buffer_bytes' which it guarantees it can allocate,
* and it will flush itself if necessary to do so. If this does
*max_vertices = (draw->render->max_vertex_buffer_bytes /
(vinfo->size * 4));
+
+ /* even number */
+ *max_vertices = *max_vertices & ~1;
}
*max_vertices = (draw->render->max_vertex_buffer_bytes /
(vinfo->size * 4));
+
+ /* Return an even number of verts.
+ * This prevents "parity" errors when splitting long triangle strips which
+ * can lead to front/back culling mix-ups.
+ * Every other triangle in a strip has an alternate front/back orientation
+ * so splitting at an odd position can cause the orientation of subsequent
+ * triangles to get reversed.
+ */
+ *max_vertices = *max_vertices & ~1;
}
*max_vertices = DRAW_PIPE_MAX_VERTICES;
}
+ /* return even number */
+ *max_vertices = *max_vertices & ~1;
+
/* No need to prepare the shader.
*/
vs->prepare(vs, draw);