Mesa (master): iris: Report use of any in-flight buffers on first draw call after sync boundary.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jun 3 23:24:44 UTC 2020


Module: Mesa
Branch: master
Commit: 4b7fd91be656ecc7944b7523b28246366cf5a8b7
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4b7fd91be656ecc7944b7523b28246366cf5a8b7

Author: Francisco Jerez <currojerez at riseup.net>
Date:   Thu Feb  6 21:06:17 2020 -0800

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 <kenneth at whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3875>

---

 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);



More information about the mesa-commit mailing list