broadcom/vc5: Fix padding of NPOT miplevels >= 2.
authorEric Anholt <eric@anholt.net>
Tue, 27 Mar 2018 23:29:10 +0000 (16:29 -0700)
committerEric Anholt <eric@anholt.net>
Wed, 28 Mar 2018 04:16:23 +0000 (21:16 -0700)
The power-of-two padded size that gets minified is based on level 1's
dimensions, not level 0's, which starts to differ at a width of 9.

Fixes all failures on texelFetch fs sampler2D 1x1x1-64x64x1

src/gallium/drivers/vc5/vc5_resource.c

index 1f0ddb1a2955e3b230ef6bfffbc2266326d513a5..321a14b9046cafbb14fa660be0e0eaf0bf1451f0 100644 (file)
@@ -390,9 +390,14 @@ vc5_setup_slices(struct vc5_resource *rsc)
         uint32_t width = prsc->width0;
         uint32_t height = prsc->height0;
         uint32_t depth = prsc->depth0;
-        uint32_t pot_width = util_next_power_of_two(width);
-        uint32_t pot_height = util_next_power_of_two(height);
-        uint32_t pot_depth = util_next_power_of_two(depth);
+        /* Note that power-of-two padding is based on level 1.  These are not
+         * equivalent to just util_next_power_of_two(dimension), because at a
+         * level 0 dimension of 9, the level 1 power-of-two padded value is 4,
+         * not 8.
+         */
+        uint32_t pot_width = 2 * util_next_power_of_two(u_minify(width, 1));
+        uint32_t pot_height = 2 * util_next_power_of_two(u_minify(height, 1));
+        uint32_t pot_depth = 2 * util_next_power_of_two(u_minify(depth, 1));
         uint32_t offset = 0;
         uint32_t utile_w = vc5_utile_width(rsc->cpp);
         uint32_t utile_h = vc5_utile_height(rsc->cpp);