<p dir="ltr"><br>
On Oct 15, 2015 16:14, "Connor Abbott" <<a href="mailto:cwabbott0@gmail.com">cwabbott0@gmail.com</a>> wrote:<br>
><br>
> On Thu, Oct 15, 2015 at 6:17 PM, Kenneth Graunke <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>> wrote:<br>
> > Often, shader inputs/outputs are required to be aligned to vec4 slots<br>
> > for one reason or another.  When working with the scalar backend, we<br>
> > want to count the number of scalar components, yet still respect the<br>
> > vec4 packing rules as required.<br>
> ><br>
> > The new "hybrid" type_size_4x() function pads everything out to vec4<br>
> > slots, similar to type_size_vec4(), but counts in scalar components,<br>
> > similar to type_size_scalar().<br>
> ><br>
> > Cc: <a href="mailto:mesa-stable@lists.freedesktop.org">mesa-stable@lists.freedesktop.org</a><br>
> > Signed-off-by: Kenneth Graunke <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>><br>
> > ---<br>
> >  src/mesa/drivers/dri/i965/brw_fs.cpp   | 52 ++++++++++++++++++++++++++++++++++<br>
> >  src/mesa/drivers/dri/i965/brw_shader.h |  1 +<br>
> >  2 files changed, 53 insertions(+)<br>
> ><br>
> > diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
> > index 01a7c99..4af88c5 100644<br>
> > --- a/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
> > +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
> > @@ -499,6 +499,58 @@ type_size_scalar(const struct glsl_type *type)<br>
> >  }<br>
> ><br>
> >  /**<br>
> > + * Returns the number of scalar components needed to store type, assuming<br>
> > + * that vectors are padded out to vec4.<br>
> > + *<br>
> > + * This has the packing rules of type_size_vec4(), but counts components<br>
> > + * similar to type_size_scalar().<br>
> > + */<br>
> > +extern "C" int<br>
> > +type_size_4x(const struct glsl_type *type)<br>
> > +{<br>
> > +   int size;<br>
> > +<br>
> > +   switch (type->base_type) {<br>
> > +   case GLSL_TYPE_UINT:<br>
> > +   case GLSL_TYPE_INT:<br>
> > +   case GLSL_TYPE_FLOAT:<br>
> > +   case GLSL_TYPE_BOOL:<br>
> > +      if (type->is_matrix()) {<br>
> > +         return 4 * type->matrix_columns;<br>
> > +      } else {<br>
> > +         /* Regardless of the size of vector, it's padded out to a vec4. */<br>
> > +         return 4;<br>
> > +      }<br>
> > +   case GLSL_TYPE_ARRAY:<br>
> > +      return type_size_4x(type->fields.array) * type->length;<br>
> > +   case GLSL_TYPE_STRUCT:<br>
> > +      size = 0;<br>
> > +      for (unsigned i = 0; i < type->length; i++) {<br>
> > +        size += type_size_4x(type->fields.structure[i].type);<br>
> > +      }<br>
> > +      return size;<br>
> > +   case GLSL_TYPE_SAMPLER:<br>
> > +      /* Samplers take up no register space, since they're baked in at<br>
> > +       * link time.<br>
> > +       */<br>
> > +      return 0;<br>
> > +   case GLSL_TYPE_ATOMIC_UINT:<br>
> > +      return 0;<br>
> > +   case GLSL_TYPE_SUBROUTINE:<br>
> > +      return 4;<br>
> > +   case GLSL_TYPE_IMAGE:<br>
> > +      return ALIGN(BRW_IMAGE_PARAM_SIZE, 4);<br>
> > +   case GLSL_TYPE_VOID:<br>
> > +   case GLSL_TYPE_ERROR:<br>
> > +   case GLSL_TYPE_INTERFACE:<br>
> > +   case GLSL_TYPE_DOUBLE:<br>
> > +      unreachable("not reached");<br>
> > +   }<br>
> > +<br>
> > +   return 0;<br>
> > +}<br>
><br>
> Is there a difference between this and type_size_vec4(type) *  4?</p>
<p dir="ltr">That's what I would like to know too.  Also, I'm not sure I like the name "type_size_4x".  4x of what?  That said, I don't have anything better.</p>
<p dir="ltr">> > +<br>
> > +/**<br>
> >   * Create a MOV to read the timestamp register.<br>
> >   *<br>
> >   * The caller is responsible for emitting the MOV.  The return value is<br>
> > diff --git a/src/mesa/drivers/dri/i965/brw_shader.h b/src/mesa/drivers/dri/i965/brw_shader.h<br>
> > index ad2de5e..06a5b4c 100644<br>
> > --- a/src/mesa/drivers/dri/i965/brw_shader.h<br>
> > +++ b/src/mesa/drivers/dri/i965/brw_shader.h<br>
> > @@ -316,6 +316,7 @@ bool brw_cs_precompile(struct gl_context *ctx,<br>
> >                         struct gl_program *prog);<br>
> ><br>
> >  int type_size_scalar(const struct glsl_type *type);<br>
> > +int type_size_4x(const struct glsl_type *type);<br>
> >  int type_size_vec4(const struct glsl_type *type);<br>
> ><br>
> >  bool is_scalar_shader_stage(const struct brw_compiler *compiler, int stage);<br>
> > --<br>
> > 2.6.1<br>
> ><br>
> > _______________________________________________<br>
> > mesa-dev mailing list<br>
> > <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> > <a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
> _______________________________________________<br>
> mesa-dev mailing list<br>
> <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> <a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</p>