Mesa (gallium-0.2): cell: use an approximation in compute_lambda_2d() to avoid sqrt

Brian Paul brianp at kemper.freedesktop.org
Mon Oct 20 15:35:31 UTC 2008


Module: Mesa
Branch: gallium-0.2
Commit: 81724da4f61f2ba678e2e0376209e1b754e1ecab
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=81724da4f61f2ba678e2e0376209e1b754e1ecab

Author: Brian Paul <brian.paul at tungstengraphics.com>
Date:   Fri Oct 17 09:09:57 2008 -0600

cell: use an approximation in compute_lambda_2d() to avoid sqrt

Though, the logf() call still needs attention.

---

 src/gallium/drivers/cell/spu/spu_texture.c |   14 ++++++++++++--
 1 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/cell/spu/spu_texture.c b/src/gallium/drivers/cell/spu/spu_texture.c
index 4e12a11..69784c8 100644
--- a/src/gallium/drivers/cell/spu/spu_texture.c
+++ b/src/gallium/drivers/cell/spu/spu_texture.c
@@ -414,7 +414,7 @@ sample_texture_2d_bilinear_int(vector float s, vector float t,
 /**
  * Compute level of detail factor from texcoords.
  */
-static float
+static INLINE float
 compute_lambda_2d(uint unit, vector float s, vector float t)
 {
    uint baseLevel = 0;
@@ -424,11 +424,21 @@ compute_lambda_2d(uint unit, vector float s, vector float t)
    float dsdy = width * (spu_extract(s, 2) - spu_extract(s, 0));
    float dtdx = height * (spu_extract(t, 1) - spu_extract(t, 0));
    float dtdy = height * (spu_extract(t, 2) - spu_extract(t, 0));
+#if 0
+   /* ideal value */
    float x = dsdx * dsdx + dtdx * dtdx;
    float y = dsdy * dsdy + dtdy * dtdy;
    float rho = x > y ? x : y;
    rho = sqrtf(rho);
-   float lambda = logf(rho) * 1.442695f;
+#else
+   /* approximation */
+   dsdx = fabsf(dsdx);
+   dsdy = fabsf(dsdy);
+   dtdx = fabsf(dtdx);
+   dtdy = fabsf(dtdy);
+   float rho = (dsdx + dsdy + dtdx + dtdy) * 0.5;
+#endif
+   float lambda = logf(rho) * 1.442695f; /* compute logbase2(rho) */
    return lambda;
 }
 




More information about the mesa-commit mailing list