[Mesa-dev] [PATCH] isl: round format alignment to nearest power of 2

Ilia Mirkin imirkin at alum.mit.edu
Wed Aug 24 14:36:50 UTC 2016


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
<llandwerlin at 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.landwerlin at intel.com>
> Cc: Ilia Mirkin <imirkin at alum.mit.edu>
> Cc: Jason Ekstrand <jason at 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
>


More information about the mesa-dev mailing list