diff --git a/src/gallium/drivers/iris/iris_draw.c b/src/gallium/drivers/iris/iris_draw.c index 2f76be17968..0616571c72b 100644 --- a/src/gallium/drivers/iris/iris_draw.c +++ b/src/gallium/drivers/iris/iris_draw.c @@ -187,10 +187,19 @@ iris_indirect_draw_vbo(struct iris_context *ice, struct pipe_draw_info info = *dinfo; struct pipe_draw_indirect_info indirect = *dindirect; - if (indirect.indirect_draw_count && - ice->state.predicate == IRIS_PREDICATE_STATE_USE_BIT) { - /* Upload MI_PREDICATE_RESULT to GPR15.*/ - batch->screen->vtbl.load_register_reg64(batch, CS_GPR(15), MI_PREDICATE_RESULT); + iris_emit_buffer_barrier_for(batch, iris_resource_bo(indirect.buffer), + IRIS_DOMAIN_VF_READ); + + if (indirect.indirect_draw_count) { + struct iris_bo *draw_count_bo = + iris_resource_bo(indirect.indirect_draw_count); + iris_emit_buffer_barrier_for(batch, draw_count_bo, + IRIS_DOMAIN_OTHER_READ); + + if (ice->state.predicate == IRIS_PREDICATE_STATE_USE_BIT) { + /* Upload MI_PREDICATE_RESULT to GPR15.*/ + batch->screen->vtbl.load_register_reg64(batch, CS_GPR(15), MI_PREDICATE_RESULT); + } } const uint64_t orig_dirty = ice->state.dirty; diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c index be87c60854e..a6d56684c6e 100644 --- a/src/gallium/drivers/iris/iris_state.c +++ b/src/gallium/drivers/iris/iris_state.c @@ -6735,10 +6735,6 @@ iris_upload_render_state(struct iris_context *ice, unsigned draw_count_offset = indirect->indirect_draw_count_offset; - iris_emit_pipe_control_flush(batch, - "ensure indirect draw buffer is flushed", - PIPE_CONTROL_FLUSH_ENABLE); - if (ice->state.predicate == IRIS_PREDICATE_STATE_USE_BIT) { struct mi_builder b; mi_builder_init(&b, &batch->screen->devinfo, batch);