radv: add separate fmask tile swizzle counter.
authorDave Airlie <airlied@redhat.com>
Fri, 4 Aug 2017 05:54:15 +0000 (06:54 +0100)
committerDave Airlie <airlied@redhat.com>
Sun, 6 Aug 2017 23:08:43 +0000 (00:08 +0100)
This mirrors what Marek has done for radeonsi, and uses
a separate counter to handle the fmask surface for MSAA
MRTs.

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/amd/vulkan/radv_device.c
src/amd/vulkan/radv_image.c
src/amd/vulkan/radv_private.h

index ce65ba378e17bf8ea6b714916ac33823389b929e..e5bedf32b15c44ab685b7bb38d06991dd1f2c384 100644 (file)
@@ -3042,7 +3042,7 @@ radv_initialise_color_surface(struct radv_device *device,
                va = device->ws->buffer_get_va(iview->bo) + iview->image->offset + iview->image->fmask.offset;
                cb->cb_color_fmask = va >> 8;
                if (device->physical_device->rad_info.chip_class < GFX9)
-                       cb->cb_color_fmask |= iview->image->surface.tile_swizzle;
+                       cb->cb_color_fmask |= iview->image->fmask.tile_swizzle;
        } else {
                cb->cb_color_fmask = cb->cb_color_base;
        }
index c27c3b6ddc6813f6b797179876e88a5a9076fe22..1ccd4a463f077b627bc9fb460b6a05657c8e98cd 100644 (file)
@@ -484,7 +484,7 @@ si_make_texture_descriptor(struct radv_device *device,
 
                fmask_state[0] = va >> 8;
                if (device->physical_device->rad_info.chip_class < GFX9)
-                       fmask_state[0] |= image->surface.tile_swizzle;
+                       fmask_state[0] |= image->fmask.tile_swizzle;
                fmask_state[1] = S_008F14_BASE_ADDRESS_HI(va >> 40) |
                        S_008F14_DATA_FORMAT_GFX6(fmask_format) |
                        S_008F14_NUM_FORMAT_GFX6(num_format);
@@ -616,6 +616,8 @@ radv_image_get_fmask_info(struct radv_device *device,
        info.samples = 1;
        fmask.flags = image->surface.flags | RADEON_SURF_FMASK;
 
+       info.surf_index = &device->fmask_mrt_offset_counter;
+
        /* Force 2D tiling if it wasn't set. This may occur when creating
         * FMASK for MSAA resolve on R6xx. On R6xx, the single-sample
         * destination buffer must have an FMASK too. */
@@ -644,6 +646,7 @@ radv_image_get_fmask_info(struct radv_device *device,
        out->tile_mode_index = fmask.u.legacy.tiling_index[0];
        out->pitch_in_pixels = fmask.u.legacy.level[0].nblk_x;
        out->bank_height = fmask.u.legacy.bankh;
+       out->tile_swizzle = fmask.tile_swizzle;
        out->alignment = MAX2(256, fmask.surf_alignment);
        out->size = fmask.surf_size;
 }
index 1f0e0252bf1c43ed37af26024d64dbf0bd47cef2..6c49395d0ae9a7e3b608d9b00dd4092628963b19 100644 (file)
@@ -547,8 +547,12 @@ struct radv_device {
        /* Backup in-memory cache to be used if the app doesn't provide one */
        struct radv_pipeline_cache *                mem_cache;
 
+       /*
+        * use different counters so MSAA MRTs get consecutive surface indices,
+        * even if MASK is allocated in between.
+        */
        uint32_t image_mrt_offset_counter;
-
+       uint32_t fmask_mrt_offset_counter;
        struct list_head shader_slabs;
        mtx_t shader_slab_mutex;
 };
@@ -1193,6 +1197,7 @@ struct radv_fmask_info {
        unsigned bank_height;
        unsigned slice_tile_max;
        unsigned tile_mode_index;
+       unsigned tile_swizzle;
 };
 
 struct radv_cmask_info {