radeonsi: factor out metadata import
Plumbing for importing memobj backed textures. Signed-off-by: Andres Rodriguez <andresx7@gmail.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
committed by
Timothy Arceri
parent
7683540029
commit
ddf2c830a6
@@ -342,6 +342,39 @@ static void r600_texture_init_metadata(struct r600_common_screen *rscreen,
|
||||
}
|
||||
}
|
||||
|
||||
static void r600_surface_import_metadata(struct r600_common_screen *rscreen,
|
||||
struct radeon_surf *surf,
|
||||
struct radeon_bo_metadata *metadata,
|
||||
enum radeon_surf_mode *array_mode,
|
||||
bool *is_scanout)
|
||||
{
|
||||
if (rscreen->chip_class >= GFX9) {
|
||||
if (metadata->u.gfx9.swizzle_mode > 0)
|
||||
*array_mode = RADEON_SURF_MODE_2D;
|
||||
else
|
||||
*array_mode = RADEON_SURF_MODE_LINEAR_ALIGNED;
|
||||
|
||||
*is_scanout = metadata->u.gfx9.swizzle_mode == 0 ||
|
||||
metadata->u.gfx9.swizzle_mode % 4 == 2;
|
||||
} else {
|
||||
surf->u.legacy.pipe_config = metadata->u.legacy.pipe_config;
|
||||
surf->u.legacy.bankw = metadata->u.legacy.bankw;
|
||||
surf->u.legacy.bankh = metadata->u.legacy.bankh;
|
||||
surf->u.legacy.tile_split = metadata->u.legacy.tile_split;
|
||||
surf->u.legacy.mtilea = metadata->u.legacy.mtilea;
|
||||
surf->u.legacy.num_banks = metadata->u.legacy.num_banks;
|
||||
|
||||
if (metadata->u.legacy.macrotile == RADEON_LAYOUT_TILED)
|
||||
*array_mode = RADEON_SURF_MODE_2D;
|
||||
else if (metadata->u.legacy.microtile == RADEON_LAYOUT_TILED)
|
||||
*array_mode = RADEON_SURF_MODE_1D;
|
||||
else
|
||||
*array_mode = RADEON_SURF_MODE_LINEAR_ALIGNED;
|
||||
|
||||
*is_scanout = metadata->u.legacy.scanout;
|
||||
}
|
||||
}
|
||||
|
||||
static void r600_eliminate_fast_color_clear(struct r600_common_context *rctx,
|
||||
struct r600_texture *rtex)
|
||||
{
|
||||
@@ -1447,7 +1480,7 @@ static struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen
|
||||
struct r600_common_screen *rscreen = (struct r600_common_screen*)screen;
|
||||
struct pb_buffer *buf = NULL;
|
||||
unsigned stride = 0, offset = 0;
|
||||
unsigned array_mode;
|
||||
enum radeon_surf_mode array_mode;
|
||||
struct radeon_surf surface = {};
|
||||
int r;
|
||||
struct radeon_bo_metadata metadata = {};
|
||||
@@ -1464,32 +1497,8 @@ static struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen
|
||||
return NULL;
|
||||
|
||||
rscreen->ws->buffer_get_metadata(buf, &metadata);
|
||||
|
||||
if (rscreen->chip_class >= GFX9) {
|
||||
if (metadata.u.gfx9.swizzle_mode > 0)
|
||||
array_mode = RADEON_SURF_MODE_2D;
|
||||
else
|
||||
array_mode = RADEON_SURF_MODE_LINEAR_ALIGNED;
|
||||
|
||||
is_scanout = metadata.u.gfx9.swizzle_mode == 0 ||
|
||||
metadata.u.gfx9.swizzle_mode % 4 == 2;
|
||||
} else {
|
||||
surface.u.legacy.pipe_config = metadata.u.legacy.pipe_config;
|
||||
surface.u.legacy.bankw = metadata.u.legacy.bankw;
|
||||
surface.u.legacy.bankh = metadata.u.legacy.bankh;
|
||||
surface.u.legacy.tile_split = metadata.u.legacy.tile_split;
|
||||
surface.u.legacy.mtilea = metadata.u.legacy.mtilea;
|
||||
surface.u.legacy.num_banks = metadata.u.legacy.num_banks;
|
||||
|
||||
if (metadata.u.legacy.macrotile == RADEON_LAYOUT_TILED)
|
||||
array_mode = RADEON_SURF_MODE_2D;
|
||||
else if (metadata.u.legacy.microtile == RADEON_LAYOUT_TILED)
|
||||
array_mode = RADEON_SURF_MODE_1D;
|
||||
else
|
||||
array_mode = RADEON_SURF_MODE_LINEAR_ALIGNED;
|
||||
|
||||
is_scanout = metadata.u.legacy.scanout;
|
||||
}
|
||||
r600_surface_import_metadata(rscreen, &surface, &metadata,
|
||||
&array_mode, &is_scanout);
|
||||
|
||||
r = r600_init_surface(rscreen, &surface, templ, array_mode, stride,
|
||||
offset, true, is_scanout, false, false);
|
||||
|
||||
Reference in New Issue
Block a user