diff options
author | Lionel Landwerlin <lionel.g.landwerlin@intel.com> | 2016-08-20 00:38:05 +0100 |
---|---|---|
committer | Lionel Landwerlin <lionel.g.landwerlin@intel.com> | 2016-09-01 11:36:09 +0100 |
commit | 2dc6930a5a54c0f586ba09437123c380f3eae456 (patch) | |
tree | 354f21d4de4642f9118212206f1000d9a6ad076f /src | |
parent | fc6be400115c0caa4e5cbb810917d6b8a11596a4 (diff) |
isl: round format alignment to nearest power of 2
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)
v3: reuse util_next_power_of_two() from gallium/aux/util/u_math.h (Ilia)
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Diffstat (limited to 'src')
-rw-r--r-- | src/intel/isl/isl.c | 1 | ||||
-rw-r--r-- | src/intel/isl/isl_priv.h | 9 |
2 files changed, 10 insertions, 0 deletions
diff --git a/src/intel/isl/isl.c b/src/intel/isl/isl.c index c4989dd7da..0487515d1d 100644 --- a/src/intel/isl/isl.c +++ b/src/intel/isl/isl.c @@ -1201,6 +1201,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 3a7af1ae35..9867e22a8e 100644 --- a/src/intel/isl/isl_priv.h +++ b/src/intel/isl/isl_priv.h @@ -99,6 +99,15 @@ isl_log2u(uint32_t n) } static inline uint32_t +isl_round_up_to_power_of_two(uint32_t value) +{ + if (value <= 1) + return value; + + return 1 << (32 - __builtin_clz(value - 1)); +} + +static inline uint32_t isl_minify(uint32_t n, uint32_t levels) { if (unlikely(n == 0)) |