[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