Hi,
while playing with r300 driver I've stumbled upon a problem with splitting
vertexes.
Let's say we get rendering operation where number of indexes in index buffer
is 80000 and max_index is 20000. We are calling vbo_split_prims because number
of indexes exceeds hw limit.
In flush_vertex (vbo_split_inplace.c) function the split->ib is not null, so
the max_index (20000) won't be changed. In the end the draw_prims functions
will be called with inappropriate max_index number.
I'm seeing this behaviour with UT2004 demo on current r300 driver.
I think the solution would be to always calculate min/max_index numbers just
like in the !split->ib path but I want to be sure before I commit the patch.
Any comments?
Regards,
Maciej Cencora
diff --git a/src/mesa/vbo/vbo_split_inplace.c b/src/mesa/vbo/vbo_split_inplace.c
index 3ed6b34..f51e40c 100644
--- a/src/mesa/vbo/vbo_split_inplace.c
+++ b/src/mesa/vbo/vbo_split_inplace.c
@@ -1,4 +1,3 @@
-
/*
* Mesa 3-D graphics library
* Version: 6.5
@@ -63,35 +62,23 @@ static void flush_vertex( struct split_context *split )
if (!split->dstprim_nr)
return;
- if (split->ib) {
- /* This should basically be multipass rendering over the same
- * unchanging set of VBO's. Would like the driver not to
- * re-upload the data, or swtnl not to re-transform the
- * vertices.
- */
- assert(split->max_index - split->min_index < split->limits->max_verts);
- min_index = split->min_index;
- max_index = split->max_index;
- }
- else {
- /* Non-indexed rendering. Cannot assume that the primitives are
- * ordered by increasing vertex, because of entrypoints like
- * MultiDrawArrays.
- */
- GLuint i;
- min_index = split->dstprim[0].start;
- max_index = min_index + split->dstprim[0].count - 1;
+ /* Non-indexed rendering. Cannot assume that the primitives are
+ * ordered by increasing vertex, because of entrypoints like
+ * MultiDrawArrays.
+ */
+ GLuint i;
+ min_index = split->dstprim[0].start;
+ max_index = min_index + split->dstprim[0].count - 1;
- for (i = 1; i < split->dstprim_nr; i++) {
- GLuint tmp_min = split->dstprim[i].start;
- GLuint tmp_max = tmp_min + split->dstprim[i].count - 1;
+ for (i = 1; i < split->dstprim_nr; i++) {
+ GLuint tmp_min = split->dstprim[i].start;
+ GLuint tmp_max = tmp_min + split->dstprim[i].count - 1;
- if (tmp_min < min_index)
- min_index = tmp_min;
+ if (tmp_min < min_index)
+ min_index = tmp_min;
- if (tmp_max > max_index)
- max_index = tmp_max;
- }
+ if (tmp_max > max_index)
+ max_index = tmp_max;
}
assert(max_index >= min_index);
------------------------------------------------------------------------------
_______________________________________________
Mesa3d-dev mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev