[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