panfrost: Fix stride check when mipmapping
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Sat, 8 Jun 2019 00:07:13 +0000 (17:07 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Mon, 10 Jun 2019 13:47:18 +0000 (06:47 -0700)
Now that we support custom strides on mipmapped textures (theoretically,
at least), extend the stride check to support mipmaps.  Fixes incorrect
strides of linear windows in Weston.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Reviewed-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
src/gallium/drivers/panfrost/pan_context.c

index b08f50291fba604bd5d8dca50bd370a95b9dfcf0..13bb4e1e74a0fa4746c27e95cf35d69428493b37 100644 (file)
@@ -1994,15 +1994,23 @@ panfrost_create_sampler_view(
 
         /* Check if we need to set a custom stride by computing the "expected"
          * stride and comparing it to what the BO actually wants. Only applies
-         * to linear textures TODO: Mipmap? */
+         * to linear textures, since tiled/compressed textures have strict
+         * alignment requirements for their strides as it is */
 
-        unsigned actual_stride = prsrc->bo->slices[0].stride;
+        unsigned first_level = template->u.tex.first_level;
+        unsigned last_level = template->u.tex.last_level;
 
-        if (prsrc->bo->layout == PAN_LINEAR &&
-            template->u.tex.last_level == 0 &&
-            template->u.tex.first_level == 0 &&
-            (texture->width0 * bytes_per_pixel) != actual_stride) {
-                usage2_layout |= MALI_TEX_MANUAL_STRIDE;
+        if (prsrc->bo->layout == PAN_LINEAR) {
+                for (unsigned l = first_level; l <= last_level; ++l) {
+                        unsigned actual_stride = prsrc->bo->slices[l].stride;
+                        unsigned width = u_minify(texture->width0, l);
+                        unsigned comp_stride = width * bytes_per_pixel;
+
+                        if (comp_stride != actual_stride) {
+                                usage2_layout |= MALI_TEX_MANUAL_STRIDE;
+                                break;
+                        }
+                }
         }
 
         struct mali_texture_descriptor texture_descriptor = {