radv: fix tile swizzle regression on mipmaps.
authorDave Airlie <airlied@redhat.com>
Fri, 4 Aug 2017 05:43:26 +0000 (06:43 +0100)
committerDave Airlie <airlied@redhat.com>
Fri, 4 Aug 2017 05:45:36 +0000 (06:45 +0100)
When Marek enabled mipmapped swizzle, radv didn't
have the code in place to handle it. This fixes the
regression.

I'll look more into GFX9 once I have a vega card (soon).
Fixes: 2b7e8556 (ac/surface: enable tile swizzle for mipmapped textures)
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/amd/vulkan/radv_device.c

index 9a34a20082dff55b64282303101f6b47afb49fab..cb68b52727639942d556947b0894945ceb1f759c 100644 (file)
@@ -2964,6 +2964,8 @@ radv_initialise_color_surface(struct radv_device *device,
 
        va = device->ws->buffer_get_va(iview->bo) + iview->image->offset;
 
+       cb->cb_color_base = va >> 8;
+
        if (device->physical_device->rad_info.chip_class >= GFX9) {
                struct gfx9_surf_meta_flags meta;
                if (iview->image->dcc_offset)
@@ -2976,12 +2978,14 @@ radv_initialise_color_surface(struct radv_device *device,
                        S_028C74_RB_ALIGNED(meta.rb_aligned) |
                        S_028C74_PIPE_ALIGNED(meta.pipe_aligned);
 
-               va += iview->image->surface.u.gfx9.surf_offset >> 8;
+               cb->cb_color_base += iview->image->surface.u.gfx9.surf_offset >> 8;
        } else {
                const struct legacy_surf_level *level_info = &surf->u.legacy.level[iview->base_mip];
                unsigned pitch_tile_max, slice_tile_max, tile_mode_index;
 
-               va += level_info->offset;
+               cb->cb_color_base += level_info->offset >> 8;
+               if (level_info->mode == RADEON_SURF_MODE_2D)
+                       cb->cb_color_base |= iview->image->surface.tile_swizzle;
 
                pitch_tile_max = level_info->nblk_x / 8 - 1;
                slice_tile_max = (level_info->nblk_x * level_info->nblk_y) / 64 - 1;
@@ -3008,9 +3012,6 @@ radv_initialise_color_surface(struct radv_device *device,
                }
        }
 
-       cb->cb_color_base = va >> 8;
-       if (device->physical_device->rad_info.chip_class < GFX9)
-               cb->cb_color_base |= iview->image->surface.tile_swizzle;
        /* CMASK variables */
        va = device->ws->buffer_get_va(iview->bo) + iview->image->offset;
        va += iview->image->cmask.offset;