[Mesa-dev] [PATCH 20/78] i965/nir/vec4: Implement load_uniform intrinsic

Jason Ekstrand jason at jlekstrand.net
Tue Jun 30 11:53:49 PDT 2015


On Fri, Jun 26, 2015 at 1:06 AM, Eduardo Lima Mitev <elima at igalia.com> wrote:
> From: Iago Toral Quiroga <itoral at igalia.com>
>
> For the indirect case we need to take the index delivered by
> NIR and compute the parent uniform that we are accessing (the one
> that we uploaded to a surface) and the constant offset into that
> surface.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=89580
> ---
>  src/mesa/drivers/dri/i965/brw_vec4_nir.cpp | 27 +++++++++++++++++++++++++--
>  1 file changed, 25 insertions(+), 2 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
> index 3fa8ca8..9a0ae25 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_nir.cpp
> @@ -569,10 +569,33 @@ vec4_visitor::nir_emit_intrinsic(nir_intrinsic_instr *instr)
>     }
>
>     case nir_intrinsic_load_uniform_indirect:
> +      has_indirect = true;
>        /* fallthrough */
> -   case nir_intrinsic_load_uniform:
> -      /* @TODO: Not yet implemented */
> +   case nir_intrinsic_load_uniform: {
> +      int index = instr->const_index[0];
> +      int uniform = nir_uniform_offset[index];

Again, I don't know that this indirection is really needed.  We should
make nir_lower_io just do the right thing for you here.

> +      dest = get_nir_dest(instr->dest);
> +
> +      if (has_indirect) {
> +         /* Split addressing into uniform and offset */
> +         int offset = index - nir_uniform_driver_location[uniform];
> +         assert(offset >= 0);
> +
> +         uniform -= offset;
> +         assert(uniform >= 0);
> +
> +         src = src_reg(dst_reg(UNIFORM, uniform));
> +         src.reg_offset = offset;
> +         src_reg tmp = get_nir_src(instr->src[0], BRW_REGISTER_TYPE_D);
> +         src.reladdr = new(mem_ctx) src_reg(tmp);
> +      } else {
> +         src = src_reg(dst_reg(UNIFORM, uniform));
> +      }
> +
> +      emit(MOV(dest, src));
>        break;
> +   }
>
>     case nir_intrinsic_atomic_counter_read:
>     case nir_intrinsic_atomic_counter_inc:
> --
> 2.1.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list