[Mesa-dev] [PATCH 2/2] intel: make sure hardware choose the right filter mode

Yuanhan Liu yuanhan.liu at linux.intel.com
Wed Nov 9 01:10:17 PST 2011


On Thu, Nov 03, 2011 at 10:16:06AM +0800, Yuanhan Liu wrote:
> On Wed, Nov 02, 2011 at 02:18:46PM -0700, Eric Anholt wrote:
> > On Wed, 2 Nov 2011 11:12:07 +0800, Yuanhan Liu <yuanhan.liu at linux.intel.com> wrote:
> > > On Tue, Nov 01, 2011 at 05:57:36PM +0800, Yuanhan Liu wrote:
> > > > According to bspec, MIPCnt(was set to intelObj->_MaxLevel) was used for
> > > > min/mag filter mode determination. For a normal case with no mipmap like
> > > > this:
> > > > 
> > > >   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
> > > >   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
> > > > 
> > > > hardware would always choose mag filter(GL_LINEAR) here since MIPCnt was
> > > > set to 0 zero, then would make LOD be zero. Then according the formula:
> > > >   MagMode = (LOD - Base <= 0)
> > > 
> > > Here are some more comments about this: LOD is a pre-computed value. if
> > > preClamp is enabled, then LOD would be:
> > >   LOD = min(min(MIPCnt, MAX_LOD), LOD);
> > > 
> > > So, if MIPCnt was set to 0, and preClamp was enabled, then the _final_
> > > LOD would be 0, and hardware choose mag filter.
> > > 
> > > Thoughts?
> > 
> > It took me a long time to understand what you were trying to fix here.
> 
> Sorry for that :(
> 
> > The story I've worked out is:
> > 
> > "We can't optimize out uploading the other mipmap levels for
> > non-mipmapped filtering modes if the min filter is not the same as the
> > mag filter.  This is because the min/mag decision is based on the
> > computed LOD of the sample, and if we clamp the LOD to BaseLevel by not
> > including the other levels, it will always choose the mag filter even if
> > minification should have occurred. 
> 
> Yes.
> 
> > See page FINISHME: citation of PRM."
> 
> Sorry, what does this mean?
> 
> > 
> > Particularly what was unclear was that the patch was just skipping an
> > optimization, to get behavior back in line with what the user did through
> > the API: Specify multiple levels in their texture.
> 
> Yeah, I saw that. While thinking about this issue, I thought another
> patch to fix this issue. It's somehow against with the Bspec: preclamp
> should be enabled for OpenGL driver.
> 
> Anyway, here is the patch, and I'd like to know what's your thoughts.

Hi Eric,

Thoughts on the following patch?

Thanks,
Yuanhan Liu
> 
> ---
> 
> >From 052b646f5db1da338244325750fb50d28f77d575 Mon Sep 17 00:00:00 2001
> From: Yuanhan Liu <yuanhan.liu at linux.intel.com>
> Date: Thu, 3 Nov 2011 10:01:25 +0800
> Subject: [PATCH] i965: make sure hardware choose the right filter mode
> 
> Here I quoted Eric's words:
>   the min/mag decision is based on the computed LOD of the sample,
>   and if we clamp the LOD to BaseLevel by not including the other
>   levels, it will always choose the mag filter even if minification
>   should have occurred
> 
> And here is how the hardware do the min/mag decision in a formula way:
> 
>   MagMode = (LOD - Base <= 0)
> 
> where LOD is computed in a way like the following if preClamp is enabled:
>   if (preClamp is enabled)
>     LOD = min(min(MIPCnt, MAX_LOD), pre-computed_LOD);
>   else
>     LOD = per-computed_LOD;
> 
> So, if have just one level(the baselevel), just don't enable preclamp to
> make hardware choose the right filter mode.
> 
> This would fix all oglc filtercubemin subcase fail and introduce no oglc
> regression.
> 
> Signed-off-by: Yuanhan Liu <yuanhan.liu at linux.intel.com>
> ---
>  src/mesa/drivers/dri/i965/brw_wm_sampler_state.c |    9 +++++++++
>  1 files changed, 9 insertions(+), 0 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_wm_sampler_state.c b/src/mesa/drivers/dri/i965/brw_wm_sampler_state.c
> index 6104afc..f102573 100644
> --- a/src/mesa/drivers/dri/i965/brw_wm_sampler_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_wm_sampler_state.c
> @@ -164,8 +164,10 @@ static void brw_update_sampler_state(struct brw_context *brw,
>     struct gl_context *ctx = &intel->ctx;
>     struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
>     struct gl_texture_object *texObj = texUnit->_Current;
> +   struct intel_texture_object *intelObj = intel_texture_object(texObj);
>     struct gl_sampler_object *gl_sampler = _mesa_get_samplerobj(ctx, unit);
>     bool using_nearest = false;
> +   int mip_cnt = intelObj->_MaxLevel - texObj->BaseLevel;
>  
>     switch (gl_sampler->MinFilter) {
>     case GL_NEAREST:
> @@ -275,6 +277,13 @@ static void brw_update_sampler_state(struct brw_context *brw,
>  					 gl_sampler->LodBias, -16, 15), 6);
>  
>     sampler->ss0.lod_preclamp = 1; /* OpenGL mode */
> +   /*
> +    * Workaround: if mip count is set to 0 and preclamp is enabled,
> +    * this would clamp * the final lod to 0 and then hardware would
> +    * always choose mag filter.
> +    */
> +   if (gl_sampler->MinFilter != gl_sampler->MagFilter && mip_cnt == 0)
> +      sampler->ss0.lod_preclamp = 0;
>     sampler->ss0.default_color_mode = 0; /* OpenGL/DX10 mode */
>  
>     /* Set BaseMipLevel, MaxLOD, MinLOD: 
> -- 
> 1.7.4.4
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list