[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