[Mesa-dev] [PATCH 10/24] radeonsi: factor out metadata import
From: Andres RodriguezPlumbing for importing memobj backed textures. Signed-off-by: Andres Rodriguez Reviewed-by: Marek Olšák --- src/gallium/drivers/radeon/r600_texture.c | 63 ++- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/src/gallium/drivers/radeon/r600_texture.c b/src/gallium/drivers/radeon/r600_texture.c index 3aac3c78a9..ca2b37b21a 100644 --- a/src/gallium/drivers/radeon/r600_texture.c +++ b/src/gallium/drivers/radeon/r600_texture.c @@ -333,20 +333,53 @@ static void r600_texture_init_metadata(struct r600_common_screen *rscreen, metadata->u.legacy.bankw = surface->u.legacy.bankw; metadata->u.legacy.bankh = surface->u.legacy.bankh; metadata->u.legacy.tile_split = surface->u.legacy.tile_split; metadata->u.legacy.mtilea = surface->u.legacy.mtilea; metadata->u.legacy.num_banks = surface->u.legacy.num_banks; metadata->u.legacy.stride = surface->u.legacy.level[0].nblk_x * surface->bpe; metadata->u.legacy.scanout = (surface->flags & RADEON_SURF_SCANOUT) != 0; } } +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) { struct r600_common_screen *rscreen = rctx->screen; struct pipe_context *ctx = >b; if (ctx == rscreen->aux_context) mtx_lock(>aux_context_lock); ctx->flush_resource(ctx, >resource.b.b); @@ -1435,63 +1468,39 @@ struct pipe_resource *r600_texture_create(struct pipe_screen *screen, } static struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen, const struct pipe_resource *templ, struct winsys_handle *whandle, unsigned usage) { 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 = {}; struct r600_texture *rtex; bool is_scanout; /* Support only 2D textures without mipmaps */ if ((templ->target != PIPE_TEXTURE_2D && templ->target != PIPE_TEXTURE_RECT) || templ->depth0 != 1 || templ->last_level != 0) return NULL; buf = rscreen->ws->buffer_from_handle(rscreen->ws, whandle, , ); if (!buf) return NULL; rscreen->ws->buffer_get_metadata(buf, ); - - 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 =
[Mesa-dev] [PATCH 10/24] radeonsi: factor out metadata import
From: Andres RodriguezPlumbing for importing memobj backed textures. Signed-off-by: Andres Rodriguez Reviewed-by: Marek Olšák --- src/gallium/drivers/radeon/r600_texture.c | 63 ++- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/src/gallium/drivers/radeon/r600_texture.c b/src/gallium/drivers/radeon/r600_texture.c index 3aac3c7..ca2b37b 100644 --- a/src/gallium/drivers/radeon/r600_texture.c +++ b/src/gallium/drivers/radeon/r600_texture.c @@ -340,6 +340,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) { @@ -1442,7 +1475,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 = {}; @@ -1459,32 +1492,8 @@ static struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen return NULL; rscreen->ws->buffer_get_metadata(buf, ); - - 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, , , +_mode, _scanout); r = r600_init_surface(rscreen, , templ, array_mode, stride, offset, true, is_scanout, false, false); -- 2.9.4 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev