[Mesa-dev] [PATCH 1/3] i965: Move down genX_upload_sbe in profiles.

Chris Wilson chris at chris-wilson.co.uk
Sat Jun 2 07:58:14 UTC 2018


Quoting Mathias.Froehlich at gmx.net (2018-05-17 07:38:26)
> From: Mathias Fröhlich <mathias.froehlich at web.de>
> 
> Avoid looping over all VARYING_SLOT_MAX urb_setup array
> entries from genX_upload_sbe. Prepare an array indirection
> to the active entries of urb_setup already in the compile
> step. On upload only walk the active arrays.
> 
> Signed-off-by: Mathias Fröhlich <Mathias.Froehlich at web.de>
> ---
>  src/intel/compiler/brw_compiler.h             |  7 +++++++
>  src/intel/compiler/brw_fs.cpp                 | 23 +++++++++++++++++++++++
>  src/intel/compiler/brw_fs.h                   |  2 ++
>  src/intel/compiler/brw_fs_visitor.cpp         |  1 +
>  src/mesa/drivers/dri/i965/genX_state_upload.c |  7 +++----
>  5 files changed, 36 insertions(+), 4 deletions(-)
> 
> diff --git a/src/intel/compiler/brw_compiler.h b/src/intel/compiler/brw_compiler.h
> index 8b4e6fe2e2..a9df45e00d 100644
> --- a/src/intel/compiler/brw_compiler.h
> +++ b/src/intel/compiler/brw_compiler.h
> @@ -743,6 +743,13 @@ struct brw_wm_prog_data {
>      * For varying slots that are not used by the FS, the value is -1.
>      */
>     int urb_setup[VARYING_SLOT_MAX];
> +   /**
> +    * Cache structure into the urb_setup array above that contains the
> +    * attribute numbers of active varyings out of urb_setup.
> +    * The actual count is stored in urb_setup_attribs_count.
> +    */
> +   int urb_setup_attribs[VARYING_SLOT_MAX];
> +   int urb_setup_attribs_count;
>  };
>  
>  struct brw_push_const_block {
> diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp
> index b21996c168..6930414067 100644
> --- a/src/intel/compiler/brw_fs.cpp
> +++ b/src/intel/compiler/brw_fs.cpp
> @@ -1507,6 +1507,25 @@ fs_visitor::assign_curb_setup()
>     this->first_non_payload_grf = payload.num_regs + prog_data->curb_read_length;
>  }
>  
> +/*
> + * Build up an array of indices into the urb_setup array that
> + * references the active entries of the urb_setup array.
> + * Used to accelerate walking the active entries of the urb_setup array
> + * on each upload.
> + */
> +void
> +brw_compute_urb_setup_index(struct brw_wm_prog_data *wm_prog_data)
> +{
> +   int index = 0;
> +   for (int attr = 0; attr < VARYING_SLOT_MAX; attr++) {
> +      int input_index = wm_prog_data->urb_setup[attr];
> +      if (input_index < 0)
> +         continue;
> +      wm_prog_data->urb_setup_attribs[index++] = attr;

So far the only consumer of this wants the input_index again.
Does that change, or is it worth including both to avoid the trawl?

Is uint8_t (with a STATIC_ASSERT) good enough?
-Chris


More information about the mesa-dev mailing list