GLSL: The LOG2 macro doesn't have enough precision
authorIan Romanick <ian.d.romanick@intel.com>
Thu, 18 Dec 2008 22:11:06 +0000 (14:11 -0800)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 19 Dec 2008 21:06:53 +0000 (13:06 -0800)
It looks like the LOG2 macro only has 8 or 9 bits of precission, but
the ARB_vertex_program spec says "accurate to at least 10 bits".

src/mesa/shader/prog_execute.c

index 8163ae6a6f5ec5795e7c2dd5f773e8294671b63f..a93733c085288fd3f89d255d976b87e2c2a8f1ea 100644 (file)
@@ -963,7 +963,10 @@ _mesa_execute_program(GLcontext * ctx,
          {
             GLfloat a[4], result[4];
             fetch_vector1(&inst->SrcReg[0], machine, a);
-            result[0] = result[1] = result[2] = result[3] = LOG2(a[0]);
+           /* The fast LOG2 macro doesn't meet the precision requirements.
+            */
+            result[0] = result[1] = result[2] = result[3] =
+               (log(a[0]) * 1.442695F);
             store_vector4(inst, machine, result);
          }
          break;
@@ -1022,7 +1025,11 @@ _mesa_execute_program(GLcontext * ctx,
                   GLfloat mantissa = FREXPF(t[0], &exponent);
                   q[0] = (GLfloat) (exponent - 1);
                   q[1] = (GLfloat) (2.0 * mantissa); /* map [.5, 1) -> [1, 2) */
-                  q[2] = (GLfloat) (q[0] + LOG2(q[1]));
+
+                 /* The fast LOG2 macro doesn't meet the precision
+                  * requirements.
+                  */
+                  q[2] = (log(t[0]) * 1.442695F);
                }
             }
             else {