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

Having the over-alignment on staging surfaces breaks the user_stride
mechanism.

v2: Add a new SURF flag.
---
 src/amd/common/ac_surface.c               | 5 ++++-
 src/amd/common/ac_surface.h               | 1 +
 src/gallium/drivers/radeonsi/si_texture.c | 3 +++
 3 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/amd/common/ac_surface.c b/src/amd/common/ac_surface.c
index a23952717e3..9595298055b 100644
--- a/src/amd/common/ac_surface.c
+++ b/src/amd/common/ac_surface.c
@@ -266,22 +266,25 @@ static int gfx6_compute_level(ADDR_HANDLE addrlib,
 {
        struct legacy_surf_level *surf_level;
        ADDR_E_RETURNCODE ret;
 
        AddrSurfInfoIn->mipLevel = level;
        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.
+        *
+        * This should not be applied to staging surfaces.
         */
-       if (config->info.levels == 1 &&
+       if (!(surf->flags & RADEON_SURF_TRANSFER_STAGING) &&
+           config->info.levels == 1 &&
            AddrSurfInfoIn->tileMode == ADDR_TM_LINEAR_ALIGNED &&
            AddrSurfInfoIn->bpp) {
                unsigned alignment = 256 / (AddrSurfInfoIn->bpp / 8);
 
                assert(util_is_power_of_two_or_zero(AddrSurfInfoIn->bpp));
                AddrSurfInfoIn->width = align(AddrSurfInfoIn->width, alignment);
        }
 
        if (config->is_3d)
                AddrSurfInfoIn->numSlices = u_minify(config->info.depth, level);
diff --git a/src/amd/common/ac_surface.h b/src/amd/common/ac_surface.h
index 37df859e6de..4060b84edab 100644
--- a/src/amd/common/ac_surface.h
+++ b/src/amd/common/ac_surface.h
@@ -61,20 +61,21 @@ enum radeon_micro_mode {
 #define RADEON_SURF_ZBUFFER                     (1 << 17)
 #define RADEON_SURF_SBUFFER                     (1 << 18)
 #define RADEON_SURF_Z_OR_SBUFFER                (RADEON_SURF_ZBUFFER | 
RADEON_SURF_SBUFFER)
 /* bits 19 and 20 are reserved for libdrm_radeon, don't use them */
 #define RADEON_SURF_FMASK                       (1 << 21)
 #define RADEON_SURF_DISABLE_DCC                 (1 << 22)
 #define RADEON_SURF_TC_COMPATIBLE_HTILE         (1 << 23)
 #define RADEON_SURF_IMPORTED                    (1 << 24)
 #define RADEON_SURF_OPTIMIZE_FOR_SPACE          (1 << 25)
 #define RADEON_SURF_SHAREABLE                   (1 << 26)
+#define RADEON_SURF_TRANSFER_STAGING            (1 << 27)
 
 struct legacy_surf_level {
     uint64_t                    offset;
     uint32_t                    slice_size_dw; /* in dwords; max = 4GB / 4. */
     uint32_t                    dcc_offset; /* relative offset within DCC mip 
tree */
     uint32_t                    dcc_fast_clear_size;
     unsigned                    nblk_x:15;
     unsigned                    nblk_y:15;
     enum radeon_surf_mode       mode:2;
 };
diff --git a/src/gallium/drivers/radeonsi/si_texture.c 
b/src/gallium/drivers/radeonsi/si_texture.c
index 368fb034977..4ac284bb9d4 100644
--- a/src/gallium/drivers/radeonsi/si_texture.c
+++ b/src/gallium/drivers/radeonsi/si_texture.c
@@ -295,20 +295,23 @@ static int si_init_surface(struct si_screen *sscreen,
                flags |= RADEON_SURF_SCANOUT;
        }
 
        if (ptex->bind & PIPE_BIND_SHARED)
                flags |= RADEON_SURF_SHAREABLE;
        if (is_imported)
                flags |= RADEON_SURF_IMPORTED | RADEON_SURF_SHAREABLE;
        if (!(ptex->flags & SI_RESOURCE_FLAG_FORCE_TILING))
                flags |= RADEON_SURF_OPTIMIZE_FOR_SPACE;
 
+       if (ptex->flags & SI_RESOURCE_FLAG_TRANSFER)
+               flags |= RADEON_SURF_TRANSFER_STAGING;
+
        r = sscreen->ws->surface_init(sscreen->ws, ptex, flags, bpe,
                                      array_mode, surface);
        if (r) {
                return r;
        }
 
        unsigned pitch = pitch_in_bytes_override / bpe;
 
        if (sscreen->info.chip_class >= GFX9) {
                if (pitch) {
-- 
2.17.0

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

Reply via email to