[Mesa-dev] [PATCH] i965: setup address rounding enable bits

Ian Romanick idr at freedesktop.org
Thu Oct 13 21:12:09 PDT 2011


On 10/12/2011 08:34 PM, Yuanhan Liu wrote:
> The patch(based on the reading of the emulator) came from while I was
> trying to fix the oglc pbo texImage.1PBODefaults fail. This case
> generates a texture with the width and height equal to window's width
> and height respectively, then try to texture it on the whole window.
> So, it's exactly one texel for one pixel.  And, the min filter and mag
> filter are GL_LINEAR. It runs with swrast OK, as expected. But it failed
> with i965 driver.
>
> Well, you can't tell the difference from the screen, as the error is
> quite tiny. From my digging, it seems that there are some tiny error
> happened while getting tex address. This will break the one texel for
> one pixel rule in this case. Thus the linear result is taken, with tiny
> error.
>
> This patch would fix several oglc pbo subcase fail on both ILK, SNB and
> IVB.

I don't know about this patch, but this led me to notice something else 
in the docs.  Starting with Sandybridge, bit 27 in dword 0 is "Min and 
Mag State Not Equal."  This is ss0.min_mag_neq in our structure.  The 
hardware docs say that this bit must be set to 0 if the min and mag 
filter state are not the same, min and mag U round modes are not the 
same, min and mag V round modes are not the same, or min and mag R round 
modes are not the same.  I can't see that this bit is set anywhere in 
the driver.

Does adding the following code at about line 227 of brw_wm_sampler.c 
make any additional tests pass on SNB?

    if (intel->gen >= 6)
       sampler->ss0.min_mag_neq =
          sampler->ss0.min_filter != sampler->ss0.mag_filter;

> Signed-off-by: Yuanhan Liu<yuanhan.liu at linux.intel.com>
> ---
>   src/mesa/drivers/dri/i965/brw_defines.h          |    7 +++++++
>   src/mesa/drivers/dri/i965/brw_wm_sampler_state.c |    9 +++++++++
>   src/mesa/drivers/dri/i965/gen7_sampler_state.c   |    9 +++++++++
>   3 files changed, 25 insertions(+), 0 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_defines.h b/src/mesa/drivers/dri/i965/brw_defines.h
> index a111630..e4647ff 100644
> --- a/src/mesa/drivers/dri/i965/brw_defines.h
> +++ b/src/mesa/drivers/dri/i965/brw_defines.h
> @@ -196,6 +196,13 @@
>   #define BRW_MIPFILTER_NEAREST     1
>   #define BRW_MIPFILTER_LINEAR      3
>
> +#define BRW_ADDRESS_ROUNDING_ENABLE_U_MAG	0x20
> +#define BRW_ADDRESS_ROUNDING_ENABLE_U_MIN	0x10
> +#define BRW_ADDRESS_ROUNDING_ENABLE_V_MAG	0x08
> +#define BRW_ADDRESS_ROUNDING_ENABLE_V_MIN	0x04
> +#define BRW_ADDRESS_ROUNDING_ENABLE_R_MAG	0x02
> +#define BRW_ADDRESS_ROUNDING_ENABLE_R_MIN	0x01
> +
>   #define BRW_POLYGON_FRONT_FACING     0
>   #define BRW_POLYGON_BACK_FACING      1
>
> 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 6834eba..9fc1c1a 100644
> --- a/src/mesa/drivers/dri/i965/brw_wm_sampler_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_wm_sampler_state.c
> @@ -312,6 +312,15 @@ static void brw_update_sampler_state(struct brw_context *brw,
>   			      intel->batch.bo, brw->wm.sdc_offset[unit],
>   			      I915_GEM_DOMAIN_SAMPLER, 0);
>      }
> +
> +   if (sampler->ss0.min_filter != BRW_MAPFILTER_NEAREST)
> +      sampler->ss3.address_round = BRW_ADDRESS_ROUNDING_ENABLE_U_MIN |
> +                                   BRW_ADDRESS_ROUNDING_ENABLE_V_MIN |
> +                                   BRW_ADDRESS_ROUNDING_ENABLE_R_MIN;
> +   if (sampler->ss0.mag_filter != BRW_MAPFILTER_NEAREST)
> +      sampler->ss3.address_round |= BRW_ADDRESS_ROUNDING_ENABLE_U_MAG |
> +                                    BRW_ADDRESS_ROUNDING_ENABLE_V_MAG |
> +                                    BRW_ADDRESS_ROUNDING_ENABLE_R_MAG;

It looks weird that one of these cases use = and the other uses |=. It
would be better to assign 0 to ss3.address_round before the first case
and use |= in both cases.

>   }
>
>
> diff --git a/src/mesa/drivers/dri/i965/gen7_sampler_state.c b/src/mesa/drivers/dri/i965/gen7_sampler_state.c
> index aee67c8..5fab91c 100644
> --- a/src/mesa/drivers/dri/i965/gen7_sampler_state.c
> +++ b/src/mesa/drivers/dri/i965/gen7_sampler_state.c
> @@ -167,6 +167,15 @@ gen7_update_sampler_state(struct brw_context *brw, int unit,
>      upload_default_color(brw, gl_sampler, unit);
>
>      sampler->ss2.default_color_pointer = brw->wm.sdc_offset[unit]>>  5;
> +
> +   if (sampler->ss0.min_filter != BRW_MAPFILTER_NEAREST)
> +      sampler->ss3.address_round = BRW_ADDRESS_ROUNDING_ENABLE_U_MIN |
> +                                   BRW_ADDRESS_ROUNDING_ENABLE_V_MIN |
> +                                   BRW_ADDRESS_ROUNDING_ENABLE_R_MIN;
> +   if (sampler->ss0.mag_filter != BRW_MAPFILTER_NEAREST)
> +      sampler->ss3.address_round |= BRW_ADDRESS_ROUNDING_ENABLE_U_MAG |
> +                                    BRW_ADDRESS_ROUNDING_ENABLE_V_MAG |
> +                                    BRW_ADDRESS_ROUNDING_ENABLE_R_MAG;

Same comment here as above.

>   }
>
>



More information about the mesa-dev mailing list