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

---
 src/amd/common/ac_surface.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/src/amd/common/ac_surface.c b/src/amd/common/ac_surface.c
index 1e1641daeec..b294cd85259 100644
--- a/src/amd/common/ac_surface.c
+++ b/src/amd/common/ac_surface.c
@@ -807,21 +807,22 @@ static int gfx6_compute_surface(ADDR_HANDLE addrlib,
        surf->is_displayable = surf->is_linear ||
                               surf->micro_tile_mode == 
RADEON_MICRO_MODE_DISPLAY ||
                               surf->micro_tile_mode == 
RADEON_MICRO_MODE_ROTATED;
        return 0;
 }
 
 /* This is only called when expecting a tiled layout. */
 static int
 gfx9_get_preferred_swizzle_mode(ADDR_HANDLE addrlib,
                                ADDR2_COMPUTE_SURFACE_INFO_INPUT *in,
-                               bool is_fmask, AddrSwizzleMode *swizzle_mode)
+                               bool is_fmask, unsigned flags,
+                               AddrSwizzleMode *swizzle_mode)
 {
        ADDR_E_RETURNCODE ret;
        ADDR2_GET_PREFERRED_SURF_SETTING_INPUT sin = {0};
        ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT sout = {0};
 
        sin.size = sizeof(ADDR2_GET_PREFERRED_SURF_SETTING_INPUT);
        sout.size = sizeof(ADDR2_GET_PREFERRED_SURF_SETTING_OUTPUT);
 
        sin.flags = in->flags;
        sin.resourceType = in->resourceType;
@@ -832,20 +833,27 @@ gfx9_get_preferred_swizzle_mode(ADDR_HANDLE addrlib,
        sin.forbiddenBlock.var = 1; /* don't allow the variable-sized swizzle 
modes */
        sin.forbiddenBlock.linear = 1; /* don't allow linear swizzle modes */
        sin.bpp = in->bpp;
        sin.width = in->width;
        sin.height = in->height;
        sin.numSlices = in->numSlices;
        sin.numMipLevels = in->numMipLevels;
        sin.numSamples = in->numSamples;
        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.color = 0;
                sin.flags.fmask = 1;
        }
 
        ret = Addr2GetPreferredSurfaceSetting(addrlib, &sin, &sout);
        if (ret != ADDR_OK)
                return ret;
 
        *swizzle_mode = sout.swizzleMode;
@@ -1029,21 +1037,23 @@ static int gfx9_compute_miptree(ADDR_HANDLE addrlib,
                }
 
                /* FMASK */
                if (in->numSamples > 1) {
                        ADDR2_COMPUTE_FMASK_INFO_INPUT fin = {0};
                        ADDR2_COMPUTE_FMASK_INFO_OUTPUT fout = {0};
 
                        fin.size = sizeof(ADDR2_COMPUTE_FMASK_INFO_INPUT);
                        fout.size = sizeof(ADDR2_COMPUTE_FMASK_INFO_OUTPUT);
 
-                       ret = gfx9_get_preferred_swizzle_mode(addrlib, in, 
true, &fin.swizzleMode);
+                       ret = gfx9_get_preferred_swizzle_mode(addrlib, in,
+                                                             true, surf->flags,
+                                                             &fin.swizzleMode);
                        if (ret != ADDR_OK)
                                return ret;
 
                        fin.unalignedWidth = in->width;
                        fin.unalignedHeight = in->height;
                        fin.numSlices = in->numSlices;
                        fin.numSamples = in->numSamples;
                        fin.numFrags = in->numFrags;
 
                        ret = Addr2ComputeFmaskInfo(addrlib, &fin, &fout);
@@ -1225,21 +1235,22 @@ static int gfx9_compute_surface(ADDR_HANDLE addrlib,
                AddrSurfInfoIn.swizzleMode = ADDR_SW_LINEAR;
                break;
 
        case RADEON_SURF_MODE_1D:
        case RADEON_SURF_MODE_2D:
                if (surf->flags & RADEON_SURF_IMPORTED) {
                        AddrSurfInfoIn.swizzleMode = 
surf->u.gfx9.surf.swizzle_mode;
                        break;
                }
 
-               r = gfx9_get_preferred_swizzle_mode(addrlib, &AddrSurfInfoIn, 
false,
+               r = gfx9_get_preferred_swizzle_mode(addrlib, &AddrSurfInfoIn,
+                                                   false, surf->flags,
                                                    
&AddrSurfInfoIn.swizzleMode);
                if (r)
                        return r;
                break;
 
        default:
                assert(0);
        }
 
        surf->u.gfx9.resource_type = AddrSurfInfoIn.resourceType;
@@ -1261,21 +1272,22 @@ static int gfx9_compute_surface(ADDR_HANDLE addrlib,
        if (r)
                return r;
 
        /* Calculate texture layout information for stencil. */
        if (surf->flags & RADEON_SURF_SBUFFER) {
                AddrSurfInfoIn.flags.stencil = 1;
                AddrSurfInfoIn.bpp = 8;
                AddrSurfInfoIn.format = ADDR_FMT_8;
 
                if (!AddrSurfInfoIn.flags.depth) {
-                       r = gfx9_get_preferred_swizzle_mode(addrlib, 
&AddrSurfInfoIn, false,
+                       r = gfx9_get_preferred_swizzle_mode(addrlib, 
&AddrSurfInfoIn,
+                                                           false, surf->flags,
                                                            
&AddrSurfInfoIn.swizzleMode);
                        if (r)
                                return r;
                } else
                        AddrSurfInfoIn.flags.depth = 0;
 
                r = gfx9_compute_miptree(addrlib, config, surf, compressed,
                                         &AddrSurfInfoIn);
                if (r)
                        return r;
-- 
2.15.1

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

Reply via email to