[Mesa-dev] [PATCH 1/3] radv: refactor depth/stencil state setup
Bas Nieuwenhuizen
bas at basnieuwenhuizen.nl
Mon Jun 5 21:28:20 UTC 2017
Series is
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
On Mon, Jun 5, 2017 at 3:12 AM, Dave Airlie <airlied at gmail.com> wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> In advance of GFX9 to reduce chances for regression, refactor
> this code out so adding the GFX9 changes will be more obvious.
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
> src/amd/vulkan/radv_device.c | 119 ++++++++++++++++++++++---------------------
> 1 file changed, 62 insertions(+), 57 deletions(-)
>
> diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
> index bf94c3c..d16228d 100644
> --- a/src/amd/vulkan/radv_device.c
> +++ b/src/amd/vulkan/radv_device.c
> @@ -2938,9 +2938,8 @@ radv_initialise_ds_surface(struct radv_device *device,
> struct radv_image_view *iview)
> {
> unsigned level = iview->base_mip;
> - unsigned format;
> + unsigned format, stencil_format;
> uint64_t va, s_offs, z_offs;
> - const struct legacy_surf_level *level_info = &iview->image->surface.u.legacy.level[level];
> bool stencil_only = false;
> memset(ds, 0, sizeof(*ds));
> switch (iview->vk_format) {
> @@ -2962,83 +2961,89 @@ radv_initialise_ds_surface(struct radv_device *device,
> break;
> case VK_FORMAT_S8_UINT:
> stencil_only = true;
> - level_info = &iview->image->surface.u.legacy.stencil_level[level];
> break;
> default:
> break;
> }
>
> format = radv_translate_dbformat(iview->vk_format);
> -
> - va = device->ws->buffer_get_va(iview->bo) + iview->image->offset;
> - s_offs = z_offs = va;
> - z_offs += iview->image->surface.u.legacy.level[level].offset;
> - s_offs += iview->image->surface.u.legacy.stencil_level[level].offset;
> + stencil_format = iview->image->surface.flags & RADEON_SURF_SBUFFER ?
> + V_028044_STENCIL_8 : V_028044_STENCIL_INVALID;
>
> uint32_t max_slice = radv_surface_layer_count(iview);
> ds->db_depth_view = S_028008_SLICE_START(iview->base_layer) |
> S_028008_SLICE_MAX(iview->base_layer + max_slice - 1);
> - ds->db_depth_info = S_02803C_ADDR5_SWIZZLE_MASK(1);
> - ds->db_z_info = S_028040_FORMAT(format) | S_028040_ZRANGE_PRECISION(1);
>
> - if (iview->image->info.samples > 1)
> - ds->db_z_info |= S_028040_NUM_SAMPLES(util_logbase2(iview->image->info.samples));
> + ds->db_htile_data_base = 0;
> + ds->db_htile_surface = 0;
>
> - if (iview->image->surface.flags & RADEON_SURF_SBUFFER)
> - ds->db_stencil_info = S_028044_FORMAT(V_028044_STENCIL_8);
> - else
> - ds->db_stencil_info = S_028044_FORMAT(V_028044_STENCIL_INVALID);
> + va = device->ws->buffer_get_va(iview->bo) + iview->image->offset;
> + s_offs = z_offs = va;
>
> - if (device->physical_device->rad_info.chip_class >= CIK) {
> - struct radeon_info *info = &device->physical_device->rad_info;
> - unsigned tiling_index = iview->image->surface.u.legacy.tiling_index[level];
> - unsigned stencil_index = iview->image->surface.u.legacy.stencil_tiling_index[level];
> - unsigned macro_index = iview->image->surface.u.legacy.macro_tile_index;
> - unsigned tile_mode = info->si_tile_mode_array[tiling_index];
> - unsigned stencil_tile_mode = info->si_tile_mode_array[stencil_index];
> - unsigned macro_mode = info->cik_macrotile_mode_array[macro_index];
> + {
> + const struct legacy_surf_level *level_info = &iview->image->surface.u.legacy.level[level];
>
> if (stencil_only)
> - tile_mode = stencil_tile_mode;
> -
> - ds->db_depth_info |=
> - S_02803C_ARRAY_MODE(G_009910_ARRAY_MODE(tile_mode)) |
> - S_02803C_PIPE_CONFIG(G_009910_PIPE_CONFIG(tile_mode)) |
> - S_02803C_BANK_WIDTH(G_009990_BANK_WIDTH(macro_mode)) |
> - S_02803C_BANK_HEIGHT(G_009990_BANK_HEIGHT(macro_mode)) |
> - S_02803C_MACRO_TILE_ASPECT(G_009990_MACRO_TILE_ASPECT(macro_mode)) |
> - S_02803C_NUM_BANKS(G_009990_NUM_BANKS(macro_mode));
> - ds->db_z_info |= S_028040_TILE_SPLIT(G_009910_TILE_SPLIT(tile_mode));
> - ds->db_stencil_info |= S_028044_TILE_SPLIT(G_009910_TILE_SPLIT(stencil_tile_mode));
> - } else {
> - unsigned tile_mode_index = si_tile_mode_index(iview->image, level, false);
> - ds->db_z_info |= S_028040_TILE_MODE_INDEX(tile_mode_index);
> - tile_mode_index = si_tile_mode_index(iview->image, level, true);
> - ds->db_stencil_info |= S_028044_TILE_MODE_INDEX(tile_mode_index);
> - }
> + level_info = &iview->image->surface.u.legacy.stencil_level[level];
> +
> + z_offs += iview->image->surface.u.legacy.level[level].offset;
> + s_offs += iview->image->surface.u.legacy.stencil_level[level].offset;
> +
> + ds->db_depth_info = S_02803C_ADDR5_SWIZZLE_MASK(1);
> + ds->db_z_info = S_028040_FORMAT(format) | S_028040_ZRANGE_PRECISION(1);
> + ds->db_stencil_info = S_028044_FORMAT(stencil_format);
> +
> + if (iview->image->info.samples > 1)
> + ds->db_z_info |= S_028040_NUM_SAMPLES(util_logbase2(iview->image->info.samples));
> +
> + if (device->physical_device->rad_info.chip_class >= CIK) {
> + struct radeon_info *info = &device->physical_device->rad_info;
> + unsigned tiling_index = iview->image->surface.u.legacy.tiling_index[level];
> + unsigned stencil_index = iview->image->surface.u.legacy.stencil_tiling_index[level];
> + unsigned macro_index = iview->image->surface.u.legacy.macro_tile_index;
> + unsigned tile_mode = info->si_tile_mode_array[tiling_index];
> + unsigned stencil_tile_mode = info->si_tile_mode_array[stencil_index];
> + unsigned macro_mode = info->cik_macrotile_mode_array[macro_index];
> +
> + if (stencil_only)
> + tile_mode = stencil_tile_mode;
> +
> + ds->db_depth_info |=
> + S_02803C_ARRAY_MODE(G_009910_ARRAY_MODE(tile_mode)) |
> + S_02803C_PIPE_CONFIG(G_009910_PIPE_CONFIG(tile_mode)) |
> + S_02803C_BANK_WIDTH(G_009990_BANK_WIDTH(macro_mode)) |
> + S_02803C_BANK_HEIGHT(G_009990_BANK_HEIGHT(macro_mode)) |
> + S_02803C_MACRO_TILE_ASPECT(G_009990_MACRO_TILE_ASPECT(macro_mode)) |
> + S_02803C_NUM_BANKS(G_009990_NUM_BANKS(macro_mode));
> + ds->db_z_info |= S_028040_TILE_SPLIT(G_009910_TILE_SPLIT(tile_mode));
> + ds->db_stencil_info |= S_028044_TILE_SPLIT(G_009910_TILE_SPLIT(stencil_tile_mode));
> + } else {
> + unsigned tile_mode_index = si_tile_mode_index(iview->image, level, false);
> + ds->db_z_info |= S_028040_TILE_MODE_INDEX(tile_mode_index);
> + tile_mode_index = si_tile_mode_index(iview->image, level, true);
> + ds->db_stencil_info |= S_028044_TILE_MODE_INDEX(tile_mode_index);
> + }
>
> - if (iview->image->surface.htile_size && !level) {
> - ds->db_z_info |= S_028040_TILE_SURFACE_ENABLE(1);
> + ds->db_depth_size = S_028058_PITCH_TILE_MAX((level_info->nblk_x / 8) - 1) |
> + S_028058_HEIGHT_TILE_MAX((level_info->nblk_y / 8) - 1);
> + ds->db_depth_slice = S_02805C_SLICE_TILE_MAX((level_info->nblk_x * level_info->nblk_y) / 64 - 1);
>
> - if (!(iview->image->surface.flags & RADEON_SURF_SBUFFER))
> - /* Use all of the htile_buffer for depth if there's no stencil. */
> - ds->db_stencil_info |= S_028044_TILE_STENCIL_DISABLE(1);
> + if (iview->image->surface.htile_size && !level) {
> + ds->db_z_info |= S_028040_TILE_SURFACE_ENABLE(1);
>
> - va = device->ws->buffer_get_va(iview->bo) + iview->image->offset +
> - iview->image->htile_offset;
> - ds->db_htile_data_base = va >> 8;
> - ds->db_htile_surface = S_028ABC_FULL_CACHE(1);
> - } else {
> - ds->db_htile_data_base = 0;
> - ds->db_htile_surface = 0;
> + if (!(iview->image->surface.flags & RADEON_SURF_SBUFFER))
> + /* Use all of the htile_buffer for depth if there's no stencil. */
> + ds->db_stencil_info |= S_028044_TILE_STENCIL_DISABLE(1);
> +
> + va = device->ws->buffer_get_va(iview->bo) + iview->image->offset +
> + iview->image->htile_offset;
> + ds->db_htile_data_base = va >> 8;
> + ds->db_htile_surface = S_028ABC_FULL_CACHE(1);
> + }
> }
>
> ds->db_z_read_base = ds->db_z_write_base = z_offs >> 8;
> ds->db_stencil_read_base = ds->db_stencil_write_base = s_offs >> 8;
> -
> - ds->db_depth_size = S_028058_PITCH_TILE_MAX((level_info->nblk_x / 8) - 1) |
> - S_028058_HEIGHT_TILE_MAX((level_info->nblk_y / 8) - 1);
> - ds->db_depth_slice = S_02805C_SLICE_TILE_MAX((level_info->nblk_x * level_info->nblk_y) / 64 - 1);
> }
>
> VkResult radv_CreateFramebuffer(
> --
> 2.9.3
>
> _______________________________________________
> 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