From bd4e769515345a6b20562310334bc828c0bb6605 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Thu, 6 Sep 2018 15:26:19 -0700 Subject: [PATCH] replace LOG2 with util_fast_log2 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The implementation is somewhat different, although if you go back in time far enough they're the same, but the one in u_math was changed a long time back to be faster. Reviewed-by: Marek Olšák Reviewed-by: Kristian H. Kristensen Reviewed-by: Matt Turner Part-of: --- src/mesa/swrast/s_span.c | 4 ++-- src/mesa/swrast/s_texfilter.c | 2 +- src/util/imports.h | 30 ------------------------------ 3 files changed, 3 insertions(+), 33 deletions(-) diff --git a/src/mesa/swrast/s_span.c b/src/mesa/swrast/s_span.c index c5bb058a3b8..cd97d0416e5 100644 --- a/src/mesa/swrast/s_span.c +++ b/src/mesa/swrast/s_span.c @@ -426,7 +426,7 @@ _swrast_compute_lambda(GLfloat dsdx, GLfloat dsdy, GLfloat dtdx, GLfloat dtdy, GLfloat x = sqrtf(dudx * dudx + dvdx * dvdx); GLfloat y = sqrtf(dudy * dudy + dvdy * dvdy); GLfloat rho = MAX2(x, y); - GLfloat lambda = LOG2(rho); + GLfloat lambda = util_fast_log2(rho); return lambda; } @@ -453,7 +453,7 @@ _swrast_compute_lambda(GLfloat dsdx, GLfloat dsdy, GLfloat dtdx, GLfloat dtdy, maxU = MAX2(dsdx2, dsdy2) * texW; maxV = MAX2(dtdx2, dtdy2) * texH; rho = MAX2(maxU, maxV); - lambda = LOG2(rho); + lambda = util_fast_log2(rho); return lambda; } #endif diff --git a/src/mesa/swrast/s_texfilter.c b/src/mesa/swrast/s_texfilter.c index cb91b81260e..13d517b6261 100644 --- a/src/mesa/swrast/s_texfilter.c +++ b/src/mesa/swrast/s_texfilter.c @@ -1961,7 +1961,7 @@ sample_lambda_2d_aniso(struct gl_context *ctx, /* note: we need to have Pmin=sqrt(Pmin2) here, but we can avoid * this since 0.5*log(x) = log(sqrt(x)) */ - lod = 0.5f * LOG2(Pmin2); + lod = 0.5f * util_fast_log2(Pmin2); if (adjustLOD) { /* from swrast/s_texcombine.c _swrast_texture_span */ diff --git a/src/util/imports.h b/src/util/imports.h index 67254a030a8..385b37c81b5 100644 --- a/src/util/imports.h +++ b/src/util/imports.h @@ -73,36 +73,6 @@ typedef union { float f; int i; unsigned u; } fi_type; /*@}*/ -/*** - *** LOG2: Log base 2 of float - ***/ -static inline float LOG2(float x) -{ -#if 0 - /* This is pretty fast, but not accurate enough (only 2 fractional bits). - * Based on code from http://www.stereopsis.com/log2.html - */ - const float y = x * x * x * x; - const unsigned ix = *((unsigned *) &y); - const unsigned exp = (ix >> 23) & 0xFF; - const int log2 = ((int) exp) - 127; - return (float) log2 * (1.0 / 4.0); /* 4, because of x^4 above */ -#endif - /* Pretty fast, and accurate. - * Based on code from http://www.flipcode.com/totd/ - */ - fi_type num; - int log_2; - num.f = x; - log_2 = ((num.i >> 23) & 255) - 128; - num.i &= ~(255 << 23); - num.i += 127 << 23; - num.f = ((-1.0f/3) * num.f + 2) * num.f - 2.0f/3; - return num.f + log_2; -} - - - /** * finite macro. */ -- 2.30.2