From 4b7fd91be656ecc7944b7523b28246366cf5a8b7 Mon Sep 17 00:00:00 2001 From: Francisco Jerez Date: Thu, 6 Feb 2020 21:06:17 -0800 Subject: [PATCH] iris: Report use of any in-flight buffers on first draw call after sync boundary. This is the main performance trade-off of this cache tracking mechanism: In order for the seqno vector of buffer objects to be accurate, they need to be marked as used again every time the batch is split into a new synchronization section if they remain bound to the pipeline. This can be achieved easily by re-using iris_restore_render_saved_bos() and iris_restore_compute_saved_bos(), which currently serve a similar purpose across batch buffer boundaries. The impact on Piglit drawoverhead results seems to be within a standard deviation of the current results. XXX - It might be possible to completely remove the current iris_batch::contains_draw flag at a small additional performance cost. Reviewed-by: Kenneth Graunke Part-of: --- src/gallium/drivers/iris/iris_batch.h | 4 ++++ src/gallium/drivers/iris/iris_state.c | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/iris/iris_batch.h b/src/gallium/drivers/iris/iris_batch.h index bfea20d268c..00f62f2fb6f 100644 --- a/src/gallium/drivers/iris/iris_batch.h +++ b/src/gallium/drivers/iris/iris_batch.h @@ -153,6 +153,9 @@ struct iris_batch { /** Have we emitted any draw calls to this batch? */ bool contains_draw; + /** Have we emitted any draw calls with next_seqno? */ + bool contains_draw_with_next_seqno; + /** * Number of times iris_batch_sync_region_start() has been called without a * matching iris_batch_sync_region_end() on this batch. @@ -304,6 +307,7 @@ static inline void iris_batch_sync_boundary(struct iris_batch *batch) { if (!batch->sync_region_depth) { + batch->contains_draw_with_next_seqno = false; batch->next_seqno = p_atomic_inc_return(&batch->screen->last_seqno); assert(batch->next_seqno > 0); } diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c index 786a188746e..5c8921b704f 100644 --- a/src/gallium/drivers/iris/iris_state.c +++ b/src/gallium/drivers/iris/iris_state.c @@ -6362,9 +6362,9 @@ iris_upload_render_state(struct iris_context *ice, iris_use_pinned_bo(batch, ice->state.binder.bo, false, IRIS_DOMAIN_NONE); - if (!batch->contains_draw) { + if (!batch->contains_draw_with_next_seqno) { iris_restore_render_saved_bos(ice, batch, draw); - batch->contains_draw = true; + batch->contains_draw_with_next_seqno = batch->contains_draw = true; } iris_upload_dirty_render_state(ice, batch, draw); @@ -6744,9 +6744,9 @@ iris_upload_compute_state(struct iris_context *ice, iris_emit_cmd(batch, GENX(MEDIA_STATE_FLUSH), msf); - if (!batch->contains_draw) { + if (!batch->contains_draw_with_next_seqno) { iris_restore_compute_saved_bos(ice, batch, grid); - batch->contains_draw = true; + batch->contains_draw_with_next_seqno = batch->contains_draw = true; } iris_batch_sync_region_end(batch); -- 2.30.2