diff --git a/src/gallium/drivers/iris/iris_batch.c b/src/gallium/drivers/iris/iris_batch.c index 8a87f5939cd..5e201116601 100644 --- a/src/gallium/drivers/iris/iris_batch.c +++ b/src/gallium/drivers/iris/iris_batch.c @@ -181,6 +181,7 @@ iris_init_batch(struct iris_context *ice, batch->state_sizes = ice->state.sizes; batch->name = name; batch->ice = ice; + batch->contains_fence_signal = false; batch->fine_fences.uploader = u_upload_create(&ice->ctx, 4096, PIPE_BIND_CUSTOM, @@ -394,6 +395,7 @@ iris_batch_reset(struct iris_batch *batch) batch->primary_batch_size = 0; batch->total_chained_batch_size = 0; batch->contains_draw = false; + batch->contains_fence_signal = false; batch->decoder.surface_base = batch->last_surface_base_address; create_batch(batch); @@ -686,7 +688,8 @@ _iris_batch_flush(struct iris_batch *batch, const char *file, int line) { struct iris_screen *screen = batch->screen; - if (iris_batch_bytes_used(batch) == 0) + /* If a fence signals we need to flush it. */ + if (iris_batch_bytes_used(batch) == 0 && !batch->contains_fence_signal) return; iris_measure_batch_end(batch->ice, batch); diff --git a/src/gallium/drivers/iris/iris_batch.h b/src/gallium/drivers/iris/iris_batch.h index 302ebd5f360..51c407e1fe2 100644 --- a/src/gallium/drivers/iris/iris_batch.h +++ b/src/gallium/drivers/iris/iris_batch.h @@ -162,6 +162,9 @@ struct iris_batch { /** Have we emitted any draw calls with next_seqno? */ bool contains_draw_with_next_seqno; + /** Batch contains fence signal operation. */ + bool contains_fence_signal; + /** * Number of times iris_batch_sync_region_start() has been called without a * matching iris_batch_sync_region_end() on this batch. diff --git a/src/gallium/drivers/iris/iris_fence.c b/src/gallium/drivers/iris/iris_fence.c index bc04fdc48c4..843f0e66e27 100644 --- a/src/gallium/drivers/iris/iris_fence.c +++ b/src/gallium/drivers/iris/iris_fence.c @@ -579,6 +579,7 @@ iris_fence_signal(struct pipe_context *ctx, if (iris_fine_fence_signaled(fine)) continue; + ice->batches[b].contains_fence_signal = true; iris_batch_add_syncobj(&ice->batches[b], fine->syncobj, I915_EXEC_FENCE_SIGNAL); }