All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] radeon: fix pitch alignment for non-power-of-two mipmaps on SI
@ 2013-09-19 12:33 Marek Olšák
  2013-09-19 14:41 ` Michel Dänzer
  0 siblings, 1 reply; 6+ messages in thread
From: Marek Olšák @ 2013-09-19 12:33 UTC (permalink / raw)
  To: dri-devel

This fixes VM protection faults.

I have a new piglit test which can iterate over all possible widths, heights,
and depths (including NPOT) and tests mipmapping with various texture targets.

After this is committed, I'll make a new release of libdrm and bump
the libdrm version requirement in Mesa.
---
 radeon/radeon_surface.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/radeon/radeon_surface.c b/radeon/radeon_surface.c
index 1710e34..d5c45c4 100644
--- a/radeon/radeon_surface.c
+++ b/radeon/radeon_surface.c
@@ -1412,7 +1412,11 @@ static void si_surf_minify(struct radeon_surface *surf,
                            uint32_t xalign, uint32_t yalign, uint32_t zalign,
                            uint32_t slice_align, unsigned offset)
 {
-    surflevel->npix_x = mip_minify(surf->npix_x, level);
+    if (level == 0) {
+        surflevel->npix_x = surf->npix_x;
+    } else {
+        surflevel->npix_x = mip_minify(next_power_of_two(surf->npix_x), level);
+    }
     surflevel->npix_y = mip_minify(surf->npix_y, level);
     surflevel->npix_z = mip_minify(surf->npix_z, level);
 
@@ -1434,7 +1438,7 @@ static void si_surf_minify(struct radeon_surface *surf,
     if (level == 0 && surf->last_level == 0)
         /* Non-mipmap pitch padded to slice alignment */
         xalign = MAX2(xalign, slice_align / surf->bpe);
-    else
+    else if (surflevel->mode == RADEON_SURF_MODE_LINEAR_ALIGNED)
         /* Small rows evenly distributed across slice */
         xalign = MAX2(xalign, slice_align / surf->bpe / surflevel->nblk_y);
 
@@ -1456,7 +1460,11 @@ static void si_surf_minify_2d(struct radeon_surface *surf,
 {
     unsigned mtile_pr, mtile_ps;
 
-    surflevel->npix_x = mip_minify(surf->npix_x, level);
+    if (level == 0) {
+        surflevel->npix_x = surf->npix_x;
+    } else {
+        surflevel->npix_x = mip_minify(next_power_of_two(surf->npix_x), level);
+    }
     surflevel->npix_y = mip_minify(surf->npix_y, level);
     surflevel->npix_z = mip_minify(surf->npix_z, level);
 
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2013-09-20 14:43 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-09-19 12:33 [PATCH] radeon: fix pitch alignment for non-power-of-two mipmaps on SI Marek Olšák
2013-09-19 14:41 ` Michel Dänzer
2013-09-19 16:37   ` Marek Olšák
2013-09-19 16:41     ` Marek Olšák
2013-09-20 14:14     ` Michel Dänzer
2013-09-20 14:43       ` Marek Olšák

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.