From: Marek Olšák <marek.ol...@amd.com>

This enables the tile swizzle for some cases of the displayable micro mode,
and it also fixes an addrlib assertion failure on Vega.
---
 src/amd/common/ac_surface.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/amd/common/ac_surface.c b/src/amd/common/ac_surface.c
index b294cd85259..2b20a553d51 100644
--- a/src/amd/common/ac_surface.c
+++ b/src/amd/common/ac_surface.c
@@ -408,20 +408,29 @@ static unsigned cik_get_macro_tile_index(struct 
radeon_surf *surf)
        tileb = 8 * 8 * surf->bpe;
        tileb = MIN2(surf->u.legacy.tile_split, tileb);
 
        for (index = 0; tileb > 64; index++)
                tileb >>= 1;
 
        assert(index < 16);
        return index;
 }
 
+static bool get_display_flag(const struct ac_surf_config *config,
+                            const struct radeon_surf *surf)
+{
+       return surf->flags & RADEON_SURF_SCANOUT &&
+              !(surf->flags & RADEON_SURF_FMASK) &&
+              config->info.samples <= 1 &&
+              surf->bpe >= 4 && surf->bpe <= 8;
+}
+
 /**
  * This must be called after the first level is computed.
  *
  * Copy surface-global settings like pipe/bank config from level 0 surface
  * computation, and compute tile swizzle.
  */
 static int gfx6_surface_settings(ADDR_HANDLE addrlib,
                                 const struct radeon_info *info,
                                 const struct ac_surf_config *config,
                                 ADDR_COMPUTE_SURFACE_INFO_OUTPUT* csio,
@@ -442,21 +451,21 @@ static int gfx6_surface_settings(ADDR_HANDLE addrlib,
        } else {
                surf->u.legacy.macro_tile_index = 0;
        }
 
        /* Compute tile swizzle. */
        /* TODO: fix tile swizzle with mipmapping for SI */
        if ((info->chip_class >= CIK || config->info.levels == 1) &&
            config->info.surf_index &&
            surf->u.legacy.level[0].mode == RADEON_SURF_MODE_2D &&
            !(surf->flags & (RADEON_SURF_Z_OR_SBUFFER | RADEON_SURF_SHAREABLE)) 
&&
-           (config->info.samples > 1 || !(surf->flags & RADEON_SURF_SCANOUT))) 
{
+           !get_display_flag(config, surf)) {
                ADDR_COMPUTE_BASE_SWIZZLE_INPUT AddrBaseSwizzleIn = {0};
                ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT AddrBaseSwizzleOut = {0};
 
                AddrBaseSwizzleIn.size = 
sizeof(ADDR_COMPUTE_BASE_SWIZZLE_INPUT);
                AddrBaseSwizzleOut.size = 
sizeof(ADDR_COMPUTE_BASE_SWIZZLE_OUTPUT);
 
                AddrBaseSwizzleIn.surfIndex = 
p_atomic_inc_return(config->info.surf_index) - 1;
                AddrBaseSwizzleIn.tileIndex = csio->tileIndex;
                AddrBaseSwizzleIn.macroModeIndex = csio->macroModeIndex;
                AddrBaseSwizzleIn.pTileInfo = csio->pTileInfo;
@@ -561,21 +570,21 @@ static int gfx6_compute_surface(ADDR_HANDLE addrlib,
                AddrSurfInfoIn.tileType = ADDR_DISPLAYABLE;
        else if (surf->flags & (RADEON_SURF_Z_OR_SBUFFER | RADEON_SURF_FMASK))
                AddrSurfInfoIn.tileType = ADDR_DEPTH_SAMPLE_ORDER;
        else
                AddrSurfInfoIn.tileType = ADDR_NON_DISPLAYABLE;
 
        AddrSurfInfoIn.flags.color = !(surf->flags & RADEON_SURF_Z_OR_SBUFFER);
        AddrSurfInfoIn.flags.depth = (surf->flags & RADEON_SURF_ZBUFFER) != 0;
        AddrSurfInfoIn.flags.cube = config->is_cube;
        AddrSurfInfoIn.flags.fmask = (surf->flags & RADEON_SURF_FMASK) != 0;
-       AddrSurfInfoIn.flags.display = (surf->flags & RADEON_SURF_SCANOUT) != 0;
+       AddrSurfInfoIn.flags.display = get_display_flag(config, surf);
        AddrSurfInfoIn.flags.pow2Pad = config->info.levels > 1;
        AddrSurfInfoIn.flags.tcCompatible = (surf->flags & 
RADEON_SURF_TC_COMPATIBLE_HTILE) != 0;
 
        /* Only degrade the tile mode for space if TC-compatible HTILE hasn't 
been
         * requested, because TC-compatible HTILE requires 2D tiling.
         */
        AddrSurfInfoIn.flags.opt4Space = !AddrSurfInfoIn.flags.tcCompatible &&
                                         !AddrSurfInfoIn.flags.fmask &&
                                         config->info.samples <= 1 &&
                                         (surf->flags & 
RADEON_SURF_OPTIMIZE_FOR_SPACE);
@@ -841,20 +850,21 @@ gfx9_get_preferred_swizzle_mode(ADDR_HANDLE addrlib,
        sin.numFrags = in->numFrags;
 
        if (flags & RADEON_SURF_SCANOUT)
                sin.preferredSwSet.sw_D = 1;
        else if (in->flags.depth || in->flags.stencil || is_fmask)
                sin.preferredSwSet.sw_Z = 1;
        else
                sin.preferredSwSet.sw_S = 1;
 
        if (is_fmask) {
+               sin.flags.display = 0;
                sin.flags.color = 0;
                sin.flags.fmask = 1;
        }
 
        ret = Addr2GetPreferredSurfaceSetting(addrlib, &sin, &sout);
        if (ret != ADDR_OK)
                return ret;
 
        *swizzle_mode = sout.swizzleMode;
        return 0;
@@ -936,21 +946,21 @@ static int gfx9_compute_miptree(ADDR_HANDLE addrlib,
                surf->htile_slice_size = hout.sliceSize;
                surf->htile_alignment = hout.baseAlign;
        } else {
                /* Compute tile swizzle for the color surface.
                 * All *_X and *_T modes can use the swizzle.
                 */
                if (config->info.surf_index &&
                    in->swizzleMode >= ADDR_SW_64KB_Z_T &&
                    !out.mipChainInTail &&
                    !(surf->flags & RADEON_SURF_SHAREABLE) &&
-                   (in->numSamples > 1 || !(surf->flags & 
RADEON_SURF_SCANOUT))) {
+                   !in->flags.display) {
                        ADDR2_COMPUTE_PIPEBANKXOR_INPUT xin = {0};
                        ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT xout = {0};
 
                        xin.size = sizeof(ADDR2_COMPUTE_PIPEBANKXOR_INPUT);
                        xout.size = sizeof(ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT);
 
                        xin.surfIndex = 
p_atomic_inc_return(config->info.surf_index) - 1;
                        xin.flags = in->flags;
                        xin.swizzleMode = in->swizzleMode;
                        xin.resourceType = in->resourceType;
@@ -1189,21 +1199,21 @@ static int gfx9_compute_surface(ADDR_HANDLE addrlib,
                        AddrSurfInfoIn.format = ADDR_FMT_32_32_32_32;
                        break;
                default:
                        assert(0);
                }
                AddrSurfInfoIn.bpp = surf->bpe * 8;
        }
 
        AddrSurfInfoIn.flags.color = !(surf->flags & RADEON_SURF_Z_OR_SBUFFER);
        AddrSurfInfoIn.flags.depth = (surf->flags & RADEON_SURF_ZBUFFER) != 0;
-       AddrSurfInfoIn.flags.display = (surf->flags & RADEON_SURF_SCANOUT) != 0;
+       AddrSurfInfoIn.flags.display = get_display_flag(config, surf);
        /* flags.texture currently refers to TC-compatible HTILE */
        AddrSurfInfoIn.flags.texture = AddrSurfInfoIn.flags.color ||
                                       surf->flags & 
RADEON_SURF_TC_COMPATIBLE_HTILE;
        AddrSurfInfoIn.flags.opt4space = 1;
 
        AddrSurfInfoIn.numMipLevels = config->info.levels;
        AddrSurfInfoIn.numSamples = config->info.samples ? config->info.samples 
: 1;
        AddrSurfInfoIn.numFrags = AddrSurfInfoIn.numSamples;
 
        /* GFX9 doesn't support 1D depth textures, so allocate all 1D textures
-- 
2.15.1

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

Reply via email to