[Mesa-dev] [PATCH] radv: split metadata struct into legacy/gfx9 parts.
Bas Nieuwenhuizen
bas at basnieuwenhuizen.nl
Mon Jun 5 21:22:17 UTC 2017
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
On Mon, Jun 5, 2017 at 2:47 AM, Dave Airlie <airlied at gmail.com> wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> This is just ported from radeonsi.
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
> src/amd/vulkan/radv_image.c | 28 ++++++++++--------
> src/amd/vulkan/radv_radeon_winsys.h | 29 +++++++++++-------
> src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c | 42 +++++++++++++++------------
> 3 files changed, 58 insertions(+), 41 deletions(-)
>
> diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c
> index 2065545..ababf3a 100644
> --- a/src/amd/vulkan/radv_image.c
> +++ b/src/amd/vulkan/radv_image.c
> @@ -435,19 +435,23 @@ radv_init_metadata(struct radv_device *device,
> struct radeon_surf *surface = &image->surface;
>
> memset(metadata, 0, sizeof(*metadata));
> - metadata->microtile = surface->u.legacy.level[0].mode >= RADEON_SURF_MODE_1D ?
> - RADEON_LAYOUT_TILED : RADEON_LAYOUT_LINEAR;
> - metadata->macrotile = surface->u.legacy.level[0].mode >= RADEON_SURF_MODE_2D ?
> - RADEON_LAYOUT_TILED : RADEON_LAYOUT_LINEAR;
> - metadata->pipe_config = surface->u.legacy.pipe_config;
> - metadata->bankw = surface->u.legacy.bankw;
> - metadata->bankh = surface->u.legacy.bankh;
> - metadata->tile_split = surface->u.legacy.tile_split;
> - metadata->mtilea = surface->u.legacy.mtilea;
> - metadata->num_banks = surface->u.legacy.num_banks;
> - metadata->stride = surface->u.legacy.level[0].nblk_x * surface->bpe;
> - metadata->scanout = (surface->flags & RADEON_SURF_SCANOUT) != 0;
>
> + if (device->physical_device->rad_info.chip_class >= GFX9) {
> + metadata->u.gfx9.swizzle_mode = surface->u.gfx9.surf.swizzle_mode;
> + } else {
> + metadata->u.legacy.microtile = surface->u.legacy.level[0].mode >= RADEON_SURF_MODE_1D ?
> + RADEON_LAYOUT_TILED : RADEON_LAYOUT_LINEAR;
> + metadata->u.legacy.macrotile = surface->u.legacy.level[0].mode >= RADEON_SURF_MODE_2D ?
> + RADEON_LAYOUT_TILED : RADEON_LAYOUT_LINEAR;
> + metadata->u.legacy.pipe_config = surface->u.legacy.pipe_config;
> + 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;
> + }
> radv_query_opaque_metadata(device, image, metadata);
> }
>
> diff --git a/src/amd/vulkan/radv_radeon_winsys.h b/src/amd/vulkan/radv_radeon_winsys.h
> index 397f28e..cdcaeca 100644
> --- a/src/amd/vulkan/radv_radeon_winsys.h
> +++ b/src/amd/vulkan/radv_radeon_winsys.h
> @@ -103,16 +103,25 @@ struct radeon_bo_metadata {
> /* Tiling flags describing the texture layout for display code
> * and DRI sharing.
> */
> - enum radeon_bo_layout microtile;
> - enum radeon_bo_layout macrotile;
> - unsigned pipe_config;
> - unsigned bankw;
> - unsigned bankh;
> - unsigned tile_split;
> - unsigned mtilea;
> - unsigned num_banks;
> - unsigned stride;
> - bool scanout;
> + union {
> + struct {
> + enum radeon_bo_layout microtile;
> + enum radeon_bo_layout macrotile;
> + unsigned pipe_config;
> + unsigned bankw;
> + unsigned bankh;
> + unsigned tile_split;
> + unsigned mtilea;
> + unsigned num_banks;
> + unsigned stride;
> + bool scanout;
> + } legacy;
> +
> + struct {
> + /* surface flags */
> + unsigned swizzle_mode:5;
> + } gfx9;
> + } u;
>
> /* Additional metadata associated with the buffer, in bytes.
> * The maximum size is 64 * 4. This is opaque for the winsys & kernel.
> diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c
> index 7b67945..5c374a2 100644
> --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c
> +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c
> @@ -467,25 +467,29 @@ radv_amdgpu_winsys_bo_set_metadata(struct radeon_winsys_bo *_bo,
> struct amdgpu_bo_metadata metadata = {0};
> uint32_t tiling_flags = 0;
>
> - if (md->macrotile == RADEON_LAYOUT_TILED)
> - tiling_flags |= AMDGPU_TILING_SET(ARRAY_MODE, 4); /* 2D_TILED_THIN1 */
> - else if (md->microtile == RADEON_LAYOUT_TILED)
> - tiling_flags |= AMDGPU_TILING_SET(ARRAY_MODE, 2); /* 1D_TILED_THIN1 */
> - else
> - tiling_flags |= AMDGPU_TILING_SET(ARRAY_MODE, 1); /* LINEAR_ALIGNED */
> -
> - tiling_flags |= AMDGPU_TILING_SET(PIPE_CONFIG, md->pipe_config);
> - tiling_flags |= AMDGPU_TILING_SET(BANK_WIDTH, util_logbase2(md->bankw));
> - tiling_flags |= AMDGPU_TILING_SET(BANK_HEIGHT, util_logbase2(md->bankh));
> - if (md->tile_split)
> - tiling_flags |= AMDGPU_TILING_SET(TILE_SPLIT, radv_eg_tile_split_rev(md->tile_split));
> - tiling_flags |= AMDGPU_TILING_SET(MACRO_TILE_ASPECT, util_logbase2(md->mtilea));
> - tiling_flags |= AMDGPU_TILING_SET(NUM_BANKS, util_logbase2(md->num_banks)-1);
> -
> - if (md->scanout)
> - tiling_flags |= AMDGPU_TILING_SET(MICRO_TILE_MODE, 0); /* DISPLAY_MICRO_TILING */
> - else
> - tiling_flags |= AMDGPU_TILING_SET(MICRO_TILE_MODE, 1); /* THIN_MICRO_TILING */
> + if (bo->ws->info.chip_class >= GFX9) {
> + tiling_flags |= AMDGPU_TILING_SET(SWIZZLE_MODE, md->u.gfx9.swizzle_mode);
> + } else {
> + if (md->u.legacy.macrotile == RADEON_LAYOUT_TILED)
> + tiling_flags |= AMDGPU_TILING_SET(ARRAY_MODE, 4); /* 2D_TILED_THIN1 */
> + else if (md->u.legacy.microtile == RADEON_LAYOUT_TILED)
> + tiling_flags |= AMDGPU_TILING_SET(ARRAY_MODE, 2); /* 1D_TILED_THIN1 */
> + else
> + tiling_flags |= AMDGPU_TILING_SET(ARRAY_MODE, 1); /* LINEAR_ALIGNED */
> +
> + tiling_flags |= AMDGPU_TILING_SET(PIPE_CONFIG, md->u.legacy.pipe_config);
> + tiling_flags |= AMDGPU_TILING_SET(BANK_WIDTH, util_logbase2(md->u.legacy.bankw));
> + tiling_flags |= AMDGPU_TILING_SET(BANK_HEIGHT, util_logbase2(md->u.legacy.bankh));
> + if (md->u.legacy.tile_split)
> + tiling_flags |= AMDGPU_TILING_SET(TILE_SPLIT, radv_eg_tile_split_rev(md->u.legacy.tile_split));
> + tiling_flags |= AMDGPU_TILING_SET(MACRO_TILE_ASPECT, util_logbase2(md->u.legacy.mtilea));
> + tiling_flags |= AMDGPU_TILING_SET(NUM_BANKS, util_logbase2(md->u.legacy.num_banks)-1);
> +
> + if (md->u.legacy.scanout)
> + tiling_flags |= AMDGPU_TILING_SET(MICRO_TILE_MODE, 0); /* DISPLAY_MICRO_TILING */
> + else
> + tiling_flags |= AMDGPU_TILING_SET(MICRO_TILE_MODE, 1); /* THIN_MICRO_TILING */
> + }
>
> metadata.tiling_info = tiling_flags;
> metadata.size_metadata = md->size_metadata;
> --
> 2.9.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list