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>
This commit is contained in:
parent
113278ee79
commit
fdef2f0fd1
|
@ -1044,6 +1044,11 @@ static int gfx9_compute_surface(ADDR_HANDLE addrlib,
|
||||||
|
|
||||||
case RADEON_SURF_MODE_1D:
|
case RADEON_SURF_MODE_1D:
|
||||||
case RADEON_SURF_MODE_2D:
|
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,
|
||||||
&AddrSurfInfoIn.swizzleMode);
|
&AddrSurfInfoIn.swizzleMode);
|
||||||
if (r)
|
if (r)
|
||||||
|
|
|
@ -356,7 +356,9 @@ static void r600_surface_import_metadata(struct r600_common_screen *rscreen,
|
||||||
*array_mode = RADEON_SURF_MODE_LINEAR_ALIGNED;
|
*array_mode = RADEON_SURF_MODE_LINEAR_ALIGNED;
|
||||||
|
|
||||||
*is_scanout = metadata->u.gfx9.swizzle_mode == 0 ||
|
*is_scanout = metadata->u.gfx9.swizzle_mode == 0 ||
|
||||||
metadata->u.gfx9.swizzle_mode % 4 == 2;
|
metadata->u.gfx9.swizzle_mode % 4 == 2;
|
||||||
|
|
||||||
|
surf->u.gfx9.surf.swizzle_mode = metadata->u.gfx9.swizzle_mode;
|
||||||
} else {
|
} else {
|
||||||
surf->u.legacy.pipe_config = metadata->u.legacy.pipe_config;
|
surf->u.legacy.pipe_config = metadata->u.legacy.pipe_config;
|
||||||
surf->u.legacy.bankw = metadata->u.legacy.bankw;
|
surf->u.legacy.bankw = metadata->u.legacy.bankw;
|
||||||
|
@ -1521,11 +1523,6 @@ static struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen
|
||||||
if (rscreen->apply_opaque_metadata)
|
if (rscreen->apply_opaque_metadata)
|
||||||
rscreen->apply_opaque_metadata(rscreen, rtex, &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);
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(rtex->surface.tile_swizzle == 0);
|
assert(rtex->surface.tile_swizzle == 0);
|
||||||
return &rtex->resource.b.b;
|
return &rtex->resource.b.b;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue