gallivm: (trivial) use constant instead of exp2f() function
authorRoland Scheidegger <sroland@vmware.com>
Sun, 14 Jul 2013 00:38:13 +0000 (02:38 +0200)
committerRoland Scheidegger <sroland@vmware.com>
Sun, 14 Jul 2013 00:39:33 +0000 (02:39 +0200)
Some lame compilers can't do exp2f() and as far as I can tell they can't do
exp2() (with doubles) neither so instead of providing some workaround for
that (wouldn't actually be too bad just replace with pow) and since it is
used with a constant only just use the precalculated constant.

src/gallium/auxiliary/gallivm/lp_bld_format_srgb.c

index 217aaa998383a58841cd2d802751c4f78236c8e6..f949a8daff1611a6c4ad255e94a9e53be6bfcaed 100644 (file)
@@ -170,6 +170,8 @@ lp_build_linear_to_srgb(struct gallivm_state *gallivm,
        */
 
       float exp_f = 2.0f / 3.0f;
+      /* some compilers can't do exp2f, so this is exp2f(127.0f/exp_f - 127.0f) */
+      float exp2f_c = 1.30438178253e+19f;
       float coeff_f = 0.62996f;
       LLVMValueRef pow_approx, coeff, x2, exponent, pow_1, pow_2;
       struct lp_type int_type = lp_int_type(src_type);
@@ -179,8 +181,7 @@ lp_build_linear_to_srgb(struct gallivm_state *gallivm,
        */
       exponent = lp_build_const_vec(gallivm, src_type, exp_f);
       coeff = lp_build_const_vec(gallivm, src_type,
-                                 exp2f(127.0f / exp_f - 127.0f) *
-                                 powf(coeff_f, 1.0f / exp_f));
+                                 exp2f_c * powf(coeff_f, 1.0f / exp_f));
 
       /* premultiply src */
       tmp = lp_build_mul(&f32_bld, coeff, src);