[Mesa-dev] [PATCH 2/3] i965: Implement a new type_size_4x() function.

Jason Ekstrand jason at jlekstrand.net
Thu Oct 15 23:09:15 PDT 2015


On Oct 15, 2015 16:14, "Connor Abbott" <cwabbott0 at gmail.com> wrote:
>
> On Thu, Oct 15, 2015 at 6:17 PM, Kenneth Graunke <kenneth at whitecape.org>
wrote:
> > Often, shader inputs/outputs are required to be aligned to vec4 slots
> > for one reason or another.  When working with the scalar backend, we
> > want to count the number of scalar components, yet still respect the
> > vec4 packing rules as required.
> >
> > The new "hybrid" type_size_4x() function pads everything out to vec4
> > slots, similar to type_size_vec4(), but counts in scalar components,
> > similar to type_size_scalar().
> >
> > Cc: mesa-stable at lists.freedesktop.org
> > Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> > ---
> >  src/mesa/drivers/dri/i965/brw_fs.cpp   | 52
++++++++++++++++++++++++++++++++++
> >  src/mesa/drivers/dri/i965/brw_shader.h |  1 +
> >  2 files changed, 53 insertions(+)
> >
> > diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp
b/src/mesa/drivers/dri/i965/brw_fs.cpp
> > index 01a7c99..4af88c5 100644
> > --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> > +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> > @@ -499,6 +499,58 @@ type_size_scalar(const struct glsl_type *type)
> >  }
> >
> >  /**
> > + * Returns the number of scalar components needed to store type,
assuming
> > + * that vectors are padded out to vec4.
> > + *
> > + * This has the packing rules of type_size_vec4(), but counts
components
> > + * similar to type_size_scalar().
> > + */
> > +extern "C" int
> > +type_size_4x(const struct glsl_type *type)
> > +{
> > +   int size;
> > +
> > +   switch (type->base_type) {
> > +   case GLSL_TYPE_UINT:
> > +   case GLSL_TYPE_INT:
> > +   case GLSL_TYPE_FLOAT:
> > +   case GLSL_TYPE_BOOL:
> > +      if (type->is_matrix()) {
> > +         return 4 * type->matrix_columns;
> > +      } else {
> > +         /* Regardless of the size of vector, it's padded out to a
vec4. */
> > +         return 4;
> > +      }
> > +   case GLSL_TYPE_ARRAY:
> > +      return type_size_4x(type->fields.array) * type->length;
> > +   case GLSL_TYPE_STRUCT:
> > +      size = 0;
> > +      for (unsigned i = 0; i < type->length; i++) {
> > +        size += type_size_4x(type->fields.structure[i].type);
> > +      }
> > +      return size;
> > +   case GLSL_TYPE_SAMPLER:
> > +      /* Samplers take up no register space, since they're baked in at
> > +       * link time.
> > +       */
> > +      return 0;
> > +   case GLSL_TYPE_ATOMIC_UINT:
> > +      return 0;
> > +   case GLSL_TYPE_SUBROUTINE:
> > +      return 4;
> > +   case GLSL_TYPE_IMAGE:
> > +      return ALIGN(BRW_IMAGE_PARAM_SIZE, 4);
> > +   case GLSL_TYPE_VOID:
> > +   case GLSL_TYPE_ERROR:
> > +   case GLSL_TYPE_INTERFACE:
> > +   case GLSL_TYPE_DOUBLE:
> > +      unreachable("not reached");
> > +   }
> > +
> > +   return 0;
> > +}
>
> Is there a difference between this and type_size_vec4(type) *  4?

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.

> > +
> > +/**
> >   * Create a MOV to read the timestamp register.
> >   *
> >   * The caller is responsible for emitting the MOV.  The return value is
> > diff --git a/src/mesa/drivers/dri/i965/brw_shader.h
b/src/mesa/drivers/dri/i965/brw_shader.h
> > index ad2de5e..06a5b4c 100644
> > --- a/src/mesa/drivers/dri/i965/brw_shader.h
> > +++ b/src/mesa/drivers/dri/i965/brw_shader.h
> > @@ -316,6 +316,7 @@ bool brw_cs_precompile(struct gl_context *ctx,
> >                         struct gl_program *prog);
> >
> >  int type_size_scalar(const struct glsl_type *type);
> > +int type_size_4x(const struct glsl_type *type);
> >  int type_size_vec4(const struct glsl_type *type);
> >
> >  bool is_scalar_shader_stage(const struct brw_compiler *compiler, int
stage);
> > --
> > 2.6.1
> >
> > _______________________________________________
> > 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20151015/3eeaaeae/attachment-0001.html>


More information about the mesa-dev mailing list