static boolean
draw_pt_arrays(struct draw_context *draw,
unsigned prim,
+ bool index_bias_varies,
const struct pipe_draw_start_count_bias *draw_info,
unsigned num_draws)
{
} else
draw_pt_split_prim(prim, &first, &incr);
count = draw_pt_trim_count(draw_info[i].count, first, incr);
- draw->pt.user.eltBias = draw->pt.user.eltSize ? draw_info[i].index_bias : 0;
+ draw->pt.user.eltBias = draw->pt.user.eltSize ?
+ (index_bias_varies ? draw_info[i].index_bias : draw_info[0].index_bias) :
+ 0;
if (count >= first)
frontend->run( frontend, draw_info[i].start, count );
if (i < elt_max && restart_idx == info->restart_index) {
if (cur.count > 0) {
/* draw elts up to prev pos */
- draw_pt_arrays(draw, info->mode, &cur, 1);
+ draw_pt_arrays(draw, info->mode, info->index_bias_varies, &cur, 1);
}
/* begin new prim at next elt */
cur.start = i + 1;
}
}
if (cur.count > 0) {
- draw_pt_arrays(draw, info->mode, &cur, 1);
+ draw_pt_arrays(draw, info->mode, info->index_bias_varies, &cur, 1);
}
}
/* Non-indexed prims (draw_arrays).
* Primitive restart should have been handled in gallium frontends.
*/
- draw_pt_arrays(draw, prim, draw_info, num_draws);
+ draw_pt_arrays(draw, prim, info->index_bias_varies, draw_info, num_draws);
}
}
draw_pt_arrays_restart(draw, info, draws, num_draws);
}
else {
- draw_pt_arrays(draw, info->mode, draws, num_draws);
+ draw_pt_arrays(draw, info->mode, info->index_bias_varies, draws, num_draws);
}
}
}
if (0) {
for (unsigned i = 0; i < num_draws; i++)
- draw_print_arrays(draw, use_info->mode, use_draws[i].start, MIN2(use_draws[i].count, 20), use_draws[i].index_bias);
+ draw_print_arrays(draw, use_info->mode, use_draws[i].start, MIN2(use_draws[i].count, 20),
+ use_info->index_bias_varies ? use_draws[i].index_bias : use_draws[0].index_bias);
}
index_limit = util_draw_max_index(draw->pt.vertex_buffer,