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 <[email protected]> > --- > 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 <[email protected]> > + > 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)) | > _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
