Module: Mesa
Branch: 12.0
Commit: 352902218ea19dc22e37daf656118844371f69a6
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=352902218ea19dc22e37daf656118844371f69a6

Author: Marek Olšák <marek.ol...@amd.com>
Date:   Mon Oct 24 21:16:11 2016 +0200

gallium/radeon: make sure HTILE address is aligned properly

This should fix random GPU hangs on Hawaii and Fiji.
It's already been fixed in 13.0 and later.

Cc: 11.2 12.0 <mesa-sta...@lists.freedesktop.org>
Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl>
Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com>

---

 src/gallium/drivers/radeon/r600_texture.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/radeon/r600_texture.c 
b/src/gallium/drivers/radeon/r600_texture.c
index 8de3b18..8c0dfb2 100644
--- a/src/gallium/drivers/radeon/r600_texture.c
+++ b/src/gallium/drivers/radeon/r600_texture.c
@@ -723,10 +723,11 @@ static void r600_texture_alloc_cmask_separate(struct 
r600_common_screen *rscreen
 }
 
 static unsigned r600_texture_get_htile_size(struct r600_common_screen *rscreen,
-                                           struct r600_texture *rtex)
+                                           struct r600_texture *rtex,
+                                           unsigned *base_align)
 {
        unsigned cl_width, cl_height, width, height;
-       unsigned slice_elements, slice_bytes, pipe_interleave_bytes, base_align;
+       unsigned slice_elements, slice_bytes, pipe_interleave_bytes;
        unsigned num_pipes = rscreen->info.num_tile_pipes;
 
        if (rscreen->chip_class <= EVERGREEN &&
@@ -788,7 +789,7 @@ static unsigned r600_texture_get_htile_size(struct 
r600_common_screen *rscreen,
        slice_bytes = slice_elements * 4;
 
        pipe_interleave_bytes = rscreen->info.pipe_interleave_bytes;
-       base_align = num_pipes * pipe_interleave_bytes;
+       *base_align = num_pipes * pipe_interleave_bytes;
 
        rtex->htile.pitch = width;
        rtex->htile.height = height;
@@ -796,20 +797,22 @@ static unsigned r600_texture_get_htile_size(struct 
r600_common_screen *rscreen,
        rtex->htile.yalign = cl_height * 8;
 
        return (util_max_layer(&rtex->resource.b.b, 0) + 1) *
-               align(slice_bytes, base_align);
+               align(slice_bytes, *base_align);
 }
 
 static void r600_texture_allocate_htile(struct r600_common_screen *rscreen,
                                        struct r600_texture *rtex)
 {
-       unsigned htile_size = r600_texture_get_htile_size(rscreen, rtex);
+       unsigned alignment = 0;
+       unsigned htile_size = r600_texture_get_htile_size(rscreen, rtex,
+                                                         &alignment);
 
        if (!htile_size)
                return;
 
        rtex->htile_buffer = (struct r600_resource*)
-                            pipe_buffer_create(&rscreen->b, PIPE_BIND_CUSTOM,
-                                               PIPE_USAGE_DEFAULT, htile_size);
+               r600_aligned_buffer_create(&rscreen->b, 0, PIPE_USAGE_DEFAULT,
+                                          htile_size, alignment);
        if (rtex->htile_buffer == NULL) {
                /* this is not a fatal error as we can still keep rendering
                 * without htile buffer */

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to