draw: fix non-indexed draw calls if there's an index buffer
authorMarek Olšák <maraeo@gmail.com>
Fri, 14 Sep 2012 15:03:25 +0000 (17:03 +0200)
committerMarek Olšák <maraeo@gmail.com>
Sat, 22 Sep 2012 12:20:37 +0000 (14:20 +0200)
pipe_draw_info::indexed determines if it should be indexed and not
the presence of an index buffer.

This fixes crashes in r300g.

NOTE: This is a candidate for the stable branches.

Tested-by: Michel Dänzer <michel.daenzer@amd.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/auxiliary/draw/draw_context.c
src/gallium/auxiliary/draw/draw_private.h
src/gallium/auxiliary/draw/draw_pt.c

index 1aa9b615bc8e797fc405cf3909a1bdd12d868a6d..53be8f7eac58b2481a3d03f6d6f3a21bd259a404 100644 (file)
@@ -621,7 +621,7 @@ draw_set_indexes(struct draw_context *draw,
           elem_size == 2 ||
           elem_size == 4);
    draw->pt.user.elts = elements;
-   draw->pt.user.eltSize = elem_size;
+   draw->pt.user.eltSizeIB = elem_size;
 }
 
 
index c2af0f36bcadd6e4432358ef0fab0750243c4b23..5c497c6471841c9747bb06400f0058799e6065b7 100644 (file)
@@ -174,6 +174,7 @@ struct draw_context
          /** vertex element/index buffer (ex: glDrawElements) */
          const void *elts;
          /** bytes per index (0, 1, 2 or 4) */
+         unsigned eltSizeIB;
          unsigned eltSize;
          int eltBias;
          unsigned min_index;
index 5b6eaa739d04ac5ad04ab7bbb1d28e581ad414de..08e06e84aedc602a394166bb891180f36878de76 100644 (file)
@@ -362,7 +362,7 @@ draw_pt_arrays_restart(struct draw_context *draw,
 
    assert(info->primitive_restart);
 
-   if (draw->pt.user.elts) {
+   if (draw->pt.user.eltSize) {
       /* indexed prims (draw_elements) */
       cur_start = start;
       cur_count = 0;
@@ -433,12 +433,8 @@ draw_arrays_instanced(struct draw_context *draw,
    info.count = count;
    info.start_instance = startInstance;
    info.instance_count = instanceCount;
-
-   info.indexed = (draw->pt.user.elts != NULL);
-   if (!info.indexed) {
-      info.min_index = start;
-      info.max_index = start + count - 1;
-   }
+   info.min_index = start;
+   info.max_index = start + count - 1;
 
    draw_vbo(draw, &info);
 }
@@ -465,6 +461,7 @@ draw_vbo(struct draw_context *draw,
    draw->pt.user.eltBias = info->index_bias;
    draw->pt.user.min_index = info->min_index;
    draw->pt.user.max_index = info->max_index;
+   draw->pt.user.eltSize = info->indexed ? draw->pt.user.eltSizeIB : 0;
 
    if (0)
       debug_printf("draw_vbo(mode=%u start=%u count=%u):\n",