[Mesa-dev] [PATCH 04/12] main/formats: Add layout and swizzle information

Jason Ekstrand jason at jlekstrand.net
Fri Jul 18 18:16:05 PDT 2014


On Fri, Jul 18, 2014 at 2:10 PM, Marek Olšák <maraeo at gmail.com> wrote:

> On Thu, Jul 17, 2014 at 8:04 PM, Jason Ekstrand <jason at jlekstrand.net>
> wrote:
> > Signed-off-by: Jason Ekstrand <jason.ekstrand at intel.com>
> > ---
> >  src/mesa/main/format_info.py | 11 +++++++++++
> >  src/mesa/main/formats.c      | 46
> ++++++++++++++++++++++++++++++++++++++++++++
> >  src/mesa/main/formats.h      | 29 ++++++++++++++++++++++++++++
> >  3 files changed, 86 insertions(+)
> >
> > diff --git a/src/mesa/main/format_info.py b/src/mesa/main/format_info.py
> > index b8956a5..448bd00 100644
> > --- a/src/mesa/main/format_info.py
> > +++ b/src/mesa/main/format_info.py
> > @@ -96,6 +96,14 @@ def get_gl_data_type(fmat):
> >     else:
> >        assert False
> >
> > +def get_mesa_layout(fmat):
> > +   if fmat.layout == 'array':
> > +      return 'MESA_FORMAT_LAYOUT_ARRAY'
> > +   elif fmat.layout == 'packed':
> > +      return 'MESA_FORMAT_LAYOUT_PACKED'
> > +   else:
> > +      return 'MESA_FORMAT_LAYOUT_OTHER'
> > +
> >  def get_channel_bits(fmat, chan_name):
> >     if fmat.is_compressed():
> >        # These values are pretty-much bogus, but OpenGL requires that we
> > @@ -166,6 +174,7 @@ for fmat in formats:
> >     print '   {'
> >     print '      {0},'.format(fmat.name)
> >     print '      "{0}",'.format(fmat.name)
> > +   print '      {0},'.format(get_mesa_layout(fmat))
> >     print '      {0},'.format(get_gl_base_format(fmat))
> >     print '      {0},'.format(get_gl_data_type(fmat))
> >
> > @@ -176,6 +185,8 @@ for fmat in formats:
> >
> >     print '      {0}, {1}, {2},'.format(fmat.block_width,
> fmat.block_height,
> >                                         int(fmat.block_size() / 8))
> > +
> > +   print '      {{ {0} }},'.format(', '.join(map(str, fmat.swizzle)))
> >     print '   },'
> >
> >  print '};'
> > diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c
> > index 39cc5f1..f03425e 100644
> > --- a/src/mesa/main/formats.c
> > +++ b/src/mesa/main/formats.c
> > @@ -40,6 +40,8 @@ struct gl_format_info
> >     /** text name for debugging */
> >     const char *StrName;
> >
> > +   enum mesa_format_layout Layout;
> > +
> >     /**
> >      * Base format is one of GL_RED, GL_RG, GL_RGB, GL_RGBA, GL_ALPHA,
> >      * GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_INTENSITY, GL_YCBCR_MESA,
> > @@ -67,6 +69,8 @@ struct gl_format_info
> >      */
> >     GLubyte BlockWidth, BlockHeight;
> >     GLubyte BytesPerBlock;
> > +
> > +   uint8_t Swizzle[4];
> >  };
> >
> >  #include "format_info.c"
> > @@ -178,6 +182,21 @@ _mesa_get_format_max_bits(mesa_format format)
> >
> >
> >  /**
> > + * Return the layout type of the given format.
> > + * The return value will be one of:
> > + *    MESA_FORMAT_LAYOUT_ARRAY
> > + *    MESA_FORMAT_LAYOUT_PACKED
> > + *    MESA_FORMAT_LAYOUT_OTHER
> > + */
> > +extern enum mesa_format_layout
> > +_mesa_get_format_layout(mesa_format format)
> > +{
> > +   const struct gl_format_info *info = _mesa_get_format_info(format);
> > +   return info->Layout;
> > +}
> > +
> > +
> > +/**
> >   * Return the data type (or more specifically, the data representation)
> >   * for the given format.
> >   * The return value will be one of:
> > @@ -224,6 +243,33 @@ _mesa_get_format_block_size(mesa_format format,
> GLuint *bw, GLuint *bh)
> >  }
> >
> >
> > +/**
> > + * Returns the an array of four numbers representing the transformation
> > + * from the RGBA or SZ colorspace to the given format.  For array
> formats,
> > + * the i'th RGBA component is given by:
> > + *
> > + * if (swizzle[i] <= MESA_FORMAT_SWIZZLE_W)
> > + *    comp = data[swizzle[i]];
> > + * else if (swizzle[i] == MESA_FORMAT_SWIZZLE_ZERO)
> > + *    comp = 0;
> > + * else if (swizzle[i] == MESA_FORMAT_SWIZZLE_ONE)
> > + *    comp = 1;
> > + * else if (swizzle[i] == MESA_FORMAT_SWIZZLE_NONE)
> > + *    // data does not contain a channel of this format
> > + *
> > + * For packed formats, the swizzle gives the number of components left
> of
> > + * the least significant bit.
> > + *
> > + * Compressed formats have no swizzle.
> > + */
> > +void
> > +_mesa_get_format_swizzle(mesa_format format, uint8_t swizzle_out[4])
> > +{
> > +   const struct gl_format_info *info = _mesa_get_format_info(format);
> > +   memcpy(swizzle_out, info->Swizzle, sizeof(info->Swizzle));
> > +}
> > +
> > +
> >  /** Is the given format a compressed format? */
> >  GLboolean
> >  _mesa_is_format_compressed(mesa_format format)
> > diff --git a/src/mesa/main/formats.h b/src/mesa/main/formats.h
> > index dc50bc8..48aad44 100644
> > --- a/src/mesa/main/formats.h
> > +++ b/src/mesa/main/formats.h
> > @@ -56,6 +56,15 @@ extern "C" {
> >   */
> >  #define MAX_PIXEL_BYTES 16
> >
> > +/**
> > + * Specifies the layout of a pixel format.  See the MESA_FORMAT
> > + * documentation below.
> > + */
> > +enum mesa_format_layout {
> > +   MESA_FORMAT_LAYOUT_ARRAY,
> > +   MESA_FORMAT_LAYOUT_PACKED,
> > +   MESA_FORMAT_LAYOUT_OTHER,
> > +};
> >
> >  /**
> >   * Mesa texture/renderbuffer image formats.
> > @@ -419,6 +428,9 @@ _mesa_get_format_bits(mesa_format format, GLenum
> pname);
> >  extern GLuint
> >  _mesa_get_format_max_bits(mesa_format format);
> >
> > +extern enum mesa_format_layout
> > +_mesa_get_format_layout(mesa_format format);
> > +
> >  extern GLenum
> >  _mesa_get_format_datatype(mesa_format format);
> >
> > @@ -428,6 +440,23 @@ _mesa_get_format_base_format(mesa_format format);
> >  extern void
> >  _mesa_get_format_block_size(mesa_format format, GLuint *bw, GLuint *bh);
> >
> > +/**
> > + * An enum representing different possible swizzling values.  This is
> used
> > + * to interpret the output of _mesa_get_format_swizzle
> > + */
> > +enum {
> > +   MESA_FORMAT_SWIZZLE_X = 0,
> > +   MESA_FORMAT_SWIZZLE_Y = 1,
> > +   MESA_FORMAT_SWIZZLE_Z = 2,
> > +   MESA_FORMAT_SWIZZLE_W = 3,
> > +   MESA_FORMAT_SWIZZLE_ZERO = 4,
> > +   MESA_FORMAT_SWIZZLE_ONE = 5,
> > +   MESA_FORMAT_SWIZZLE_NONE = 6,
> > +};
>
> It would be nicer to declare all enums at one place in the file (e.g.
> at the beginning) and not between function prototypes.
>

That's fair.  I'll change that.
--Jason Ekstrand


>
> Marek
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140718/ca811d3e/attachment.html>


More information about the mesa-dev mailing list