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

Ian Romanick idr at freedesktop.org
Fri Oct 14 09:53:15 PDT 2011


On 10/13/2011 10:40 PM, Yuanhan Liu wrote:
> On Thu, Oct 13, 2011 at 09:12:09PM -0700, Ian Romanick wrote:
>> 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.
>
>  From my check, this bit was already set in our driver. It only use
> the mag and min filter as the condition. But in this patch, the round
> mode is set according to the mag and min filter. So, the results would
> be the same. And, IVB don't have this bit.

I see it now.  I don't know how I missed it before.

>> Does adding the following code at about line 227 of brw_wm_sampler.c
>> make any additional tests pass on SNB?
>
> Sorry, I didn't make it clear. Here the word 'several' means all the
> fails with the same issue. As the there are still about three fails that
> not belong this issue in the pbo test suite. My bad.

You were clear. :)  I was wondering if setting that bit would fix even 
more tests.  Since the bit is already set correctly, it shouldn't matter.

>>     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.
>
> Yes, will fix it later.
>
> Thanks,
> Yuanhan Liu
>
>>
>>>   }
>>>
>>>
>>> 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