[PATCH 3/2] etnaviv: Don't over-pad compressed textures

Christian Gmeiner christian.gmeiner at gmail.com
Mon Nov 6 20:22:45 UTC 2017


2017-11-02 16:08 GMT+01:00 Wladimir J. van der Laan <laanwj at gmail.com>:
> HALIGN_FOUR/SIXTEEN has no meaning for compressed textures, and we can't
> render to them anyway. So use the tightest possible packing. This
> avoids bugs with non-power-of-two block sizes.
>
> Signed-off-by: Wladimir J. van der Laan <laanwj at gmail.com>

Reviewed-by: Christian Gmeiner <christian.gmeiner at gmail.com>

> ---
>  src/gallium/drivers/etnaviv/etnaviv_resource.c | 24 +++++++++++++++---------
>  1 file changed, 15 insertions(+), 9 deletions(-)
>
> This is important in the case of ASTC. Padding ASTC to width 4 or 16
> produces intermittent magenta blocks when using texture widths
> not a multiple of those.
>
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_resource.c b/src/gallium/drivers/etnaviv/etnaviv_resource.c
> index d6cccd2..0a82807 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_resource.c
> +++ b/src/gallium/drivers/etnaviv/etnaviv_resource.c
> @@ -209,18 +209,24 @@ etna_resource_alloc(struct pipe_screen *pscreen, unsigned layout,
>        return NULL;
>     }
>
> -   /* If we have the TEXTURE_HALIGN feature, we can always align to the
> -    * resolve engine's width.  If not, we must not align resources used
> -    * only for textures. */
> -   bool rs_align = VIV_FEATURE(screen, chipMinorFeatures1, TEXTURE_HALIGN) ||
> -                   !etna_resource_sampler_only(templat);
> -
>     /* Determine needed padding (alignment of height/width) */
>     unsigned paddingX = 0, paddingY = 0;
>     unsigned halign = TEXTURE_HALIGN_FOUR;
> -   etna_layout_multiple(layout, screen->specs.pixel_pipes, rs_align, &paddingX,
> -                        &paddingY, &halign);
> -   assert(paddingX && paddingY);
> +   if (!util_format_is_compressed(templat->format)) {
> +      /* If we have the TEXTURE_HALIGN feature, we can always align to the
> +       * resolve engine's width.  If not, we must not align resources used
> +       * only for textures. */
> +      bool rs_align = VIV_FEATURE(screen, chipMinorFeatures1, TEXTURE_HALIGN) ||
> +                      !etna_resource_sampler_only(templat);
> +      etna_layout_multiple(layout, screen->specs.pixel_pipes, rs_align, &paddingX,
> +                           &paddingY, &halign);
> +      assert(paddingX && paddingY);
> +   } else {
> +      /* Compressed textures are padded to their block size, but we don't have
> +       * to do anything special for that. */
> +      paddingX = 1;
> +      paddingY = 1;
> +   }
>
>     if (templat->target != PIPE_BUFFER)
>        etna_adjust_rs_align(screen->specs.pixel_pipes, NULL, &paddingY);
> --
> 2.7.4
>
>



-- 
greets
--
Christian Gmeiner, MSc

https://christian-gmeiner.info


More information about the etnaviv mailing list