isl: round format alignment to nearest power of 2
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Fri, 19 Aug 2016 23:38:05 +0000 (00:38 +0100)
committerLionel Landwerlin <lionel.g.landwerlin@intel.com>
Thu, 1 Sep 2016 10:36:09 +0000 (11:36 +0100)
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>
src/intel/isl/isl.c
src/intel/isl/isl_priv.h

index c4989dd..0487515 100644 (file)
@@ -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;
index 3a7af1a..9867e22 100644 (file)
@@ -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))