On Mon, Nov 6, 2017 at 6:21 AM, Nicolai Hähnle <nhaeh...@gmail.com> wrote:
> On 06.11.2017 05:22, Ilia Mirkin wrote:
>>
>> Radeonsi also sets this flag.
>>
>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103544
>> Signed-off-by: Ilia Mirkin <imir...@alum.mit.edu>
>> ---
>>
>> This needs testing with the fbo-float-nan piglit that was recently added.
>> Just
>> guessing that this is the right flag to set here.
>
>
> Assuming that the test passes:

Well, the test can't pass or fail. The behavior is undefined. But Dave
ran it last night to see what would happen. It appears that with the
current code, if you have a float RB with a infinity or nan in it, and
then you set the dst blend factor to GL_ZERO, then you'll still end up
with a NaN in the result.

With this change, you'll end up with what most people would expect
with a GL_ZERO dst blend factor. Unless your src blend factor is e.g.
GL_DST_ALPHA, the dst op is multiplied. So if e.g. the RB has
(0,0,0,infinity), and shader output is (0,0,0,infinity), then src *
GL_DST_ALPHA + dst * GL_ZERO = (nan, nan, nan, nan). However src *
GL_SRC_ALPHA + dst + GL_ZERO = (0, 0, 0, infinity).

Perhaps there's another flag which controls 0 * inf = 0 vs NaN thing
for blending, but it wasn't immediately apparent from the docs. NVIDIA
blob drivers configure the hw for 0 * inf = 0.

>
> Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com>

Let me know if this stands, given the above info.

>
>
>
>>
>>   src/gallium/drivers/r600/evergreen_state.c | 1 +
>>   src/gallium/drivers/r600/r600_state.c      | 1 +
>>   2 files changed, 2 insertions(+)
>>
>> diff --git a/src/gallium/drivers/r600/evergreen_state.c
>> b/src/gallium/drivers/r600/evergreen_state.c
>> index 96eb35a9818..131778dea9f 100644
>> --- a/src/gallium/drivers/r600/evergreen_state.c
>> +++ b/src/gallium/drivers/r600/evergreen_state.c
>> @@ -1211,6 +1211,7 @@ static void
>> evergreen_set_color_surface_common(struct r600_context *rctx,
>>                 S_028C70_COMP_SWAP(swap) |
>>                 S_028C70_BLEND_CLAMP(blend_clamp) |
>>                 S_028C70_BLEND_BYPASS(blend_bypass) |
>> +               S_028C70_SIMPLE_FLOAT(1) |
>>                 S_028C70_NUMBER_TYPE(ntype) |
>>                 S_028C70_ENDIAN(endian);
>>   diff --git a/src/gallium/drivers/r600/r600_state.c
>> b/src/gallium/drivers/r600/r600_state.c
>> index c21e8dabb1f..0c331537460 100644
>> --- a/src/gallium/drivers/r600/r600_state.c
>> +++ b/src/gallium/drivers/r600/r600_state.c
>> @@ -898,6 +898,7 @@ static void r600_init_color_surface(struct
>> r600_context *rctx,
>>                 S_0280A0_COMP_SWAP(swap) |
>>                 S_0280A0_BLEND_BYPASS(blend_bypass) |
>>                 S_0280A0_BLEND_CLAMP(blend_clamp) |
>> +               S_0280A0_SIMPLE_FLOAT(1) |
>>                 S_0280A0_NUMBER_TYPE(ntype) |
>>                 S_0280A0_ENDIAN(endian);
>>
>
>
>
> --
> Lerne, wie die Welt wirklich ist,
> Aber vergiss niemals, wie sie sein sollte.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to