[Mesa-dev] [PATCH v2 09/13] mesa/format_utils: Add a function to convert a mesa_format to an array format
Jason Ekstrand
jason at jlekstrand.net
Mon Aug 4 11:16:58 PDT 2014
On Mon, Aug 4, 2014 at 7:55 AM, Brian Paul <brianp at vmware.com> wrote:
> On 08/02/2014 02:11 PM, Jason Ekstrand wrote:
>
>> This commits adds the _mesa_format_to_arary function that determines if
>> the
>>
>
> "array"
>
>
>
> given format can be represented as an array format and computes the array
>> format parameters. This is a direct helper function for using
>> _mesa_swizzle_and_convert
>>
>> v2: Better documentation and commit message
>>
>> Signed-off-by: Jason Ekstrand <jason.ekstrand at intel.com>
>> ---
>> src/mesa/main/format_utils.c | 105 ++++++++++++++++++++++++++++++
>> +++++++++++++
>> src/mesa/main/format_utils.h | 4 ++
>> 2 files changed, 109 insertions(+)
>>
>> diff --git a/src/mesa/main/format_utils.c b/src/mesa/main/format_utils.c
>> index d60aeb3..95b4612 100644
>> --- a/src/mesa/main/format_utils.c
>> +++ b/src/mesa/main/format_utils.c
>> @@ -55,6 +55,111 @@ _mesa_srgb_ubyte_to_linear_float(uint8_t cl)
>> return lut[cl];
>> }
>>
>> +static const uint8_t map_identity[7] = { 0, 1, 2, 3, 4, 5, 6 };
>> +static const uint8_t map_3210[7] = { 3, 2, 1, 0, 4, 5, 6 };
>> +static const uint8_t map_1032[7] = { 1, 0, 3, 2, 4, 5, 6 };
>> +
>> +/**
>> + * Describes a format as an array format, if possible
>> + *
>> + * A helper function for figuring out if a (possibly packed) format is
>> + * actually an array format and, if so, what the array parameters are.
>> + *
>> + * \param[in] format the mesa format
>> + * \param[out] type the GL type of the array (GL_BYTE, etc.)
>> + * \param[out] num_components the number of components in the array
>> + * \param[out] swizzle a swizzle describing how to get from the
>> + * given format to RGBA
>> + * \param[out] normalized for integer formats, this represents
>> whether
>> + * the format is a normalized integer or a
>> + * regular integer
>> + * \return true if this format is an array format, false otherwise
>> + */
>> +bool
>> +_mesa_format_to_array(mesa_format format, GLenum *type, int
>> *num_components,
>> + uint8_t swizzle[4], bool *normalized)
>> +{
>> + int i;
>> + GLuint format_components;
>> + uint8_t packed_swizzle[4];
>> + const uint8_t *endian;
>> +
>> + if (_mesa_is_format_compressed(format))
>> + return false;
>> +
>> + *normalized = !_mesa_is_format_integer(format);
>> +
>> + _mesa_format_to_type_and_comps(format, type, &format_components);
>> +
>> + switch (_mesa_get_format_layout(format)) {
>> + case MESA_FORMAT_LAYOUT_ARRAY:
>> + *num_components = format_components;
>> + _mesa_get_format_swizzle(format, swizzle);
>> + return true;
>> + case MESA_FORMAT_LAYOUT_PACKED:
>> + switch (*type) {
>> + case GL_UNSIGNED_BYTE:
>> + case GL_BYTE:
>> + if (_mesa_get_format_max_bits(format) != 8)
>> + return false;
>> + *num_components = _mesa_get_format_bytes(format);
>> + switch (*num_components) {
>> + case 1:
>> + endian = map_identity;
>> + break;
>> + case 2:
>> + endian = _mesa_little_endian() ? map_identity : map_1032;
>> + break;
>> + case 4:
>> + endian = _mesa_little_endian() ? map_identity : map_3210;
>> + break;
>> + default:
>> + assert(!"Invalid number of components");
>>
>
> I think MSVC (and maybe optimized gcc) will complain than 'endian' is not
> initialized for all cases. It would probably be best to initialize endian
> to point to map_identity[] in the declaration. If the "impossible" happens
> and the default case is hit in release build, we should try to not crash.
>
>
>
Thanks Brian, fixed. I also fixed it for the GL_SHORT case below too.
--Jason
>
>
> + }
>> + break;
>> + case GL_UNSIGNED_SHORT:
>> + case GL_SHORT:
>> + case GL_HALF_FLOAT:
>> + if (_mesa_get_format_max_bits(format) != 16)
>> + return false;
>> + *num_components = _mesa_get_format_bytes(format) / 2;
>> + switch (*num_components) {
>> + case 1:
>> + endian = map_identity;
>> + break;
>> + case 2:
>> + endian = _mesa_little_endian() ? map_identity : map_1032;
>> + break;
>> + default:
>> + assert(!"Invalid number of components");
>> + }
>> + break;
>> + case GL_UNSIGNED_INT:
>> + case GL_INT:
>> + case GL_FLOAT:
>> + /* This isn't packed. At least not really. */
>> + assert(format_components == 1);
>> + if (_mesa_get_format_max_bits(format) != 32)
>> + return false;
>> + *num_components = format_components;
>> + endian = map_identity;
>> + break;
>> + default:
>> + return false;
>> + }
>> +
>> + _mesa_get_format_swizzle(format, packed_swizzle);
>> +
>> + for (i = 0; i < 4; ++i)
>> + swizzle[i] = endian[packed_swizzle[i]];
>> +
>> + return true;
>> + case MESA_FORMAT_LAYOUT_OTHER:
>> + default:
>> + return false;
>> + }
>> +}
>> +
>> /* A bunch of format conversion macros and helper functions used below
>> */
>>
>> /* Only guaranteed to work for BITS <= 32 */
>> diff --git a/src/mesa/main/format_utils.h b/src/mesa/main/format_utils.h
>> index 1a6d7e0..632600e 100644
>> --- a/src/mesa/main/format_utils.h
>> +++ b/src/mesa/main/format_utils.h
>> @@ -65,6 +65,10 @@ _mesa_srgb_to_linear(float cs)
>>
>> float _mesa_srgb_ubyte_to_linear_float(uint8_t cl);
>>
>> +bool
>> +_mesa_format_to_array(mesa_format, GLenum *type, int *num_components,
>> + uint8_t swizzle[4], bool *normalized);
>> +
>> void
>> _mesa_swizzle_and_convert(void *dst, GLenum dst_type, int
>> num_dst_channels,
>> const void *src, GLenum src_type, int
>> num_src_channels,
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140804/b3797f6d/attachment-0001.html>
More information about the mesa-dev
mailing list