[Mesa-dev] [PATCH] glsl: improve the accuracy of the asin() builtin function.
Paul Berry
stereotype441 at gmail.com
Wed Jul 27 18:01:09 PDT 2011
I forgot to mention:
Fixes piglit tests {vs,fs}-asin-float and {vs,fs}-atan-*
On 27 July 2011 15:15, Paul Berry <stereotype441 at gmail.com> wrote:
> The previous formula for asin(x) was algebraically equivalent to:
>
> sign(x)*(pi/2 - sqrt(1-|x|)*(A + B|x| + C|x|^2))
>
> where A, B, and C were arbitrary constants determined by a curve fit.
>
> This formula had a worst case absolute error of 0.00448, an unbounded
> worst case relative error, and a discontinuity near x=0.
>
> Changed the formula to:
>
> sign(x)*(pi/2 - sqrt(1-|x|)*(pi/2 + (pi/4-1)|x| + A|x|^2 + B|x|^3))
>
> where A and B are arbitrary constants determined by a curve fit. This
> has a worst case absolute error of 0.00039, a worst case relative
> error of 0.000405, and no discontinuities.
>
> I don't expect a significant performance degradation, since the extra
> multiply-accumulate should be fast compared to the sqrt() computation.
> ---
> src/glsl/builtins/ir/asin | 68 ++++++++++++++++++++++++++------------------
> 1 files changed, 40 insertions(+), 28 deletions(-)
>
> diff --git a/src/glsl/builtins/ir/asin b/src/glsl/builtins/ir/asin
> index e230ad6..45d9e67 100644
> --- a/src/glsl/builtins/ir/asin
> +++ b/src/glsl/builtins/ir/asin
> @@ -5,23 +5,26 @@
> ((return (expression float *
> (expression float sign (var_ref x))
> (expression float -
> - (expression float *
> - (constant float (3.1415926))
> - (constant float (0.5)))
> + (constant float (1.5707964))
> (expression float *
> (expression float sqrt
> (expression float -
> (constant float (1.0))
> (expression float abs (var_ref x))))
> (expression float +
> - (constant float (1.5707288))
> + (constant float (1.5707964))
> (expression float *
> (expression float abs (var_ref x))
> (expression float +
> - (constant float (-0.2121144))
> + (constant float (-0.21460183))
> (expression float *
> - (constant float (0.0742610))
> - (expression float abs (var_ref x))))))))))))
> + (expression float abs (var_ref x))
> + (expression float +
> + (constant float (0.086566724))
> + (expression float *
> + (expression float abs (var_ref x))
> + (constant float (-0.03102955))
> + ))))))))))))
>
> (signature vec2
> (parameters
> @@ -29,23 +32,26 @@
> ((return (expression vec2 *
> (expression vec2 sign (var_ref x))
> (expression vec2 -
> - (expression float *
> - (constant float (3.1415926))
> - (constant float (0.5)))
> + (constant float (1.5707964))
> (expression vec2 *
> (expression vec2 sqrt
> (expression vec2 -
> (constant float (1.0))
> (expression vec2 abs (var_ref x))))
> (expression vec2 +
> - (constant float (1.5707288))
> + (constant float (1.5707964))
> (expression vec2 *
> (expression vec2 abs (var_ref x))
> (expression vec2 +
> - (constant float (-0.2121144))
> + (constant float (-0.21460183))
> (expression vec2 *
> - (constant float (0.0742610))
> - (expression vec2 abs (var_ref x))))))))))))
> + (expression vec2 abs (var_ref x))
> + (expression vec2 +
> + (constant float (0.086566724))
> + (expression vec2 *
> + (expression vec2 abs (var_ref x))
> + (constant float (-0.03102955))
> + ))))))))))))
>
> (signature vec3
> (parameters
> @@ -53,23 +59,26 @@
> ((return (expression vec3 *
> (expression vec3 sign (var_ref x))
> (expression vec3 -
> - (expression float *
> - (constant float (3.1415926))
> - (constant float (0.5)))
> + (constant float (1.5707964))
> (expression vec3 *
> (expression vec3 sqrt
> (expression vec3 -
> (constant float (1.0))
> (expression vec3 abs (var_ref x))))
> (expression vec3 +
> - (constant float (1.5707288))
> + (constant float (1.5707964))
> (expression vec3 *
> (expression vec3 abs (var_ref x))
> (expression vec3 +
> - (constant float (-0.2121144))
> + (constant float (-0.21460183))
> (expression vec3 *
> - (constant float (0.0742610))
> - (expression vec3 abs (var_ref x))))))))))))
> + (expression vec3 abs (var_ref x))
> + (expression vec3 +
> + (constant float (0.086566724))
> + (expression vec3 *
> + (expression vec3 abs (var_ref x))
> + (constant float (-0.03102955))
> + ))))))))))))
>
> (signature vec4
> (parameters
> @@ -77,21 +86,24 @@
> ((return (expression vec4 *
> (expression vec4 sign (var_ref x))
> (expression vec4 -
> - (expression float *
> - (constant float (3.1415926))
> - (constant float (0.5)))
> + (constant float (1.5707964))
> (expression vec4 *
> (expression vec4 sqrt
> (expression vec4 -
> (constant float (1.0))
> (expression vec4 abs (var_ref x))))
> (expression vec4 +
> - (constant float (1.5707288))
> + (constant float (1.5707964))
> (expression vec4 *
> (expression vec4 abs (var_ref x))
> (expression vec4 +
> - (constant float (-0.2121144))
> + (constant float (-0.21460183))
> (expression vec4 *
> - (constant float (0.0742610))
> - (expression vec4 abs (var_ref x))))))))))))
> + (expression vec4 abs (var_ref x))
> + (expression vec4 +
> + (constant float (0.086566724))
> + (expression vec4 *
> + (expression vec4 abs (var_ref x))
> + (constant float (-0.03102955))
> + ))))))))))))
> ))
> --
> 1.7.6
>
>
More information about the mesa-dev
mailing list