mesa: don't ever bind NullBufferObj for glBindBuffer targets
[mesa.git] / src / mesa / vbo / vbo_primitive_restart.c
index b4b3cdf8d4c2337c280b40f7e8fc54690d7ac752..1349740249f513a47251a3c7d99e4b8129cfddc3 100644 (file)
@@ -29,7 +29,7 @@
  */
 
 #include "main/errors.h"
-#include "main/imports.h"
+#include "util/imports.h"
 #include "main/macros.h"
 #include "main/varray.h"
 
@@ -164,6 +164,7 @@ vbo_sw_primitive_restart(struct gl_context *ctx,
                          const struct _mesa_prim *prims,
                          GLuint nr_prims,
                          const struct _mesa_index_buffer *ib,
+                         GLuint num_instances, GLuint base_instance,
                          struct gl_buffer_object *indirect,
                          GLsizeiptr indirect_offset)
 {
@@ -176,10 +177,10 @@ vbo_sw_primitive_restart(struct gl_context *ctx,
    GLuint sub_prim_num;
    GLuint end_index;
    GLuint sub_end_index;
-   GLuint restart_index = _mesa_primitive_restart_index(ctx, ib->index_size);
+   GLuint restart_index = _mesa_primitive_restart_index(ctx, 1 << ib->index_size_shift);
    struct _mesa_prim temp_prim;
-   GLboolean map_ib = ib->obj->Name && !ib->obj->Mappings[MAP_INTERNAL].Pointer;
-   void *ptr;
+   GLboolean map_ib = ib->obj && !ib->obj->Mappings[MAP_INTERNAL].Pointer;
+   const void *ptr;
 
    /* If there is an indirect buffer, map it and extract the draw params */
    if (indirect) {
@@ -200,10 +201,11 @@ vbo_sw_primitive_restart(struct gl_context *ctx,
                                      indirect_offset);
 
       new_prim.count = indirect_params[0];
-      new_prim.num_instances = indirect_params[1];
       new_prim.start = indirect_params[2];
       new_prim.basevertex = indirect_params[3];
-      new_prim.base_instance = indirect_params[4];
+
+      num_instances = indirect_params[1];
+      base_instance = indirect_params[4];
 
       new_ib = *ib;
       new_ib.count = new_prim.count;
@@ -222,9 +224,12 @@ vbo_sw_primitive_restart(struct gl_context *ctx,
                                  ib->obj, MAP_INTERNAL);
    }
 
-   ptr = ADD_POINTERS(ib->obj->Mappings[MAP_INTERNAL].Pointer, ib->ptr);
+   if (ib->obj)
+      ptr = ADD_POINTERS(ib->obj->Mappings[MAP_INTERNAL].Pointer, ib->ptr);
+   else
+      ptr = ib->ptr;
 
-   sub_prims = find_sub_primitives(ptr, ib->index_size,
+   sub_prims = find_sub_primitives(ptr, 1 << ib->index_size_shift,
                                    0, ib->count, restart_index,
                                    &num_sub_prims);
 
@@ -249,10 +254,12 @@ vbo_sw_primitive_restart(struct gl_context *ctx,
                 (temp_prim.count == sub_prim->count)) {
                ctx->Driver.Draw(ctx, &temp_prim, 1, ib, GL_TRUE,
                                 sub_prim->min_index, sub_prim->max_index,
+                                num_instances, base_instance,
                                 NULL, 0);
             } else {
                ctx->Driver.Draw(ctx, &temp_prim, 1, ib,
                                 GL_FALSE, -1, -1,
+                                num_instances, base_instance,
                                 NULL, 0);
             }
          }