On Tue, Dec 9, 2014 at 4:07 AM, Iago Toral Quiroga <ito...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev