[Mesa-dev] [PATCH 11/11] i965: Fix textureSize for Lod > 0 with non-mipmap filters

Ben Widawsky ben at bwidawsk.net
Fri Apr 10 15:34:43 PDT 2015


On Tue, Feb 10, 2015 at 04:40:48PM +0100, Eduardo Lima Mitev wrote:
> From: Iago Toral Quiroga <itoral at igalia.com>
> 
> Currently, when the MinFilter is GL_LINEAR or GL_NEAREST we hide the
> actual miplevel count from the hardware (and we avoid re-creating
> the miptree structure with all the levels), since we don't expect
> levels other than the base level to be needed. Unfortunately,
> GLSL's textureSize() function is an exception to this rule. This
> function takes a lod parameter that we need to use to return the
> size of the appropriate miplevel (if it exists). The spec only
> requires that the miplevel exists, so even if the sampler is
> configured with a linear or nearest MinFilter, as far as the user
> has uploaded miplevels for the texture, textureSize() should return
> the appropriate sizes.
> 
> This patch fixes this by exposing the actual miplevel count for all
> sampling engine textures while keeping the original implementation
> for render targets (for render targets textures we do not provide
> the miplevel count but the actual LOD we are wrting to, so we
> want to make sure that we make this the base level).
> 
> Fixes 28 dEQP tests in the following category:
> dEQP-GLES3.functional.shaders.texture_functions.texturesize.*
> ---
>  src/mesa/drivers/dri/i965/intel_tex_validate.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/intel_tex_validate.c b/src/mesa/drivers/dri/i965/intel_tex_validate.c
> index 0bf0393..06aeca6 100644
> --- a/src/mesa/drivers/dri/i965/intel_tex_validate.c
> +++ b/src/mesa/drivers/dri/i965/intel_tex_validate.c
> @@ -47,8 +47,10 @@ intel_update_max_level(struct intel_texture_object *intelObj,
>  {
>     struct gl_texture_object *tObj = &intelObj->base;
>  
> -   if (sampler->MinFilter == GL_NEAREST ||
> -       sampler->MinFilter == GL_LINEAR) {
> +   if (!tObj->_MipmapComplete ||
> +       (tObj->_RenderToTexture &&
> +        (sampler->MinFilter == GL_NEAREST ||
> +         sampler->MinFilter == GL_LINEAR))) {
>        intelObj->_MaxLevel = tObj->BaseLevel;
>     } else {
>        intelObj->_MaxLevel = tObj->_MaxLevel;

Forgive my ignorance on this subject in advance...

I don't know if _MipmapComplete is correct here. Looking at
_mesa_test_texobj_completeness, it /seems/ like almost all the cases which would
mark the texture as !_MipmapComplete are errors, but reading the comments for
incomplete() suggests to me there are potentially valid cases where you could
use textureSize(), but have an incomplete mipmap. IN OTHER WORDS... it seems to
me that you may want something other than tObj->BaseLevel even when
!tObj->_MipmapComplete. Clarification would be greatly appreciated.

I assume the use of _MipmapComplete was what required adding the bit about
tObj->_RenderToTexture (because certain textures are considered complete even
when they're not??). I don't know enough to assert correctness for that though.
Would be nice if you could dumb this down for me as well.

With a valid explanation of how tObj->_MipmapComplete and tObj->_RenderToTexture
are indeed the correct thing always, it's:
Reviewed-by: Ben Widawsky <ben at bwidawsk.net> (with the ignorance caveat)



More information about the mesa-dev mailing list