r300g: fix draw_vbo splitting on r3xx-r4xx
authorMarek Olšák <maraeo@gmail.com>
Wed, 8 Jun 2011 22:50:29 +0000 (00:50 +0200)
committerMarek Olšák <maraeo@gmail.com>
Wed, 8 Jun 2011 23:25:52 +0000 (01:25 +0200)
NOTE: This is a candidate for the 7.10 branch.

src/gallium/drivers/r300/r300_render.c

index 479503f8f65d5ede7f76f9c593178a124f9570a0..d9399d78ef96ce33f0995c1360ed33b22003a0a6 100644 (file)
@@ -673,10 +673,11 @@ static void r300_draw_elements(struct r300_context *r300,
                                 indices3);
     } else {
         do {
-            if (indexSize == 2 && (start & 1))
-                short_count = MIN2(count, 65535);
-            else
-                short_count = MIN2(count, 65534);
+            /* The maximum must be divisible by 4 and 3,
+             * so that quad and triangle lists are split correctly.
+             *
+             * Strips, loops, and fans won't work. */
+            short_count = MIN2(count, 65532);
 
             r300_emit_draw_elements(r300, indexBuffer, indexSize,
                                      info->min_index, info->max_index,
@@ -722,7 +723,11 @@ static void r300_draw_arrays(struct r300_context *r300,
         r300_emit_draw_arrays(r300, info->mode, count);
     } else {
         do {
-            short_count = MIN2(count, 65535);
+            /* The maximum must be divisible by 4 and 3,
+             * so that quad and triangle lists are split correctly.
+             *
+             * Strips, loops, and fans won't work. */
+            short_count = MIN2(count, 65532);
             r300_emit_draw_arrays(r300, info->mode, short_count);
 
             start += short_count;