Looks great to me. Feel free to add a new UTIL_FORMAT_SWIZZLE_MAX if it helps.
Jose ----- Original Message ----- > From: Brian Paul <bri...@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@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