[Mesa-dev] [PATCH 2/4] radeon: Allocate htile buffer for SI in r600_texture.

Alex Deucher alexdeucher at gmail.com
Tue Dec 3 14:59:55 PST 2013


On Tue, Dec 3, 2013 at 3:33 PM, Andreas Hartmetz <ahartmetz at gmail.com> wrote:
> ---
>  src/gallium/drivers/radeon/r600_texture.c | 84 +++++++++++++++++++++++++------
>  1 file changed, 68 insertions(+), 16 deletions(-)
>
> diff --git a/src/gallium/drivers/radeon/r600_texture.c b/src/gallium/drivers/radeon/r600_texture.c
> index 70f21bd..c91fbce 100644
> --- a/src/gallium/drivers/radeon/r600_texture.c
> +++ b/src/gallium/drivers/radeon/r600_texture.c
> @@ -457,12 +457,53 @@ void r600_texture_init_cmask(struct r600_common_screen *rscreen,
>         }
>  }
>
> -static void r600_texture_allocate_htile(struct r600_common_screen *rscreen,
> -                                       struct r600_texture *rtex)
> +static unsigned si_texture_htile_alloc_size(struct r600_common_screen *rscreen,
> +                                           struct r600_texture *rtex)
> +{
> +       unsigned num_pipes = rscreen->tiling_info.num_channels;
> +
> +       unsigned cl_width;
> +       unsigned cl_height;
> +       switch (num_pipes) {
> +       case 2:
> +               cl_width = 32;
> +               cl_height = 32;
> +               break;
> +       case 4:
> +               cl_width = 64;
> +               cl_height = 32;
> +               break;
> +       case 8:
> +               cl_width = 64;
> +               cl_height = 64;
> +               break;
> +       case 16:
> +               cl_width = 128;
> +               cl_height = 64;
> +               break;
> +       default:
> +               assert(0);
> +               return 0;
> +       }
> +
> +       unsigned width = align(rtex->surface.npix_x, cl_width * 8);
> +       unsigned height = align(rtex->surface.npix_y, cl_height * 8);
> +
> +       unsigned slice_elements = (width * height) / (8 * 8);
> +       unsigned slice_bytes = slice_elements * 4;
> +
> +       unsigned pipe_interleave_bytes = rscreen->tiling_info.group_bytes;
> +       unsigned base_align = num_pipes * pipe_interleave_bytes;
> +       unsigned size = rtex->surface.array_size * align(slice_bytes, base_align);
> +

Please don't mix code and declarations.

Alex

> +       return size;
> +}
> +
> +static unsigned r600_texture_htile_alloc_size(struct r600_common_screen *rscreen,
> +                                             struct r600_texture *rtex)
>  {
>         unsigned sw = rtex->surface.level[0].nblk_x * rtex->surface.blk_w;
>         unsigned sh = rtex->surface.level[0].nblk_y * rtex->surface.blk_h;
> -       unsigned htile_size;
>         unsigned npipes = rscreen->info.r600_num_tile_pipes;
>
>         /* XXX also use it for other texture targets */
> @@ -470,24 +511,39 @@ static void r600_texture_allocate_htile(struct r600_common_screen *rscreen,
>             rtex->resource.b.b.target != PIPE_TEXTURE_2D ||
>             rtex->surface.level[0].nblk_x < 32 ||
>             rtex->surface.level[0].nblk_y < 32) {
> -               return;
> +               return 0;
>         }
>
>         /* this alignment and htile size only apply to linear htile buffer */
>         sw = align(sw, 16 << 3);
>         sh = align(sh, npipes << 3);
> -       htile_size = (sw >> 3) * (sh >> 3) * 4;
> +       unsigned htile_size = (sw >> 3) * (sh >> 3) * 4;
>         /* must be aligned with 2K * npipes */
>         htile_size = align(htile_size, (2 << 10) * npipes);
> +       return htile_size;
> +}
> +
> +static void r600_texture_allocate_htile(struct r600_common_screen *rscreen,
> +                                       struct r600_texture *rtex)
> +{
> +       unsigned htile_size;
> +       if (rscreen->chip_class >= SI) {
> +               htile_size = si_texture_htile_alloc_size(rscreen, rtex);
> +       } else {
> +               htile_size = r600_texture_htile_alloc_size(rscreen, rtex);
> +       }
> +
> +       if (!htile_size)
> +               return;
>
>         /* XXX don't allocate it separately */
> -       rtex->htile_buffer = (struct r600_resource*)pipe_buffer_create(&rscreen->b, PIPE_BIND_CUSTOM,
> -                                                                      PIPE_USAGE_STATIC, htile_size);
> +       rtex->htile_buffer = (struct r600_resource*)
> +                            pipe_buffer_create(&rscreen->b, PIPE_BIND_CUSTOM,
> +                                               PIPE_USAGE_STATIC, htile_size);
>         if (rtex->htile_buffer == NULL) {
>                 /* this is not a fatal error as we can still keep rendering
> -                * without htile buffer
> -                */
> -               R600_ERR("r600: failed to create bo for htile buffers\n");
> +                * without htile buffer */
> +               R600_ERR("Failed to create buffer object for htile buffer.\n");
>         } else {
>                 r600_screen_clear_buffer(rscreen, &rtex->htile_buffer->b.b, 0, htile_size, 0);
>         }
> @@ -534,12 +590,8 @@ r600_texture_create_object(struct pipe_screen *screen,
>                 if (!(base->flags & (R600_RESOURCE_FLAG_TRANSFER |
>                                      R600_RESOURCE_FLAG_FLUSHED_DEPTH)) &&
>                     !(rscreen->debug_flags & DBG_NO_HYPERZ)) {
> -                       if (rscreen->chip_class >= SI) {
> -                               /* XXX implement Hyper-Z for SI.
> -                                * Reuse the CMASK allocator, which is almost the same as HTILE. */
> -                       } else {
> -                               r600_texture_allocate_htile(rscreen, rtex);
> -                       }
> +
> +                       r600_texture_allocate_htile(rscreen, rtex);
>                 }
>         } else {
>                 if (base->nr_samples > 1) {
> --
> 1.8.3.2
>
> _______________________________________________
> 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