- struct vbo_context *vbo = vbo_context(ctx);
- vbo_draw_func draw_prims_func = vbo->draw_prims;
- GLboolean map_ib = ib->obj->Name && !ib->obj->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) {
+ const uint32_t *indirect_params;
+ if (!ctx->Driver.MapBufferRange(ctx, 0, indirect->Size, GL_MAP_READ_BIT,
+ indirect, MAP_INTERNAL)) {
+
+ /* something went wrong with mapping, give up */
+ _mesa_error(ctx, GL_OUT_OF_MEMORY,
+ "failed to map indirect buffer for sw primitive restart");
+ return;
+ }
+
+ assert(nr_prims == 1);
+ new_prim = prims[0];
+ indirect_params = (const uint32_t *)
+ ADD_POINTERS(indirect->Mappings[MAP_INTERNAL].Pointer,
+ indirect_offset);
+
+ new_prim.count = indirect_params[0];
+ new_prim.start = indirect_params[2];
+ new_prim.basevertex = indirect_params[3];
+
+ num_instances = indirect_params[1];
+ base_instance = indirect_params[4];
+
+ new_ib = *ib;
+ new_ib.count = new_prim.count;
+
+ prims = &new_prim;
+ ib = &new_ib;
+
+ ctx->Driver.UnmapBuffer(ctx, indirect, MAP_INTERNAL);
+ }