[Mesa-dev] [PATCH 7/7] i965: Make uniform offsets be in terms of bytes

Kenneth Graunke kenneth at whitecape.org
Mon Dec 7 17:26:58 PST 2015


On Monday, December 07, 2015 04:52:27 PM Jason Ekstrand wrote:
> This commit pushes makes uniform offsets be terms of bytes starting with
> nir_lower_io.  They get converted to be in terms of vec4s or floats when we
> cram them in the UNIFORM register file but reladdr remains in terms of
> bytes all the way down to the point where we lower it to a pull constant
> load.
> ---
>  src/mesa/drivers/dri/i965/brw_fs.cpp           |  4 +---
>  src/mesa/drivers/dri/i965/brw_fs_nir.cpp       | 14 +++++++-----
>  src/mesa/drivers/dri/i965/brw_nir.c            | 30 +++++++++++++++++++++++---
>  src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp |  6 ++----
>  src/mesa/drivers/dri/i965/brw_vec4_nir.cpp     | 12 +++++++----
>  src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp |  3 +--
>  6 files changed, 48 insertions(+), 21 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index de5c17a..5e8acec 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -2052,11 +2052,9 @@ fs_visitor::demote_pull_constants()
>  
>           /* Generate a pull load into dst. */
>           if (inst->src[i].reladdr) {
> -            fs_reg indirect = ibld.vgrf(BRW_REGISTER_TYPE_D);
> -            ibld.MUL(indirect, *inst->src[i].reladdr, brw_imm_d(4));
>              VARYING_PULL_CONSTANT_LOAD(ibld, dst,
>                                         brw_imm_ud(index),
> -                                       indirect,
> +                                       *inst->src[i].reladdr,
>                                         pull_index * 4);
>              inst->src[i].reladdr = NULL;
>              inst->src[i].stride = 1;
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> index c34f856..e856e32 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> @@ -173,7 +173,7 @@ fs_visitor::nir_setup_uniforms()
>     if (dispatch_width != 8)
>        return;
>  
> -   uniforms = nir->num_uniforms;
> +   uniforms = nir->num_uniforms / 4;
>  
>     nir_foreach_variable(var, &nir->uniforms) {
>        /* UBO's and atomics don't take up space in the uniform file */
> @@ -181,7 +181,7 @@ fs_visitor::nir_setup_uniforms()
>           continue;
>  
>        if (type_size_scalar(var->type) > 0)
> -         param_size[var->data.driver_location] = type_size_scalar(var->type);
> +         param_size[var->data.driver_location / 4] = type_size_scalar(var->type);
>     }
>  }
>  
> @@ -1165,7 +1165,7 @@ fs_visitor::get_nir_image_deref(const nir_deref_var *deref)
>              bld.MOV(tmp, get_nir_src(deref_array->indirect));
>           }
>  
> -         bld.MUL(tmp, tmp, brw_imm_ud(element_size));
> +         bld.MUL(tmp, tmp, brw_imm_ud(element_size * 4));
>           if (image.reladdr)
>              bld.ADD(*image.reladdr, *image.reladdr, tmp);
>           else
> @@ -2300,8 +2300,12 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
>        has_indirect = true;
>        /* fallthrough */
>     case nir_intrinsic_load_uniform: {
> -      fs_reg uniform_reg(UNIFORM, instr->const_index[0]);
> -      uniform_reg.reg_offset = instr->const_index[1];
> +      /* Offsets are in bytes but they should always be multiples of 4 */
> +      assert(instr->const_index[0] % 4 == 0);
> +      assert(instr->const_index[1] % 4 == 0);
> +
> +      fs_reg uniform_reg(UNIFORM, instr->const_index[0] / 4);
> +      uniform_reg.reg_offset = instr->const_index[1] / 4;
>  
>        for (unsigned j = 0; j < instr->num_components; j++) {
>           fs_reg src = offset(retype(uniform_reg, dest.type), bld, j);
> diff --git a/src/mesa/drivers/dri/i965/brw_nir.c b/src/mesa/drivers/dri/i965/brw_nir.c
> index 5182bca..d624703 100644
> --- a/src/mesa/drivers/dri/i965/brw_nir.c
> +++ b/src/mesa/drivers/dri/i965/brw_nir.c
> @@ -166,6 +166,32 @@ brw_nir_lower_outputs(nir_shader *nir, bool is_scalar)
>     }
>  }
>  
> +static int
> +type_size_scalar_bytes(const struct glsl_type *type)
> +{
> +   return type_size_scalar(type) * 4;
> +}
> +
> +static int
> +type_size_vec4_bytes(const struct glsl_type *type)
> +{
> +   return type_size_vec4(type) * 16;
> +}
> +
> +static void
> +brw_nir_lower_uniforms(nir_shader *nir, bool is_scalar)
> +{
> +   if (is_scalar) {
> +      nir_assign_var_locations(&nir->uniforms, &nir->num_uniforms,
> +                               type_size_scalar_bytes);
> +      nir_lower_io(nir, nir_var_uniform, type_size_scalar_bytes);
> +   } else {
> +      nir_assign_var_locations(&nir->uniforms, &nir->num_uniforms,
> +                               type_size_vec4_bytes);
> +      nir_lower_io(nir, nir_var_uniform, type_size_vec4_bytes);
> +   }
> +}
> +
>  #include "util/debug.h"
>  
>  static bool
> @@ -295,9 +321,7 @@ brw_lower_nir(nir_shader *nir,
>  
>     OPT_V(brw_nir_lower_inputs, devinfo, is_scalar);
>     OPT_V(brw_nir_lower_outputs, is_scalar);
> -   nir_assign_var_locations(&nir->uniforms,
> -                            &nir->num_uniforms,
> -                            is_scalar ? type_size_scalar : type_size_vec4);
> +   OPT_V(brw_nir_lower_uniforms, is_scalar);
>     OPT_V(nir_lower_io, nir_var_all, is_scalar ? type_size_scalar : type_size_vec4);
>  
>     if (shader_prog) {
> diff --git a/src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp b/src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp
> index 155a9c6..0849ca4 100644
> --- a/src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp
> @@ -34,8 +34,7 @@ brw_nir_setup_glsl_builtin_uniform(nir_variable *var,
>     const nir_state_slot *const slots = var->state_slots;
>     assert(var->state_slots != NULL);
>  
> -   unsigned uniform_index = is_scalar ? var->data.driver_location :
> -                                        var->data.driver_location * 4;
> +   unsigned uniform_index = var->data.driver_location / 4;
>     for (unsigned int i = 0; i < var->num_state_slots; i++) {
>        /* This state reference has already been setup by ir_to_mesa, but we'll
>         * get the same index back here.
> @@ -81,8 +80,7 @@ brw_nir_setup_glsl_uniform(gl_shader_stage stage, nir_variable *var,
>      * order we'd walk the type, so walk the list of storage and find anything
>      * with our name, or the prefix of a component that starts with our name.
>      */
> -   unsigned uniform_index = is_scalar ? var->data.driver_location :
> -                                        var->data.driver_location * 4;
> +   unsigned uniform_index = var->data.driver_location / 4;
>     for (unsigned u = 0; u < shader_prog->NumUniformStorage; u++) {
>        struct gl_uniform_storage *storage = &shader_prog->UniformStorage[u];
>  
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
> index d4eda4a..5089418 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
> @@ -117,7 +117,7 @@ vec4_visitor::nir_setup_system_values()
>  void
>  vec4_visitor::nir_setup_uniforms()
>  {
> -   uniforms = nir->num_uniforms;
> +   uniforms = nir->num_uniforms / 16;
>  
>     nir_foreach_variable(var, &nir->uniforms) {
>        /* UBO's and atomics don't take up space in the uniform file */
> @@ -125,7 +125,7 @@ vec4_visitor::nir_setup_uniforms()
>           continue;
>  
>        if (type_size_vec4(var->type) > 0)
> -         uniform_size[var->data.driver_location] = type_size_vec4(var->type);
> +         uniform_size[var->data.driver_location / 16] = type_size_vec4(var->type);
>     }
>  }
>  
> @@ -677,10 +677,14 @@ vec4_visitor::nir_emit_intrinsic(nir_intrinsic_instr *instr)
>        has_indirect = true;
>        /* fallthrough */
>     case nir_intrinsic_load_uniform: {
> +      /* Offsets are in bytes but they should always be multiples of 16 */
> +      assert(instr->const_index[0] % 4 == 0);
> +      assert(instr->const_index[1] % 4 == 0);

I think you want % 16 here, not % 4.

This patch is:
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
but I don't think it should go to stable just yet.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20151207/062a5b8d/attachment.sig>


More information about the mesa-dev mailing list