[Mesa-dev] [PATCH 1/1] mesa: Properly set the fog scale (gl_Fog.scale) to +INF when fog start and end are equal.

Ian Romanick idr at freedesktop.org
Wed Aug 21 15:31:47 PDT 2013


On 08/17/2013 10:42 AM, Henri Verbeet wrote:
> This was originally introduced by commit
> ba47aabc9868b410cdfe3bc8b6d25a44a598cba2, but unfortunately the commit message
> doesn't go into much detail about why +INF would be a problem here. I don't
> see anything in the spec that would allow 1.0f here.

Section 2.1.1 (Floating-point computation) says:

     "The result of providing a value that is not a floating-point
     number to such a command is unspecified, but must not lead to
     GL interruption or termination. In IEEE arithmetic, for
     example, providing a negative zero or a denormalized number
     to a GL command yields predictable results, while providing a
     NaN or an infinity yields unspecified results."

I /think/ this qualifies for the "unspecified results" clause.  An 
argument could probably be made the other way, however.

> A similar issue exists for STATE_FOG_PARAMS_OPTIMIZED, but allowing infinity
> there would potentially introduce NaNs where they shouldn't exist, depending
> on the values of fog end and the fog coord. Since STATE_FOG_PARAMS_OPTIMIZED
> is only used for fixed function (including ARB_fragment_program with fog
> option), and the calculation there probably isn't very stable to begin with
> when fog start and end are close together, it seems best to just leave it
> alone.
>
> This fixes a couple of Wine D3D tests. No piglit changes on Cayman.

Have you tried it on older GPUs?  r300?  i915?  Could we get a simple 
piglit test case that reproduces the issue?

It seems like there were some old ATI GPUs that didn't have a 
representation for INF... and would do something stupid if you tried to 
feed them INF.  Modern GPUs just use IEEE, so they do the right thing.

>
> Signed-off-by: Henri Verbeet <hverbeet at gmail.com>
> ---
>   src/mesa/program/prog_statevars.c |    3 +--
>   1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/src/mesa/program/prog_statevars.c b/src/mesa/program/prog_statevars.c
> index f6073be..657c6e6 100644
> --- a/src/mesa/program/prog_statevars.c
> +++ b/src/mesa/program/prog_statevars.c
> @@ -256,8 +256,7 @@ _mesa_fetch_state(struct gl_context *ctx, const gl_state_index state[],
>         value[0] = ctx->Fog.Density;
>         value[1] = ctx->Fog.Start;
>         value[2] = ctx->Fog.End;
> -      value[3] = (ctx->Fog.End == ctx->Fog.Start)
> -         ? 1.0f : (GLfloat)(1.0 / (ctx->Fog.End - ctx->Fog.Start));
> +      value[3] = (GLfloat)(1.0 / (ctx->Fog.End - ctx->Fog.Start));
>         return;
>      case STATE_CLIPPLANE:
>         {
>



More information about the mesa-dev mailing list