radeonsi: refuse to import texture with family_overriden being set

If the gfx version is overriden by the exporter process, the surface
layout might not be compatible with the importer process (which uses
the real gfx version).

So fail early, except if the layout is LINEAR (because it should work
on all gen) or a modifier is used (which should be rejected elsewhere
if not supported).

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31841>
This commit is contained in:
Pierre-Eric Pelloux-Prayer
2024-10-16 10:54:32 +02:00
committed by Marge Bot
parent 9d0aba1f97
commit 2ff67083e5
+16
View File
@@ -1691,6 +1691,7 @@ static struct pipe_resource *si_texture_from_winsys_buffer(struct si_screen *ssc
{
struct radeon_surf surface = {};
struct radeon_bo_metadata metadata = {};
uint32_t md_version, md_flags;
struct si_texture *tex;
int r;
@@ -1700,6 +1701,21 @@ static struct pipe_resource *si_texture_from_winsys_buffer(struct si_screen *ssc
if (dedicated) {
sscreen->ws->buffer_get_metadata(sscreen->ws, buf, &metadata, &surface);
/* Refuse to import texture allocated with a overriden gfx family since
* the data will be garbage.
*/
md_version = metadata.metadata[0] & 0xffff;
md_flags = metadata.metadata[0] >> 16;
if (metadata.mode != RADEON_SURF_MODE_LINEAR_ALIGNED &&
modifier == DRM_FORMAT_MOD_INVALID &&
md_version >= 3 &&
md_flags & (1u << AC_SURF_METADATA_FLAG_FAMILY_OVERRIDEN_BIT)) {
fprintf(stderr, "si_texture_from_winsys_buffer: fail texture import due to "
"AC_SURF_METADATA_FLAG_FAMILY_OVERRIDEN_BIT being set.\n");
return NULL;
}
} else {
/**
* The bo metadata is unset for un-dedicated images. So we fall