[Mesa-dev] [PATCH 1/3] r600: force LOD range to be only one value when mip.min filter is NONE

Roland Scheidegger sroland at vmware.com
Mon Jul 2 17:58:36 UTC 2018


Am 01.07.2018 um 19:32 schrieb Gert Wollny:
> For a texture that has only one LOD defined, but for which
> GL_TEXTURE_MAX_LEVEL is the default (1000) and
> GL_TEXTURE_MIN_LOD != GL_TEXTURE_MAX_LOD the reading from the texture does
> not properly resolve the LOD level and texture lookup might fail. Hence,
> when no mipmap filter is given (indicating that no mip-mapping takes place),
> force the LOD range to contain only value.
> 
> Fixes:
>   dEQP-GLES3.functional.shaders.texture_functions.texture*.(i|u)sampler2d*
>   dEQP-GLES3.functional.texture.format.sized.cube.rgb*
>   out of VK_GL_CTS/android/cts/master/gles3-master.txt
> Signed-off-by: Gert Wollny <gw.fossdev at gmail.com>
> ---
>  src/gallium/drivers/r600/evergreen_state.c | 12 ++++++++++--
>  1 file changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c
> index 5e5e3a0324..b6a01622e4 100644
> --- a/src/gallium/drivers/r600/evergreen_state.c
> +++ b/src/gallium/drivers/r600/evergreen_state.c
> @@ -575,14 +575,22 @@ static void *evergreen_create_sampler_state(struct pipe_context *ctx,
>  	unsigned max_aniso = rscreen->force_aniso >= 0 ? rscreen->force_aniso
>  						       : state->max_anisotropy;
>  	unsigned max_aniso_ratio = r600_tex_aniso_filter(max_aniso);
> +	float max_lod = state->max_lod;
>  
>  	if (!ss) {
>  		return NULL;
>  	}
>  
> +	/* If the min_mip_filter is NONE, then the texture has no mipmapping and
> +	 * MIP_FILTER will also be set to NONE. However, if more then one LOD is
> +	 * configured, then the texture lookup seems to fail for some specific texture
> +	 * formats. Forcing the number of LODs to one in this case fixes it. */
> +	if (state->min_mip_filter == PIPE_TEX_MIPFILTER_NONE)
> +		max_lod = state->min_lod;
Could that cause issues when min and mag filter are different? That is
I'm wondering if this needs special values rather than just max_lod so
the hw still selects the right min or mag filter (so, a range of [0,
1/256]) instead of setting min and max lod to the same (max_lod) value.
But if this passes piglit, I suppose it's alright.

For 1-2/3:
Reviewed-by: Roland Scheidegger <sroland at vmware.com>


> +
>  	ss->border_color_use = sampler_state_needs_border_color(state);
>  
> -	/* R_03C000_SQ_TEX_SAMPLER_WORD0_0 */
> +        /* R_03C000_SQ_TEX_SAMPLER_WORD0_0 */
>  	ss->tex_sampler_words[0] =
>  		S_03C000_CLAMP_X(r600_tex_wrap(state->wrap_s)) |
>  		S_03C000_CLAMP_Y(r600_tex_wrap(state->wrap_t)) |
> @@ -596,7 +604,7 @@ static void *evergreen_create_sampler_state(struct pipe_context *ctx,
>  	/* R_03C004_SQ_TEX_SAMPLER_WORD1_0 */
>  	ss->tex_sampler_words[1] =
>  		S_03C004_MIN_LOD(S_FIXED(CLAMP(state->min_lod, 0, 15), 8)) |
> -		S_03C004_MAX_LOD(S_FIXED(CLAMP(state->max_lod, 0, 15), 8));
> +		S_03C004_MAX_LOD(S_FIXED(CLAMP(max_lod, 0, 15), 8));
>  	/* R_03C008_SQ_TEX_SAMPLER_WORD2_0 */
>  	ss->tex_sampler_words[2] =
>  		S_03C008_LOD_BIAS(S_FIXED(CLAMP(state->lod_bias, -16, 16), 8)) |
> 



More information about the mesa-dev mailing list