radeonsi/gfx9: properly handle imported textures with unexpected swizzle mode

Cc: 17.2 <mesa-stable@lists.freedesktop.org>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
(cherry picked from commit fdef2f0fd1)
[Emil Velikov: r600_surface_import_metadata is not separate function,
tile_swizzle isn't in branch]
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>

Conflicts:
	src/gallium/drivers/radeon/r600_texture.c
This commit is contained in:
Marek Olšák 2017-08-17 23:24:00 +02:00 committed by Emil Velikov
parent cf2f05ff91
commit d93e6a0409
2 changed files with 8 additions and 6 deletions

View file

@ -1009,6 +1009,11 @@ static int gfx9_compute_surface(ADDR_HANDLE addrlib,
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,
&AddrSurfInfoIn.swizzleMode);
if (r)

View file

@ -1467,7 +1467,9 @@ static struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen
array_mode = RADEON_SURF_MODE_LINEAR_ALIGNED;
is_scanout = metadata.u.gfx9.swizzle_mode == 0 ||
metadata.u.gfx9.swizzle_mode % 4 == 2;
metadata.u.gfx9.swizzle_mode % 4 == 2;
surface.u.gfx9.surf.swizzle_mode = metadata.u.gfx9.swizzle_mode;
} else {
surface.u.legacy.pipe_config = metadata.u.legacy.pipe_config;
surface.u.legacy.bankw = metadata.u.legacy.bankw;
@ -1502,11 +1504,6 @@ static struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen
if (rscreen->apply_opaque_metadata)
rscreen->apply_opaque_metadata(rscreen, rtex, &metadata);
/* Validate that addrlib arrived at the same surface parameters. */
if (rscreen->chip_class >= GFX9) {
assert(metadata.u.gfx9.swizzle_mode == surface.u.gfx9.surf.swizzle_mode);
}
return &rtex->resource.b.b;
}