const struct _mesa_prim *prim,
unsigned prim_id,
struct brw_transform_feedback_object *xfb_obj,
- unsigned stream,
- struct gl_buffer_object *indirect)
+ unsigned stream)
{
struct brw_context *brw = brw_context(ctx);
const struct gen_device_info *devinfo = &brw->screen->devinfo;
bool fail_next;
+ bool is_indirect = brw->draw.draw_indirect_data != NULL;
/* Flag BRW_NEW_DRAW_CALL on every draw. This allows us to have
* atoms that happen on every draw call.
vs_prog_data->uses_firstvertex ||
vs_prog_data->uses_baseinstance;
- if ((uses_draw_parameters && indirect) ||
+ if ((uses_draw_parameters && is_indirect) ||
(vs_prog_data->uses_firstvertex &&
brw->draw.params.firstvertex != new_firstvertex) ||
(vs_prog_data->uses_baseinstance &&
brw->draw.params.gl_baseinstance = new_baseinstance;
brw_bo_unreference(brw->draw.draw_params_bo);
- if (indirect) {
+ if (is_indirect) {
/* Point draw_params_bo at the indirect buffer. */
brw->draw.draw_params_bo =
intel_buffer_object(ctx->DrawIndirectBuffer)->buffer;
if (devinfo->gen == 9)
gen9_emit_preempt_wa(brw, prim);
- brw_emit_prim(brw, prim, brw->primitive, xfb_obj, stream, !!indirect);
+ brw_emit_prim(brw, prim, brw->primitive, xfb_obj, stream, is_indirect);
brw->batch.no_wrap = false;
GLuint max_index,
struct gl_transform_feedback_object *gl_xfb_obj,
unsigned stream,
- struct gl_buffer_object *indirect)
+ UNUSED struct gl_buffer_object *unused_indirect)
{
unsigned i;
struct brw_context *brw = brw_context(ctx);
return;
/* Handle primitive restart if needed */
- if (brw_handle_primitive_restart(ctx, prims, nr_prims, ib, indirect)) {
+ if (brw_handle_primitive_restart(ctx, prims, nr_prims, ib)) {
/* The draw was handled, so we can exit now */
return;
}
brw->predicate.state = BRW_PREDICATE_STATE_USE_BIT;
}
- brw_draw_single_prim(ctx, &prims[i], i, xfb_obj, stream, indirect);
+ brw_draw_single_prim(ctx, &prims[i], i, xfb_obj, stream);
}
brw_finish_drawing(ctx);
brw->draw.draw_params_count_offset = indirect_params_offset;
}
+ brw->draw.draw_indirect_data = indirect_data;
+
brw_draw_prims(ctx, prim, draw_count,
ib, false, 0, ~0,
NULL, 0,
- indirect_data);
+ NULL);
+ brw->draw.draw_indirect_data = NULL;
free(prim);
}
brw_handle_primitive_restart(struct gl_context *ctx,
const struct _mesa_prim *prims,
GLuint nr_prims,
- const struct _mesa_index_buffer *ib,
- struct gl_buffer_object *indirect)
+ const struct _mesa_index_buffer *ib)
{
struct brw_context *brw = brw_context(ctx);
*/
brw->prim_restart.enable_cut_index = true;
brw_draw_prims(ctx, prims, nr_prims, ib, GL_FALSE, -1, -1, NULL, 0,
- indirect);
+ NULL);
brw->prim_restart.enable_cut_index = false;
} else {
/* Not all the primitive draw modes are supported by the cut index,
* so take the software path
*/
- vbo_sw_primitive_restart(ctx, prims, nr_prims, ib, indirect);
+ struct gl_buffer_object *indirect_data = brw->draw.draw_indirect_data;
+
+ /* Clear this to make the draw direct. */
+ brw->draw.draw_indirect_data = NULL;
+
+ vbo_sw_primitive_restart(ctx, prims, nr_prims, ib, indirect_data);
}
brw->prim_restart.in_progress = false;