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