[Mesa-dev] [PATCH 9/9] gallium/radeon: support PIPE_CAP_SURFACE_REINTERPRET_BLOCKS
Marek Olšák
maraeo at gmail.com
Thu Jan 21 04:03:14 PST 2016
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
FYI, si_resource_copy_region does the reinterpretation for copying.
Marek
On Mon, Jan 18, 2016 at 11:22 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> This is already used internally in the transfer_map implementation for
> compressed textures, so the only real change here is the adjusted surface
> size computation.
> ---
> src/gallium/drivers/r600/r600_pipe.c | 2 +-
> src/gallium/drivers/radeon/r600_texture.c | 26 +++++++++++++++++++++++---
> src/gallium/drivers/radeonsi/si_pipe.c | 2 +-
> 3 files changed, 25 insertions(+), 5 deletions(-)
>
> diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
> index 17140bb..f519916 100644
> --- a/src/gallium/drivers/r600/r600_pipe.c
> +++ b/src/gallium/drivers/r600/r600_pipe.c
> @@ -279,6 +279,7 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
> case PIPE_CAP_TGSI_TXQS:
> case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS:
> case PIPE_CAP_INVALIDATE_BUFFER:
> + case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
> return 1;
>
> case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
> @@ -360,7 +361,6 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
> case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:
> case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
> case PIPE_CAP_GENERATE_MIPMAP:
> - case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
> return 0;
>
> case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
> diff --git a/src/gallium/drivers/radeon/r600_texture.c b/src/gallium/drivers/radeon/r600_texture.c
> index 7c4717d..aec7e32 100644
> --- a/src/gallium/drivers/radeon/r600_texture.c
> +++ b/src/gallium/drivers/radeon/r600_texture.c
> @@ -1212,10 +1212,30 @@ static struct pipe_surface *r600_create_surface(struct pipe_context *pipe,
> const struct pipe_surface *templ)
> {
> unsigned level = templ->u.tex.level;
> + unsigned width = u_minify(tex->width0, level);
> + unsigned height = u_minify(tex->height0, level);
> +
> + if (templ->format != tex->format) {
> + const struct util_format_description *tex_desc
> + = util_format_description(tex->format);
> + const struct util_format_description *templ_desc
> + = util_format_description(templ->format);
> +
> + assert(tex_desc->block.bits == templ_desc->block.bits);
> +
> + /* Adjust size of surface if and only if the block width or
> + * height is changed. */
> + if (tex_desc->block.width != templ_desc->block.width ||
> + tex_desc->block.height != templ_desc->block.height) {
> + unsigned nblks_x = util_format_get_nblocksx(tex->format, width);
> + unsigned nblks_y = util_format_get_nblocksy(tex->format, height);
> +
> + width = nblks_x * templ_desc->block.width;
> + height = nblks_y * templ_desc->block.height;
> + }
> + }
>
> - return r600_create_surface_custom(pipe, tex, templ,
> - u_minify(tex->width0, level),
> - u_minify(tex->height0, level));
> + return r600_create_surface_custom(pipe, tex, templ, width, height);
> }
>
> static void r600_surface_destroy(struct pipe_context *pipe,
> diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
> index 04e9d60..c50c707 100644
> --- a/src/gallium/drivers/radeonsi/si_pipe.c
> +++ b/src/gallium/drivers/radeonsi/si_pipe.c
> @@ -304,6 +304,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
> case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL:
> case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:
> case PIPE_CAP_INVALIDATE_BUFFER:
> + case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
> return 1;
>
> case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
> @@ -352,7 +353,6 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
> case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS:
> case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
> case PIPE_CAP_GENERATE_MIPMAP:
> - case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
> return 0;
>
> case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
> --
> 2.5.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list