Mesa (master): iris: Move the URB size checks into iris_update_compiled_xs

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jan 27 18:53:28 UTC 2021


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

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Tue Jan 26 00:47:08 2021 -0800

iris: Move the URB size checks into iris_update_compiled_xs

Instead of looping over all stages and re-accessing prog_data at the
end, we can just move the URB size check into iris_update_compiled_xs,
in the new != old block, where we know the shader changed - plus where
we're disabling tessellation.  We already have the prog_data handy in
these cases, with a bit less pointer chasing.

Improves performance in Piglit's drawoverhead microbenchmark
(#63: DrawArrays, no state change) by 4.07856% +/- 0.540517% (n=850).

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8721>

---

 src/gallium/drivers/iris/iris_program.c | 73 ++++++++++++++++-----------------
 1 file changed, 36 insertions(+), 37 deletions(-)

diff --git a/src/gallium/drivers/iris/iris_program.c b/src/gallium/drivers/iris/iris_program.c
index 8d4542ecc10..3a618d3803d 100644
--- a/src/gallium/drivers/iris/iris_program.c
+++ b/src/gallium/drivers/iris/iris_program.c
@@ -1074,6 +1074,25 @@ iris_debug_recompile(struct iris_context *ice,
    brw_debug_key_recompile(c, &ice->dbg, info->stage, &old_key.base, key);
 }
 
+static void
+check_urb_size(struct iris_context *ice,
+               unsigned needed_size,
+               gl_shader_stage stage)
+{
+   unsigned last_allocated_size = ice->shaders.urb.size[stage];
+
+   /* If the last URB allocation wasn't large enough for our needs,
+    * flag it as needing to be reconfigured.  Otherwise, we can use
+    * the existing config.  However, if the URB is constrained, and
+    * we can shrink our size for this stage, we may be able to gain
+    * extra concurrency by reconfiguring it to be smaller.  Do so.
+    */
+   if (last_allocated_size < needed_size ||
+       (ice->shaders.urb.constrained && last_allocated_size > needed_size)) {
+      ice->state.dirty |= IRIS_DIRTY_URB;
+   }
+}
+
 /**
  * Get the shader for the last enabled geometry stage.
  *
@@ -1202,7 +1221,8 @@ iris_update_compiled_vs(struct iris_context *ice)
       shs->sysvals_need_upload = true;
 
       const struct brw_vs_prog_data *vs_prog_data =
-            (void *) shader->prog_data;
+         (void *) shader->prog_data;
+      const struct brw_vue_prog_data *vue_prog_data = &vs_prog_data->base;
       const bool uses_draw_params = vs_prog_data->uses_firstvertex ||
                                     vs_prog_data->uses_baseinstance;
       const bool uses_derived_draw_params = vs_prog_data->uses_drawid ||
@@ -1221,6 +1241,8 @@ iris_update_compiled_vs(struct iris_context *ice)
       ice->state.vs_uses_derived_draw_params = uses_derived_draw_params;
       ice->state.vs_needs_sgvs_element = needs_sgvs_element;
       ice->state.vs_needs_edge_flag = ish->needs_edge_flag;
+
+      check_urb_size(ice, vue_prog_data->urb_entry_size, MESA_SHADER_VERTEX);
    }
 }
 
@@ -1414,6 +1436,9 @@ iris_update_compiled_tcs(struct iris_context *ice)
                                 IRIS_STAGE_DIRTY_BINDINGS_TCS |
                                 IRIS_STAGE_DIRTY_CONSTANTS_TCS;
       shs->sysvals_need_upload = true;
+
+      const struct brw_vue_prog_data *prog_data = (void *) shader->prog_data;
+      check_urb_size(ice, prog_data->urb_entry_size, MESA_SHADER_TESS_CTRL);
    }
 }
 
@@ -1525,6 +1550,9 @@ iris_update_compiled_tes(struct iris_context *ice)
                                 IRIS_STAGE_DIRTY_BINDINGS_TES |
                                 IRIS_STAGE_DIRTY_CONSTANTS_TES;
       shs->sysvals_need_upload = true;
+
+      const struct brw_vue_prog_data *prog_data = (void *) shader->prog_data;
+      check_urb_size(ice, prog_data->urb_entry_size, MESA_SHADER_TESS_EVAL);
    }
 
    /* TODO: Could compare and avoid flagging this. */
@@ -1644,6 +1672,10 @@ iris_update_compiled_gs(struct iris_context *ice)
                                 IRIS_STAGE_DIRTY_BINDINGS_GS |
                                 IRIS_STAGE_DIRTY_CONSTANTS_GS;
       shs->sysvals_need_upload = true;
+
+      unsigned urb_entry_size = shader ?
+         ((struct brw_vue_prog_data *) shader->prog_data)->urb_entry_size : 0;
+      check_urb_size(ice, urb_entry_size, MESA_SHADER_GEOMETRY);
    }
 }
 
@@ -1826,18 +1858,6 @@ iris_update_pull_constant_descriptors(struct iris_context *ice,
       ice->state.stage_dirty |= IRIS_STAGE_DIRTY_BINDINGS_VS << stage;
 }
 
-/**
- * Get the prog_data for a given stage, or NULL if the stage is disabled.
- */
-static struct brw_vue_prog_data *
-get_vue_prog_data(struct iris_context *ice, gl_shader_stage stage)
-{
-   if (!ice->shaders.prog[stage])
-      return NULL;
-
-   return (void *) ice->shaders.prog[stage]->prog_data;
-}
-
 /**
  * Update the current shader variants for the given state.
  *
@@ -1848,7 +1868,6 @@ get_vue_prog_data(struct iris_context *ice, gl_shader_stage stage)
 void
 iris_update_compiled_shaders(struct iris_context *ice)
 {
-   const uint64_t dirty = ice->state.dirty;
    const uint64_t stage_dirty = ice->state.stage_dirty;
 
    if (stage_dirty & (IRIS_STAGE_DIRTY_UNCOMPILED_TCS |
@@ -1865,6 +1884,9 @@ iris_update_compiled_shaders(struct iris_context *ice)
              IRIS_STAGE_DIRTY_TCS | IRIS_STAGE_DIRTY_TES |
              IRIS_STAGE_DIRTY_BINDINGS_TCS | IRIS_STAGE_DIRTY_BINDINGS_TES |
              IRIS_STAGE_DIRTY_CONSTANTS_TCS | IRIS_STAGE_DIRTY_CONSTANTS_TES;
+
+          if (ice->shaders.urb.constrained)
+             ice->state.dirty |= IRIS_DIRTY_URB;
        }
    }
 
@@ -1922,29 +1944,6 @@ iris_update_compiled_shaders(struct iris_context *ice)
    if (stage_dirty & IRIS_STAGE_DIRTY_UNCOMPILED_FS)
       iris_update_compiled_fs(ice);
 
-   /* Changing shader interfaces may require a URB configuration. */
-   if (!(dirty & IRIS_DIRTY_URB)) {
-      for (int i = MESA_SHADER_VERTEX; i <= MESA_SHADER_GEOMETRY; i++) {
-         struct brw_vue_prog_data *prog_data = get_vue_prog_data(ice, i);
-
-         unsigned needed_size = prog_data ? prog_data->urb_entry_size : 0;
-         unsigned last_allocated_size = ice->shaders.urb.size[i];
-
-         /* If the last URB allocation wasn't large enough for our needs,
-          * flag it as needing to be reconfigured.  Otherwise, we can use
-          * the existing config.  However, if the URB is constrained, and
-          * we can shrink our size for this stage, we may be able to gain
-          * extra concurrency by reconfiguring it to be smaller.  Do so.
-          */
-         if (last_allocated_size < needed_size ||
-             (ice->shaders.urb.constrained &&
-              last_allocated_size > needed_size)) {
-            ice->state.dirty |= IRIS_DIRTY_URB;
-            break;
-         }
-      }
-   }
-
    for (int i = MESA_SHADER_VERTEX; i <= MESA_SHADER_FRAGMENT; i++) {
       if (ice->state.stage_dirty & (IRIS_STAGE_DIRTY_CONSTANTS_VS << i))
          iris_update_pull_constant_descriptors(ice, i);



More information about the mesa-commit mailing list