[Mesa-dev] [PATCH 20/78] i965/nir/vec4: Implement load_uniform intrinsic
Iago Toral
itoral at igalia.com
Thu Jul 2 00:33:36 PDT 2015
On Tue, 2015-06-30 at 11:53 -0700, Jason Ekstrand wrote:
> 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.
Ok, I'll see what kind of changes we need to achieve that.
Iago
> > + 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
> _______________________________________________
> 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