From d03d29a0442e8c1bfb1567f33abc83373a203220 Mon Sep 17 00:00:00 2001 From: James Benton Date: Wed, 11 Jul 2012 15:32:47 +0100 Subject: util: Updated util_format_is_array to be more accurate. Will allow formats with padding, e.g. RGBX. Will now allow swizzled formats as long as the alpha is channel 3. Reviewed-by: Jose Fonseca --- src/gallium/auxiliary/util/u_format.c | 14 ++++++++++++-- src/gallium/auxiliary/util/u_format.h | 5 ++++- 2 files changed, 16 insertions(+), 3 deletions(-) (limited to 'src/gallium') diff --git a/src/gallium/auxiliary/util/u_format.c b/src/gallium/auxiliary/util/u_format.c index f572a612e24..ddce95601a6 100644 --- a/src/gallium/auxiliary/util/u_format.c +++ b/src/gallium/auxiliary/util/u_format.c @@ -147,9 +147,12 @@ util_format_is_array(const struct util_format_description *desc) } for (chan = 0; chan < desc->nr_channels; ++chan) { - if (desc->swizzle[chan] != chan) + if (desc->channel[chan].size != desc->channel[0].size) return FALSE; + if (desc->channel[chan].type == UTIL_FORMAT_TYPE_VOID && (chan + 1) == desc->nr_channels) + continue; + if (desc->channel[chan].type != desc->channel[0].type) return FALSE; @@ -158,9 +161,16 @@ util_format_is_array(const struct util_format_description *desc) if (desc->channel[chan].pure_integer != desc->channel[0].pure_integer) return FALSE; + } - if (desc->channel[chan].size != desc->channel[0].size) + if (desc->nr_channels == 4) { + if (desc->swizzle[3] < 3) return FALSE; + } else { + for (chan = 0; chan < desc->nr_channels; ++chan) { + if (desc->swizzle[chan] != chan) + return FALSE; + } } return TRUE; diff --git a/src/gallium/auxiliary/util/u_format.h b/src/gallium/auxiliary/util/u_format.h index a718389dd92..25bfd234b9a 100644 --- a/src/gallium/auxiliary/util/u_format.h +++ b/src/gallium/auxiliary/util/u_format.h @@ -592,7 +592,10 @@ util_format_is_pure_uint(enum pipe_format format); /** * Whether the format is a simple array format where all channels - * are of the same type and can be loaded from memory as a vector + * are of the same type and can be loaded from memory as a vector. + * + * If format is 4 channel it can be swizzled (eg BGRA) as long + * as the alpha is the 3rd channel. */ boolean util_format_is_array(const struct util_format_description *desc); -- cgit v1.2.3