diff options
Diffstat (limited to 'src/gallium/auxiliary')
-rw-r--r-- | src/gallium/auxiliary/util/u_format.c | 14 | ||||
-rw-r--r-- | src/gallium/auxiliary/util/u_format.h | 5 |
2 files changed, 16 insertions, 3 deletions
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); |