ac/surface: fix hybrid graphics where APU=GFX9, dGPU=older
authorMarek Olšák <marek.olsak@amd.com>
Mon, 24 Jul 2017 22:08:55 +0000 (00:08 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 26 Jul 2017 17:53:26 +0000 (19:53 +0200)
v2: don't do it for compressed textures (bpp = 0)

Cc: 17.2 <mesa-stable@lists.freedesktop.org>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com> (v1)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com> (v1)
src/amd/common/ac_surface.c

index cd3d7b715cfe1268269ffd43d6a4fccbb9927af5..26f3729adf9c8dfa814187d69df046191f8d76a3 100644 (file)
@@ -257,6 +257,18 @@ static int gfx6_compute_level(ADDR_HANDLE addrlib,
        AddrSurfInfoIn->width = u_minify(config->info.width, level);
        AddrSurfInfoIn->height = u_minify(config->info.height, level);
 
+       /* Make GFX6 linear surfaces compatible with GFX9 for hybrid graphics,
+        * because GFX9 needs linear alignment of 256 bytes.
+        */
+       if (config->info.levels == 1 &&
+           AddrSurfInfoIn->tileMode == ADDR_TM_LINEAR_ALIGNED &&
+           AddrSurfInfoIn->bpp) {
+               unsigned alignment = 256 / (AddrSurfInfoIn->bpp / 8);
+
+               assert(util_is_power_of_two(AddrSurfInfoIn->bpp));
+               AddrSurfInfoIn->width = align(AddrSurfInfoIn->width, alignment);
+       }
+
        if (config->is_3d)
                AddrSurfInfoIn->numSlices = u_minify(config->info.depth, level);
        else if (config->is_cube)