<p dir="ltr"><br>
On Aug 19, 2015 2:56 AM, "Francisco Jerez" <<a href="mailto:currojerez@riseup.net">currojerez@riseup.net</a>> wrote:<br>
><br>
> Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>> writes:<br>
><br>
> > Previously, setting up image uniforms relied on being called after<br>
> > fs_visitor::uniforms was set and with fs_visitor::uniforms not allocating<br>
> > space for it.  This made sense in an ir_visitor world because the visitor<br>
> > assigns locations and uploads data as it walks through the variables.  In<br>
> > NIR it also happened to work because nir_lower_io assumed zero space for<br>
> > images.  In the near future, we will be able to reserve space using<br>
> > nir_lower_io and these invariants will be broken.<br>
> ><br>
> > This commit makes setup_image_uniforms take a pointer to the location in<br>
> > the prog_data params array that indicates where the image uniforms should<br>
> > be stored.  This way it can be called from anywhere in the shader setup.<br>
> ><br>
> > v2: Fix nir_setup_uniform to correctly correspond with this change<br>
> >     (rebase fail)<br>
> ><br>
> > Cc: Francisco Jerez <<a href="mailto:currojerez@riseup.net">currojerez@riseup.net</a>><br>
> > Cc: Kenneth Graunke <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>><br>
> > ---<br>
> >  src/mesa/drivers/dri/i965/brw_fs.cpp     | 12 ------------<br>
> >  src/mesa/drivers/dri/i965/brw_fs.h       |  3 ---<br>
> >  src/mesa/drivers/dri/i965/brw_fs_nir.cpp |  6 ++++--<br>
> >  src/mesa/drivers/dri/i965/brw_shader.cpp | 28 +++++++++++++++++++++-------<br>
> >  src/mesa/drivers/dri/i965/brw_shader.h   |  5 ++---<br>
> >  5 files changed, 27 insertions(+), 27 deletions(-)<br>
> ><br>
> > diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
> > index 82cb499..d1550e6 100644<br>
> > --- a/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
> > +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
> > @@ -942,18 +942,6 @@ fs_visitor::import_uniforms(fs_visitor *v)<br>
> >     this->param_size = v->param_size;<br>
> >  }<br>
> ><br>
> > -void<br>
> > -fs_visitor::setup_vector_uniform_values(const gl_constant_value *values, unsigned n)<br>
> > -{<br>
> > -   static const gl_constant_value zero = { 0 };<br>
> > -<br>
> > -   for (unsigned i = 0; i < n; ++i)<br>
> > -      stage_prog_data->param[uniforms++] = &values[i];<br>
> > -<br>
> > -   for (unsigned i = n; i < 4; ++i)<br>
> > -      stage_prog_data->param[uniforms++] = &zero;<br>
> > -}<br>
> > -<br>
> >  fs_reg *<br>
> >  fs_visitor::emit_fragcoord_interpolation(bool pixel_center_integer,<br>
> >                                           bool origin_upper_left)<br>
> > diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h<br>
> > index 975183e..28fcfa3 100644<br>
> > --- a/src/mesa/drivers/dri/i965/brw_fs.h<br>
> > +++ b/src/mesa/drivers/dri/i965/brw_fs.h<br>
> > @@ -291,9 +291,6 @@ public:<br>
> ><br>
> >     struct brw_reg interp_reg(int location, int channel);<br>
> ><br>
> > -   virtual void setup_vector_uniform_values(const gl_constant_value *values,<br>
> > -                                            unsigned n);<br>
> > -<br>
> >     int implied_mrf_writes(fs_inst *inst);<br>
> ><br>
> >     virtual void dump_instructions();<br>
> > diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp<br>
> > index ce4153d..c8ea649 100644<br>
> > --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp<br>
> > +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp<br>
> > @@ -244,10 +244,12 @@ fs_visitor::nir_setup_uniform(nir_variable *var)<br>
> >            * space for them here at the end of the parameter array.<br>
> >            */<br>
> >           var->data.driver_location = uniforms;<br>
> > -         param_size[uniforms] =<br>
> > +         unsigned size =<br>
> >              BRW_IMAGE_PARAM_SIZE * MAX2(storage->array_elements, 1);<br>
> ><br>
> > -         setup_image_uniform_values(storage);<br>
> > +         setup_image_uniform_values(stage_prog_data->param + uniforms, storage);<br>
> > +         param_size[uniforms] = size;<br>
> > +         uniforms += size;<br>
> >        } else {<br>
> >           unsigned slots = storage->type->component_slots();<br>
> >           if (storage->array_elements)<br>
> > diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp<br>
> > index 6b92806..b31ae9b 100644<br>
> > --- a/src/mesa/drivers/dri/i965/brw_shader.cpp<br>
> > +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp<br>
> > @@ -1419,8 +1419,22 @@ backend_shader::assign_common_binding_table_offsets(uint32_t next_binding_table_<br>
> >     /* prog_data->base.binding_table.size will be set by brw_mark_surface_used. */<br>
> >  }<br>
> ><br>
> > +static void<br>
> > +setup_vector_uniform_values(const gl_constant_value ***dst,<br>
> > +                            const gl_constant_value *values, unsigned n)<br>
> > +{<br>
> > +   static const gl_constant_value zero = { 0 };<br>
> > +<br>
> > +   for (unsigned i = 0; i < n; ++i)<br>
> > +      *((*dst)++) = &values[i];<br>
> > +<br>
> > +   for (unsigned i = n; i < 4; ++i)<br>
> > +      *((*dst)++) = &zero;<br>
> > +}<br>
> > +<br>
> >  void<br>
> > -backend_shader::setup_image_uniform_values(const gl_uniform_storage *storage)<br>
> > +backend_shader::setup_image_uniform_values(const gl_constant_value **prog_param,<br>
> > +                                           const gl_uniform_storage *storage)<br>
> >  {<br>
> >     const unsigned stage = _mesa_program_enum_to_shader_stage(prog->Target);<br>
> ><br>
> > @@ -1431,17 +1445,17 @@ backend_shader::setup_image_uniform_values(const gl_uniform_storage *storage)<br>
> >        /* Upload the brw_image_param structure.  The order is expected to match<br>
> >         * the BRW_IMAGE_PARAM_*_OFFSET defines.<br>
> >         */<br>
> > -      setup_vector_uniform_values(<br>
> > +      setup_vector_uniform_values(&prog_param,<br>
> >           (const gl_constant_value *)&param->surface_idx, 1);<br>
> > -      setup_vector_uniform_values(<br>
> > +      setup_vector_uniform_values(&prog_param,<br>
> >           (const gl_constant_value *)param->offset, 2);<br>
> > -      setup_vector_uniform_values(<br>
> > +      setup_vector_uniform_values(&prog_param,<br>
> >           (const gl_constant_value *)param->size, 3);<br>
> > -      setup_vector_uniform_values(<br>
> > +      setup_vector_uniform_values(&prog_param,<br>
> >           (const gl_constant_value *)param->stride, 4);<br>
> > -      setup_vector_uniform_values(<br>
> > +      setup_vector_uniform_values(&prog_param,<br>
> >           (const gl_constant_value *)param->tiling, 3);<br>
> > -      setup_vector_uniform_values(<br>
> > +      setup_vector_uniform_values(&prog_param,<br>
> >           (const gl_constant_value *)param->swizzling, 2);<br>
> ><br>
> >        brw_mark_surface_used(<br>
> > diff --git a/src/mesa/drivers/dri/i965/brw_shader.h b/src/mesa/drivers/dri/i965/brw_shader.h<br>
> > index 2cc97f2..2cd0a5a 100644<br>
> > --- a/src/mesa/drivers/dri/i965/brw_shader.h<br>
> > +++ b/src/mesa/drivers/dri/i965/brw_shader.h<br>
> > @@ -270,9 +270,8 @@ public:<br>
> ><br>
> >     virtual void invalidate_live_intervals() = 0;<br>
> ><br>
> > -   virtual void setup_vector_uniform_values(const gl_constant_value *values,<br>
> > -                                            unsigned n) = 0;<br>
> > -   void setup_image_uniform_values(const gl_uniform_storage *storage);<br>
> > +   void setup_image_uniform_values(const gl_constant_value **prog_param,<br>
> > +                                   const gl_uniform_storage *storage);<br>
> >  };<br>
> ><br>
> >  uint32_t brw_texture_offset(int *offsets, unsigned num_components);<br>
> > --<br>
> > 2.4.3<br>
><br>
> Did you notice that this makes<br>
> backend_shader::setup_image_uniform_values() FS-specific?  I think<br>
> passing the base uniform index where it should be set up would do what<br>
> you want and at the same time could be implemented in a backend-agnostic<br>
> way.</p>
<p dir="ltr">How is this FS-specific? setup_vector_uniform_values was exactly the same code in both backends and the same as this static helper. They both have an array of params.  Am I missing something?</p>