On Fri, Jul 18, 2014 at 2:10 PM, Marek Olšák <mar...@gmail.com> wrote:
> On Thu, Jul 17, 2014 at 8:04 PM, Jason Ekstrand <ja...@jlekstrand.net> > wrote: > > Signed-off-by: Jason Ekstrand <jason.ekstr...@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 >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev