[Mesa-dev] [PATCH 1/2] util: add util_format_is_luminance/intensity/rgb(), etc
Jose Fonseca
jfonseca at vmware.com
Thu Sep 15 08:48:59 PDT 2011
Looks great to me.
Feel free to add a new UTIL_FORMAT_SWIZZLE_MAX if it helps.
Jose
----- Original Message -----
> From: Brian Paul <brianp at vmware.com>
>
> ---
> src/gallium/auxiliary/util/u_format.c | 94
> +++++++++++++++++++++++++++++++++
> src/gallium/auxiliary/util/u_format.h | 16 ++++++
> 2 files changed, 110 insertions(+), 0 deletions(-)
>
> diff --git a/src/gallium/auxiliary/util/u_format.c
> b/src/gallium/auxiliary/util/u_format.c
> index 34922ab..a31634c 100644
> --- a/src/gallium/auxiliary/util/u_format.c
> +++ b/src/gallium/auxiliary/util/u_format.c
> @@ -67,6 +67,100 @@ util_format_is_float(enum pipe_format format)
> }
>
>
> +/**
> + * Return the number of logical channels in the given format by
> + * examining swizzles.
> + * XXX this could be made into a public function if useful
> elsewhere.
> + */
> +static unsigned
> +nr_logical_channels(const struct util_format_description *desc)
> +{
> + boolean swizzle_used[UTIL_FORMAT_SWIZZLE_NONE + 1];
> +
> + memset(swizzle_used, 0, sizeof(swizzle_used));
> +
> + swizzle_used[desc->swizzle[0]] = TRUE;
> + swizzle_used[desc->swizzle[1]] = TRUE;
> + swizzle_used[desc->swizzle[2]] = TRUE;
> + swizzle_used[desc->swizzle[3]] = TRUE;
> +
> + return (swizzle_used[UTIL_FORMAT_SWIZZLE_X] +
> + swizzle_used[UTIL_FORMAT_SWIZZLE_Y] +
> + swizzle_used[UTIL_FORMAT_SWIZZLE_Z] +
> + swizzle_used[UTIL_FORMAT_SWIZZLE_W]);
> +}
> +
> +
> +/** Test if the format contains RGB, but not alpha */
> +boolean
> +util_format_is_rgb_no_alpha(enum pipe_format format)
> +{
> + const struct util_format_description *desc =
> + util_format_description(format);
> +
> + if ((desc->colorspace == UTIL_FORMAT_COLORSPACE_RGB ||
> + desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) &&
> + nr_logical_channels(desc) == 3) {
> + return TRUE;
> + }
> + return FALSE;
> +}
> +
> +
> +boolean
> +util_format_is_luminance(enum pipe_format format)
> +{
> + const struct util_format_description *desc =
> + util_format_description(format);
> +
> + if ((desc->colorspace == UTIL_FORMAT_COLORSPACE_RGB ||
> + desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) &&
> + desc->swizzle[0] == UTIL_FORMAT_SWIZZLE_X &&
> + desc->swizzle[1] == UTIL_FORMAT_SWIZZLE_X &&
> + desc->swizzle[2] == UTIL_FORMAT_SWIZZLE_X &&
> + desc->swizzle[3] == UTIL_FORMAT_SWIZZLE_1) {
> + return TRUE;
> + }
> + return FALSE;
> +}
> +
> +
> +boolean
> +util_format_is_luminance_alpha(enum pipe_format format)
> +{
> + const struct util_format_description *desc =
> + util_format_description(format);
> +
> + if ((desc->colorspace == UTIL_FORMAT_COLORSPACE_RGB ||
> + desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) &&
> + desc->swizzle[0] == UTIL_FORMAT_SWIZZLE_X &&
> + desc->swizzle[1] == UTIL_FORMAT_SWIZZLE_X &&
> + desc->swizzle[2] == UTIL_FORMAT_SWIZZLE_X &&
> + desc->swizzle[3] == UTIL_FORMAT_SWIZZLE_Y) {
> + return TRUE;
> + }
> + return FALSE;
> +}
> +
> +
> +boolean
> +util_format_is_intensity(enum pipe_format format)
> +{
> + const struct util_format_description *desc =
> + util_format_description(format);
> +
> + if ((desc->colorspace == UTIL_FORMAT_COLORSPACE_RGB ||
> + desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) &&
> + desc->swizzle[0] == UTIL_FORMAT_SWIZZLE_X &&
> + desc->swizzle[1] == UTIL_FORMAT_SWIZZLE_X &&
> + desc->swizzle[2] == UTIL_FORMAT_SWIZZLE_X &&
> + desc->swizzle[3] == UTIL_FORMAT_SWIZZLE_X) {
> + return TRUE;
> + }
> + return FALSE;
> +}
> +
> +
> boolean
> util_format_is_supported(enum pipe_format format, unsigned bind)
> {
> diff --git a/src/gallium/auxiliary/util/u_format.h
> b/src/gallium/auxiliary/util/u_format.h
> index 3527103..991dbc3 100644
> --- a/src/gallium/auxiliary/util/u_format.h
> +++ b/src/gallium/auxiliary/util/u_format.h
> @@ -477,6 +477,22 @@ boolean
> util_format_is_float(enum pipe_format format);
>
>
> +boolean
> +util_format_is_rgb_no_alpha(enum pipe_format format);
> +
> +
> +boolean
> +util_format_is_luminance(enum pipe_format format);
> +
> +
> +boolean
> +util_format_is_luminance_alpha(enum pipe_format format);
> +
> +
> +boolean
> +util_format_is_intensity(enum pipe_format format);
> +
> +
> /**
> * Whether the src format can be blitted to destation format with a
> simple
> * memcpy.
> --
> 1.7.3.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
More information about the mesa-dev
mailing list