From dfa1e8c9437deb56cb1f51088876e7eb5ff0056a Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 18 Jul 2018 11:49:41 +1000 Subject: [PATCH] u_math: bring over u_bit_scan_consecutive_range. This just takes this fn over from mesa to use in virgl Reviewed-by: Tomeu Vizoso --- src/gallium/auxiliary/util/u_math.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/gallium/auxiliary/util/u_math.h b/src/gallium/auxiliary/util/u_math.h index dbacff6..dd8e549 100644 --- a/src/gallium/auxiliary/util/u_math.h +++ b/src/gallium/auxiliary/util/u_math.h @@ -584,6 +584,31 @@ static inline int u_bit_scan(unsigned *mask) return i; } +/* For looping over a bitmask when you want to loop over consecutive bits + * manually, for example: + * + * while (mask) { + * int start, count, i; + * + * u_bit_scan_consecutive_range(&mask, &start, &count); + * + * for (i = 0; i < count; i++) + * ... process element (start+i) + * } + */ +static inline void +u_bit_scan_consecutive_range(unsigned *mask, int *start, int *count) +{ + if (*mask == 0xffffffff) { + *start = 0; + *count = 32; + *mask = 0; + return; + } + *start = ffs(*mask) - 1; + *count = ffs(~(*mask >> *start)) - 1; + *mask &= ~(((1u << *count) - 1) << *start); +} /** * Return float bits.