[Mesa-dev] [PATCH 04/12] main/formats: Add layout and swizzle information
Marek Olšák
maraeo at gmail.com
Fri Jul 18 14:10:34 PDT 2014
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.
Marek
More information about the mesa-dev
mailing list