[Mesa-dev] [PATCH v3 02/28] mesa: Expose compute_component_mapping as _mesa_compute_component_mapping

Jason Ekstrand jason at jlekstrand.net
Fri Dec 12 10:51:49 PST 2014


On Tue, Dec 9, 2014 at 4:07 AM, Iago Toral Quiroga <itoral at igalia.com>
wrote:
>
> This is necessary to handle conversions between array types where
> the driver does not support the dst format requested by the client and
> chooses a different format instead.
>
> We will need this in _mesa_format_convert, so move it to format_utils.c,
> prefix it with '_mesa_' and make it available to other files.
>

I think we'd probably rather have this in glformat.h if we can as it deals
with GL formats.  Otherwise, looks good.
--Jason


> ---
>  src/mesa/main/format_utils.c | 198 +++++++++++++++++++++++++++++++++++++++
>  src/mesa/main/format_utils.h |   3 +
>  src/mesa/main/texstore.c     | 216
> ++-----------------------------------------
>  3 files changed, 210 insertions(+), 207 deletions(-)
>
> diff --git a/src/mesa/main/format_utils.c b/src/mesa/main/format_utils.c
> index 541d19a..ba0be13 100644
> --- a/src/mesa/main/format_utils.c
> +++ b/src/mesa/main/format_utils.c
> @@ -26,6 +26,7 @@
>  #include "glformats.h"
>  #include "format_pack.h"
>  #include "format_unpack.h"
> +#include "enums.h"
>
>  mesa_array_format RGBA8888_FLOAT =
>     MESA_ARRAY_FORMAT(4, 1, 1, 1, 4, 0, 1, 2, 3);
> @@ -55,6 +56,203 @@ invert_swizzle(uint8_t dst[4], const uint8_t src[4])
>              dst[i] = j;
>  }
>
> +enum {
> +   ZERO = 4,
> +   ONE = 5
> +};
> +
> +enum {
> +   IDX_LUMINANCE = 0,
> +   IDX_ALPHA,
> +   IDX_INTENSITY,
> +   IDX_LUMINANCE_ALPHA,
> +   IDX_RGB,
> +   IDX_RGBA,
> +   IDX_RED,
> +   IDX_GREEN,
> +   IDX_BLUE,
> +   IDX_BGR,
> +   IDX_BGRA,
> +   IDX_ABGR,
> +   IDX_RG,
> +   MAX_IDX
> +};
> +
> +#define MAP1(x)       MAP4(x, ZERO, ZERO, ZERO)
> +#define MAP2(x,y)     MAP4(x, y, ZERO, ZERO)
> +#define MAP3(x,y,z)   MAP4(x, y, z, ZERO)
> +#define MAP4(x,y,z,w) { x, y, z, w, ZERO, ONE }
> +
> +static const struct {
> +   GLubyte format_idx;
> +   GLubyte to_rgba[6];
> +   GLubyte from_rgba[6];
> +} mappings[MAX_IDX] =
> +{
> +   {
> +      IDX_LUMINANCE,
> +      MAP4(0,0,0,ONE),
> +      MAP1(0)
> +   },
> +
> +   {
> +      IDX_ALPHA,
> +      MAP4(ZERO, ZERO, ZERO, 0),
> +      MAP1(3)
> +   },
> +
> +   {
> +      IDX_INTENSITY,
> +      MAP4(0, 0, 0, 0),
> +      MAP1(0),
> +   },
> +
> +   {
> +      IDX_LUMINANCE_ALPHA,
> +      MAP4(0,0,0,1),
> +      MAP2(0,3)
> +   },
> +
> +   {
> +      IDX_RGB,
> +      MAP4(0,1,2,ONE),
> +      MAP3(0,1,2)
> +   },
> +
> +   {
> +      IDX_RGBA,
> +      MAP4(0,1,2,3),
> +      MAP4(0,1,2,3),
> +   },
> +
> +   {
> +      IDX_RED,
> +      MAP4(0, ZERO, ZERO, ONE),
> +      MAP1(0),
> +   },
> +
> +   {
> +      IDX_GREEN,
> +      MAP4(ZERO, 0, ZERO, ONE),
> +      MAP1(1),
> +   },
> +
> +   {
> +      IDX_BLUE,
> +      MAP4(ZERO, ZERO, 0, ONE),
> +      MAP1(2),
> +   },
> +
> +   {
> +      IDX_BGR,
> +      MAP4(2,1,0,ONE),
> +      MAP3(2,1,0)
> +   },
> +
> +   {
> +      IDX_BGRA,
> +      MAP4(2,1,0,3),
> +      MAP4(2,1,0,3)
> +   },
> +
> +   {
> +      IDX_ABGR,
> +      MAP4(3,2,1,0),
> +      MAP4(3,2,1,0)
> +   },
> +
> +   {
> +      IDX_RG,
> +      MAP4(0, 1, ZERO, ONE),
> +      MAP2(0, 1)
> +   },
> +};
> +
> +/**
> + * Convert a GL image format enum to an IDX_* value (see above).
> + */
> +static int
> +get_map_idx(GLenum value)
> +{
> +   switch (value) {
> +   case GL_LUMINANCE:
> +   case GL_LUMINANCE_INTEGER_EXT:
> +      return IDX_LUMINANCE;
> +   case GL_ALPHA:
> +   case GL_ALPHA_INTEGER:
> +      return IDX_ALPHA;
> +   case GL_INTENSITY:
> +      return IDX_INTENSITY;
> +   case GL_LUMINANCE_ALPHA:
> +   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
> +      return IDX_LUMINANCE_ALPHA;
> +   case GL_RGB:
> +   case GL_RGB_INTEGER:
> +      return IDX_RGB;
> +   case GL_RGBA:
> +   case GL_RGBA_INTEGER:
> +      return IDX_RGBA;
> +   case GL_RED:
> +   case GL_RED_INTEGER:
> +      return IDX_RED;
> +   case GL_GREEN:
> +      return IDX_GREEN;
> +   case GL_BLUE:
> +      return IDX_BLUE;
> +   case GL_BGR:
> +   case GL_BGR_INTEGER:
> +      return IDX_BGR;
> +   case GL_BGRA:
> +   case GL_BGRA_INTEGER:
> +      return IDX_BGRA;
> +   case GL_ABGR_EXT:
> +      return IDX_ABGR;
> +   case GL_RG:
> +   case GL_RG_INTEGER:
> +      return IDX_RG;
> +   default:
> +      _mesa_problem(NULL, "Unexpected inFormat %s",
> +                    _mesa_lookup_enum_by_nr(value));
> +      return 0;
> +   }
> +}
> +
> +/**
> + * When promoting texture formats (see below) we need to compute the
> + * mapping of dest components back to source components.
> + * This function does that.
> + * \param inFormat  the incoming format of the texture
> + * \param outFormat  the final texture format
> + * \return map[6]  a full 6-component map
> + */
> +void
> +_mesa_compute_component_mapping(GLenum inFormat, GLenum outFormat,
> GLubyte *map)
> +{
> +   const int inFmt = get_map_idx(inFormat);
> +   const int outFmt = get_map_idx(outFormat);
> +   const GLubyte *in2rgba = mappings[inFmt].to_rgba;
> +   const GLubyte *rgba2out = mappings[outFmt].from_rgba;
> +   int i;
> +
> +   for (i = 0; i < 4; i++)
> +      map[i] = in2rgba[rgba2out[i]];
> +
> +   map[ZERO] = ZERO;
> +   map[ONE] = ONE;
> +
> +#if 0
> +   printf("from %x/%s to %x/%s map %d %d %d %d %d %d\n",
> +         inFormat, _mesa_lookup_enum_by_nr(inFormat),
> +         outFormat, _mesa_lookup_enum_by_nr(outFormat),
> +         map[0],
> +         map[1],
> +         map[2],
> +         map[3],
> +         map[4],
> +         map[5]);
> +#endif
> +}
> +
>  static GLenum
>  gl_type_for_array_format_datatype(enum mesa_array_format_datatype type)
>  {
> diff --git a/src/mesa/main/format_utils.h b/src/mesa/main/format_utils.h
> index 8d25e51..28b4715 100644
> --- a/src/mesa/main/format_utils.h
> +++ b/src/mesa/main/format_utils.h
> @@ -179,6 +179,9 @@ _mesa_swizzle_and_convert(void *dst, GLenum dst_type,
> int num_dst_channels,
>                            const uint8_t swizzle[4], bool normalized, int
> count);
>
>  void
> +_mesa_compute_component_mapping(GLenum inFormat, GLenum outFormat,
> GLubyte *map);
> +
> +void
>  _mesa_format_convert(void *void_dst, uint32_t dst_format, size_t
> dst_stride,
>                       void *void_src, uint32_t src_format, size_t
> src_stride,
>                       size_t width, size_t height);
> diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c
> index 3ac8bcf..de9f4df 100644
> --- a/src/mesa/main/texstore.c
> +++ b/src/mesa/main/texstore.c
> @@ -89,204 +89,6 @@ enum {
>  typedef GLboolean (*StoreTexImageFunc)(TEXSTORE_PARAMS);
>
>
> -enum {
> -   IDX_LUMINANCE = 0,
> -   IDX_ALPHA,
> -   IDX_INTENSITY,
> -   IDX_LUMINANCE_ALPHA,
> -   IDX_RGB,
> -   IDX_RGBA,
> -   IDX_RED,
> -   IDX_GREEN,
> -   IDX_BLUE,
> -   IDX_BGR,
> -   IDX_BGRA,
> -   IDX_ABGR,
> -   IDX_RG,
> -   MAX_IDX
> -};
> -
> -#define MAP1(x)       MAP4(x, ZERO, ZERO, ZERO)
> -#define MAP2(x,y)     MAP4(x, y, ZERO, ZERO)
> -#define MAP3(x,y,z)   MAP4(x, y, z, ZERO)
> -#define MAP4(x,y,z,w) { x, y, z, w, ZERO, ONE }
> -
> -
> -static const struct {
> -   GLubyte format_idx;
> -   GLubyte to_rgba[6];
> -   GLubyte from_rgba[6];
> -} mappings[MAX_IDX] =
> -{
> -   {
> -      IDX_LUMINANCE,
> -      MAP4(0,0,0,ONE),
> -      MAP1(0)
> -   },
> -
> -   {
> -      IDX_ALPHA,
> -      MAP4(ZERO, ZERO, ZERO, 0),
> -      MAP1(3)
> -   },
> -
> -   {
> -      IDX_INTENSITY,
> -      MAP4(0, 0, 0, 0),
> -      MAP1(0),
> -   },
> -
> -   {
> -      IDX_LUMINANCE_ALPHA,
> -      MAP4(0,0,0,1),
> -      MAP2(0,3)
> -   },
> -
> -   {
> -      IDX_RGB,
> -      MAP4(0,1,2,ONE),
> -      MAP3(0,1,2)
> -   },
> -
> -   {
> -      IDX_RGBA,
> -      MAP4(0,1,2,3),
> -      MAP4(0,1,2,3),
> -   },
> -
> -   {
> -      IDX_RED,
> -      MAP4(0, ZERO, ZERO, ONE),
> -      MAP1(0),
> -   },
> -
> -   {
> -      IDX_GREEN,
> -      MAP4(ZERO, 0, ZERO, ONE),
> -      MAP1(1),
> -   },
> -
> -   {
> -      IDX_BLUE,
> -      MAP4(ZERO, ZERO, 0, ONE),
> -      MAP1(2),
> -   },
> -
> -   {
> -      IDX_BGR,
> -      MAP4(2,1,0,ONE),
> -      MAP3(2,1,0)
> -   },
> -
> -   {
> -      IDX_BGRA,
> -      MAP4(2,1,0,3),
> -      MAP4(2,1,0,3)
> -   },
> -
> -   {
> -      IDX_ABGR,
> -      MAP4(3,2,1,0),
> -      MAP4(3,2,1,0)
> -   },
> -
> -   {
> -      IDX_RG,
> -      MAP4(0, 1, ZERO, ONE),
> -      MAP2(0, 1)
> -   },
> -};
> -
> -
> -
> -/**
> - * Convert a GL image format enum to an IDX_* value (see above).
> - */
> -static int
> -get_map_idx(GLenum value)
> -{
> -   switch (value) {
> -   case GL_LUMINANCE:
> -   case GL_LUMINANCE_INTEGER_EXT:
> -      return IDX_LUMINANCE;
> -   case GL_ALPHA:
> -   case GL_ALPHA_INTEGER:
> -      return IDX_ALPHA;
> -   case GL_INTENSITY:
> -      return IDX_INTENSITY;
> -   case GL_LUMINANCE_ALPHA:
> -   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
> -      return IDX_LUMINANCE_ALPHA;
> -   case GL_RGB:
> -   case GL_RGB_INTEGER:
> -      return IDX_RGB;
> -   case GL_RGBA:
> -   case GL_RGBA_INTEGER:
> -      return IDX_RGBA;
> -   case GL_RED:
> -   case GL_RED_INTEGER:
> -      return IDX_RED;
> -   case GL_GREEN:
> -      return IDX_GREEN;
> -   case GL_BLUE:
> -      return IDX_BLUE;
> -   case GL_BGR:
> -   case GL_BGR_INTEGER:
> -      return IDX_BGR;
> -   case GL_BGRA:
> -   case GL_BGRA_INTEGER:
> -      return IDX_BGRA;
> -   case GL_ABGR_EXT:
> -      return IDX_ABGR;
> -   case GL_RG:
> -   case GL_RG_INTEGER:
> -      return IDX_RG;
> -   default:
> -      _mesa_problem(NULL, "Unexpected inFormat %s",
> -                    _mesa_lookup_enum_by_nr(value));
> -      return 0;
> -   }
> -}
> -
> -
> -/**
> - * When promoting texture formats (see below) we need to compute the
> - * mapping of dest components back to source components.
> - * This function does that.
> - * \param inFormat  the incoming format of the texture
> - * \param outFormat  the final texture format
> - * \return map[6]  a full 6-component map
> - */
> -static void
> -compute_component_mapping(GLenum inFormat, GLenum outFormat,
> -                         GLubyte *map)
> -{
> -   const int inFmt = get_map_idx(inFormat);
> -   const int outFmt = get_map_idx(outFormat);
> -   const GLubyte *in2rgba = mappings[inFmt].to_rgba;
> -   const GLubyte *rgba2out = mappings[outFmt].from_rgba;
> -   int i;
> -
> -   for (i = 0; i < 4; i++)
> -      map[i] = in2rgba[rgba2out[i]];
> -
> -   map[ZERO] = ZERO;
> -   map[ONE] = ONE;
> -
> -#if 0
> -   printf("from %x/%s to %x/%s map %d %d %d %d %d %d\n",
> -         inFormat, _mesa_lookup_enum_by_nr(inFormat),
> -         outFormat, _mesa_lookup_enum_by_nr(outFormat),
> -         map[0],
> -         map[1],
> -         map[2],
> -         map[3],
> -         map[4],
> -         map[5]);
> -#endif
> -}
> -
> -
>  /**
>   * Make a temporary (color) texture image with GLfloat components.
>   * Apply all needed pixel unpacking and pixel transfer operations.
> @@ -394,7 +196,7 @@ _mesa_make_temp_float_image(struct gl_context *ctx,
> GLuint dims,
>           return NULL;
>        }
>
> -      compute_component_mapping(logicalBaseFormat, textureBaseFormat,
> map);
> +      _mesa_compute_component_mapping(logicalBaseFormat,
> textureBaseFormat, map);
>
>        n = srcWidth * srcHeight * srcDepth;
>        for (i = 0; i < n; i++) {
> @@ -503,7 +305,7 @@ make_temp_uint_image(struct gl_context *ctx, GLuint
> dims,
>           return NULL;
>        }
>
> -      compute_component_mapping(logicalBaseFormat, textureBaseFormat,
> map);
> +      _mesa_compute_component_mapping(logicalBaseFormat,
> textureBaseFormat, map);
>
>        n = srcWidth * srcHeight * srcDepth;
>        for (i = 0; i < n; i++) {
> @@ -634,7 +436,7 @@ _mesa_make_temp_ubyte_image(struct gl_context *ctx,
> GLuint dims,
>           return NULL;
>        }
>
> -      compute_component_mapping(logicalBaseFormat, textureBaseFormat,
> map);
> +      _mesa_compute_component_mapping(logicalBaseFormat,
> textureBaseFormat, map);
>
>        n = srcWidth * srcHeight * srcDepth;
>        for (i = 0; i < n; i++) {
> @@ -1532,8 +1334,8 @@ texstore_swizzle(TEXSTORE_PARAMS)
>     }
>     swap = need_swap ? map_3210 : map_identity;
>
> -   compute_component_mapping(srcFormat, baseInternalFormat, base2src);
> -   compute_component_mapping(baseInternalFormat, GL_RGBA, rgba2base);
> +   _mesa_compute_component_mapping(srcFormat, baseInternalFormat,
> base2src);
> +   _mesa_compute_component_mapping(baseInternalFormat, GL_RGBA,
> rgba2base);
>     invert_swizzle(dst2rgba, rgba2dst);
>
>     for (i = 0; i < 4; i++) {
> @@ -1603,8 +1405,8 @@ texstore_via_float(TEXSTORE_PARAMS)
>
>     need_convert = false;
>     if (baseInternalFormat != _mesa_get_format_base_format(dstFormat)) {
> -      compute_component_mapping(GL_RGBA, baseInternalFormat, base2rgba);
> -      compute_component_mapping(baseInternalFormat, GL_RGBA, rgba2base);
> +      _mesa_compute_component_mapping(GL_RGBA, baseInternalFormat,
> base2rgba);
> +      _mesa_compute_component_mapping(baseInternalFormat, GL_RGBA,
> rgba2base);
>        for (i = 0; i < 4; ++i) {
>           map[i] = base2rgba[rgba2base[i]];
>           if (map[i] != i)
> @@ -1673,8 +1475,8 @@ texstore_rgba_integer(TEXSTORE_PARAMS)
>     }
>
>     invert_swizzle(dst2rgba, rgba2dst);
> -   compute_component_mapping(GL_RGBA, baseInternalFormat, base2rgba);
> -   compute_component_mapping(baseInternalFormat, GL_RGBA, rgba2base);
> +   _mesa_compute_component_mapping(GL_RGBA, baseInternalFormat,
> base2rgba);
> +   _mesa_compute_component_mapping(baseInternalFormat, GL_RGBA,
> rgba2base);
>
>     for (i = 0; i < 4; ++i) {
>        if (dst2rgba[i] == MESA_FORMAT_SWIZZLE_NONE)
> --
> 1.9.1
>
> _______________________________________________
> 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/20141212/e220d25f/attachment-0001.html>


More information about the mesa-dev mailing list