From fc2298ea311f697dff310c5ddc65ea99e86d83fe Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Sat, 13 Aug 2022 00:32:02 +0200 Subject: [PATCH] etnaviv: texture-desc: sample 1D textures using 2D mode Mipmapping is not working correctly when sampling a 1D texture, likely due to a bad derivative being used by the hardware for the unused dimension. To work around this, do the same trick as already used in texture-state by upgrading 1D textures to 2D samplers with VWARP mode set to repeat. Fixes piglit spec@glsl-1.20@execution@tex-miplevel-selection 1d Signed-off-by: Lucas Stach Reviewed-by: Christian Gmeiner Part-of: --- .../drivers/etnaviv/etnaviv_texture_desc.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/etnaviv/etnaviv_texture_desc.c b/src/gallium/drivers/etnaviv/etnaviv_texture_desc.c index 8e2a7632afb..c6dada89ac3 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_texture_desc.c +++ b/src/gallium/drivers/etnaviv/etnaviv_texture_desc.c @@ -60,6 +60,7 @@ struct etna_sampler_view_desc { struct pipe_sampler_view base; /* format-dependent merged with sampler state */ uint32_t SAMP_CTRL0; + uint32_t SAMP_CTRL0_MASK; uint32_t SAMP_CTRL1; struct pipe_resource *res; @@ -149,6 +150,7 @@ etna_create_sampler_view_desc(struct pipe_context *pctx, struct pipe_resource *p sv->base.texture = NULL; pipe_resource_reference(&sv->base.texture, prsc); sv->base.context = pctx; + sv->SAMP_CTRL0_MASK = 0xffffffff; /* Determine whether target supported */ uint32_t target_hw = translate_texture_target(sv->base.target); @@ -176,12 +178,22 @@ etna_create_sampler_view_desc(struct pipe_context *pctx, struct pipe_resource *p bool is_array = false; bool sint = util_format_is_pure_sint(so->format); - if (sv->base.target == PIPE_TEXTURE_1D_ARRAY) { + switch(sv->base.target) { + case PIPE_TEXTURE_1D: + target_hw = TEXTURE_TYPE_2D; + sv->SAMP_CTRL0_MASK = ~VIVS_NTE_DESCRIPTOR_SAMP_CTRL0_VWRAP__MASK; + sv->SAMP_CTRL0 = VIVS_NTE_DESCRIPTOR_SAMP_CTRL0_VWRAP(TEXTURE_WRAPMODE_REPEAT); + break; + case PIPE_TEXTURE_1D_ARRAY: is_array = true; base_height = res->base.array_size; - } else if (sv->base.target == PIPE_TEXTURE_2D_ARRAY) { + break; + case PIPE_TEXTURE_2D_ARRAY: is_array = true; base_depth = res->base.array_size; + break; + default: + break; } #define DESC_SET(x, y) buf[(TEXDESC_##x)>>2] = (y) @@ -287,7 +299,7 @@ etna_emit_texture_desc(struct etna_context *ctx) if ((1 << x) & active_samplers) { struct etna_sampler_state_desc *ss = etna_sampler_state_desc(ctx->sampler[x]); struct etna_sampler_view_desc *sv = etna_sampler_view_desc(ctx->sampler_view[x]); - uint32_t SAMP_CTRL0 = ss->SAMP_CTRL0 | sv->SAMP_CTRL0; + uint32_t SAMP_CTRL0 = (ss->SAMP_CTRL0 & sv->SAMP_CTRL0_MASK) | sv->SAMP_CTRL0; if (texture_use_int_filter(&sv->base, &ss->base, true)) SAMP_CTRL0 |= VIVS_NTE_DESCRIPTOR_SAMP_CTRL0_INT_FILTER;