You may be interested in the implementation in gallium/aux/util/u_math.h: /** * Returns the smallest power of two >= x */ static inline unsigned util_next_power_of_two(unsigned x) { #if defined(HAVE___BUILTIN_CLZ) if (x <= 1) return 1;
return (1 << ((sizeof(unsigned) * 8) - __builtin_clz(x - 1))); #else I believe that ends up in fewer operations. Your call. -ilia On Wed, Aug 24, 2016 at 5:37 AM, Lionel Landwerlin <llandwer...@gmail.com> wrote: > A few inline asserts in anv assume alignments are power of 2, but with > formats like R8G8B8 we have odd alignments. > > v2: round up to power of 2 (Ilia) > > Signed-off-by: Lionel Landwerlin <lionel.g.landwer...@intel.com> > Cc: Ilia Mirkin <imir...@alum.mit.edu> > Cc: Jason Ekstrand <ja...@jlekstrand.net> > --- > src/intel/isl/isl.c | 1 + > src/intel/isl/isl_priv.h | 10 ++++++++++ > 2 files changed, 11 insertions(+) > > diff --git a/src/intel/isl/isl.c b/src/intel/isl/isl.c > index 18e95e2..ae7b9af 100644 > --- a/src/intel/isl/isl.c > +++ b/src/intel/isl/isl.c > @@ -1182,6 +1182,7 @@ isl_surf_init_s(const struct isl_device *dev, > base_alignment = MAX(base_alignment, fmtl->bpb / 8); > } > } > + base_alignment = isl_round_up_to_power_of_two(base_alignment); > } else { > assert(phys_slice0_sa.w % fmtl->bw == 0); > const uint32_t total_w_el = phys_slice0_sa.width / fmtl->bw; > diff --git a/src/intel/isl/isl_priv.h b/src/intel/isl/isl_priv.h > index 3a7af1a..19b5176 100644 > --- a/src/intel/isl/isl_priv.h > +++ b/src/intel/isl/isl_priv.h > @@ -99,6 +99,16 @@ isl_log2u(uint32_t n) > } > > static inline uint32_t > +isl_round_up_to_power_of_two(uint32_t value) > +{ > + uint32_t r = 1 << isl_log2u(value); > + > + if ((~r & value) != 0) > + return r << 1; > + return r; > +} > + > +static inline uint32_t > isl_minify(uint32_t n, uint32_t levels) > { > if (unlikely(n == 0)) > -- > 2.9.3 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev