[Mesa-dev] [PATCH 2/4] mesa: Replace uses of IROUND{, D, 64} with libm functions.

Ian Romanick idr at freedesktop.org
Thu May 26 19:43:02 UTC 2016


On 05/26/2016 11:28 AM, Matt Turner wrote:
> IROUND   is replaces with lroundf.
> IROUNDD  is replaces with lround.
                     ^ d on both of the above

> IROUND64 is replaced with llroundf.
> ---
> This is a resend of a patch from last year.
> 
> Roland suggested using rint instead of round since it's cheaper, but it
> actually causes test failures in some dEQP tests. Additionally, while
> rint is cheaper than round, it's not as bad as he thought since we're
> using -fno-math-errno -fno-trapping-math.
> 
> Brian said it would be interesting to run the old conformance suite
> with swrast. I have not done that... I don't think I know where that
> conformance suite is.

An alternative would be the OpenGL ES 1.1 conformance tests.  I might
have the old SGI tests somewhere... I haven't built or run them in
years.  Almost all of those tests are included in the GLES 1.1
conformance suite.

>  src/mesa/main/drawpix.c         | 21 +++++++++++----------
>  src/mesa/main/eval.c            | 15 ++++++++-------
>  src/mesa/main/get.c             | 29 +++++++++++++++--------------
>  src/mesa/main/imports.h         | 25 -------------------------
>  src/mesa/main/light.c           |  9 +++++----
>  src/mesa/main/pixel.c           |  2 +-
>  src/mesa/main/pixelstore.c      |  3 ++-
>  src/mesa/main/samplerobj.c      |  8 ++++----
>  src/mesa/main/texparam.c        |  8 ++++----
>  src/mesa/main/uniform_query.cpp |  4 ++--
>  src/mesa/swrast/s_blit.c        |  3 ++-
>  src/mesa/swrast/s_context.h     |  3 ++-
>  12 files changed, 56 insertions(+), 74 deletions(-)
> 
> diff --git a/src/mesa/main/drawpix.c b/src/mesa/main/drawpix.c
> index 720a082..1b0cb38 100644
> --- a/src/mesa/main/drawpix.c
> +++ b/src/mesa/main/drawpix.c
> @@ -36,6 +36,7 @@
>  #include "dispatch.h"
>  #include "glformats.h"
>  #include "fbobject.h"
> +#include "util/rounding.h"
>  
>  
>  /*
> @@ -51,14 +52,14 @@ _mesa_DrawPixels( GLsizei width, GLsizei height,
>     FLUSH_VERTICES(ctx, 0);
>  
>     if (MESA_VERBOSE & VERBOSE_API)
> -      _mesa_debug(ctx, "glDrawPixels(%d, %d, %s, %s, %p) // to %s at %d, %d\n",
> +      _mesa_debug(ctx, "glDrawPixels(%d, %d, %s, %s, %p) // to %s at %ld, %ld\n",
>                    width, height,
>                    _mesa_enum_to_string(format),
>                    _mesa_enum_to_string(type),
>                    pixels,
>                    _mesa_enum_to_string(ctx->DrawBuffer->ColorDrawBuffer[0]),
> -                  IROUND(ctx->Current.RasterPos[0]),
> -                  IROUND(ctx->Current.RasterPos[1]));
> +                  lroundf(ctx->Current.RasterPos[0]),
> +                  lroundf(ctx->Current.RasterPos[1]));
>  
>  
>     if (width < 0 || height < 0) {
> @@ -140,8 +141,8 @@ _mesa_DrawPixels( GLsizei width, GLsizei height,
>     if (ctx->RenderMode == GL_RENDER) {
>        if (width > 0 && height > 0) {
>           /* Round, to satisfy conformance tests (matches SGI's OpenGL) */
> -         GLint x = IROUND(ctx->Current.RasterPos[0]);
> -         GLint y = IROUND(ctx->Current.RasterPos[1]);
> +         GLint x = lroundf(ctx->Current.RasterPos[0]);
> +         GLint y = lroundf(ctx->Current.RasterPos[1]);
>  
>           if (_mesa_is_bufferobj(ctx->Unpack.BufferObj)) {
>              /* unpack from PBO */
> @@ -196,13 +197,13 @@ _mesa_CopyPixels( GLint srcx, GLint srcy, GLsizei width, GLsizei height,
>  
>     if (MESA_VERBOSE & VERBOSE_API)
>        _mesa_debug(ctx,
> -                  "glCopyPixels(%d, %d, %d, %d, %s) // from %s to %s at %d, %d\n",
> +                  "glCopyPixels(%d, %d, %d, %d, %s) // from %s to %s at %ld, %ld\n",
>                    srcx, srcy, width, height,
>                    _mesa_enum_to_string(type),
>                    _mesa_enum_to_string(ctx->ReadBuffer->ColorReadBuffer),
>                    _mesa_enum_to_string(ctx->DrawBuffer->ColorDrawBuffer[0]),
> -                  IROUND(ctx->Current.RasterPos[0]),
> -                  IROUND(ctx->Current.RasterPos[1]));
> +                  lroundf(ctx->Current.RasterPos[0]),
> +                  lroundf(ctx->Current.RasterPos[1]));
>  
>     if (width < 0 || height < 0) {
>        _mesa_error(ctx, GL_INVALID_VALUE, "glCopyPixels(width or height < 0)");
> @@ -264,8 +265,8 @@ _mesa_CopyPixels( GLint srcx, GLint srcy, GLsizei width, GLsizei height,
>     if (ctx->RenderMode == GL_RENDER) {
>        /* Round to satisfy conformance tests (matches SGI's OpenGL) */
>        if (width > 0 && height > 0) {
> -         GLint destx = IROUND(ctx->Current.RasterPos[0]);
> -         GLint desty = IROUND(ctx->Current.RasterPos[1]);
> +         GLint destx = lroundf(ctx->Current.RasterPos[0]);
> +         GLint desty = lroundf(ctx->Current.RasterPos[1]);
>           ctx->Driver.CopyPixels( ctx, srcx, srcy, width, height, destx, desty,
>                                   type );
>        }
> diff --git a/src/mesa/main/eval.c b/src/mesa/main/eval.c
> index 86c8f75..d87d92e 100644
> --- a/src/mesa/main/eval.c
> +++ b/src/mesa/main/eval.c
> @@ -44,6 +44,7 @@
>  #include "macros.h"
>  #include "mtypes.h"
>  #include "main/dispatch.h"
> +#include "util/rounding.h"
>  
>  
>  /*
> @@ -704,7 +705,7 @@ _mesa_GetnMapivARB( GLenum target, GLenum query, GLsizei bufSize, GLint *v )
>              if (bufSize < numBytes)
>                 goto overflow;
>  	    for (i=0;i<n;i++) {
> -	       v[i] = IROUND(data[i]);
> +	       v[i] = lroundf(data[i]);
>  	    }
>  	 }
>           break;
> @@ -728,17 +729,17 @@ _mesa_GetnMapivARB( GLenum target, GLenum query, GLsizei bufSize, GLint *v )
>              numBytes = 2 * sizeof *v;
>              if (bufSize < numBytes)
>                 goto overflow;
> -            v[0] = IROUND(map1d->u1);
> -            v[1] = IROUND(map1d->u2);
> +            v[0] = lroundf(map1d->u1);
> +            v[1] = lroundf(map1d->u2);
>           }
>           else {
>              numBytes = 4 * sizeof *v;
>              if (bufSize < numBytes)
>                 goto overflow;
> -            v[0] = IROUND(map2d->u1);
> -            v[1] = IROUND(map2d->u2);
> -            v[2] = IROUND(map2d->v1);
> -            v[3] = IROUND(map2d->v2);
> +            v[0] = lroundf(map2d->u1);
> +            v[1] = lroundf(map2d->u2);
> +            v[2] = lroundf(map2d->v1);
> +            v[3] = lroundf(map2d->v2);
>           }
>           break;
>        default:
> diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
> index e3a0a11..e8e443a 100644
> --- a/src/mesa/main/get.c
> +++ b/src/mesa/main/get.c
> @@ -40,6 +40,7 @@
>  #include "framebuffer.h"
>  #include "samplerobj.h"
>  #include "stencil.h"
> +#include "util/rounding.h"
>  
>  /* This is a table driven implemetation of the glGet*v() functions.
>   * The basic idea is that most getters just look up an int somewhere
> @@ -1626,13 +1627,13 @@ _mesa_GetIntegerv(GLenum pname, GLint *params)
>        break;
>  
>     case TYPE_FLOAT_4:
> -      params[3] = IROUND(((GLfloat *) p)[3]);
> +      params[3] = lroundf(((GLfloat *) p)[3]);
>     case TYPE_FLOAT_3:
> -      params[2] = IROUND(((GLfloat *) p)[2]);
> +      params[2] = lroundf(((GLfloat *) p)[2]);
>     case TYPE_FLOAT_2:
> -      params[1] = IROUND(((GLfloat *) p)[1]);
> +      params[1] = lroundf(((GLfloat *) p)[1]);
>     case TYPE_FLOAT:
> -      params[0] = IROUND(((GLfloat *) p)[0]);
> +      params[0] = lroundf(((GLfloat *) p)[0]);
>        break;
>  
>     case TYPE_FLOATN_4:
> @@ -1720,13 +1721,13 @@ _mesa_GetInteger64v(GLenum pname, GLint64 *params)
>        break;
>  
>     case TYPE_FLOAT_4:
> -      params[3] = IROUND64(((GLfloat *) p)[3]);
> +      params[3] = llroundf(((GLfloat *) p)[3]);
>     case TYPE_FLOAT_3:
> -      params[2] = IROUND64(((GLfloat *) p)[2]);
> +      params[2] = llroundf(((GLfloat *) p)[2]);
>     case TYPE_FLOAT_2:
> -      params[1] = IROUND64(((GLfloat *) p)[1]);
> +      params[1] = llroundf(((GLfloat *) p)[1]);
>     case TYPE_FLOAT:
> -      params[0] = IROUND64(((GLfloat *) p)[0]);
> +      params[0] = llroundf(((GLfloat *) p)[0]);
>        break;
>  
>     case TYPE_FLOATN_4:
> @@ -2332,22 +2333,22 @@ _mesa_GetIntegeri_v( GLenum pname, GLuint index, GLint *params )
>     switch (type) {
>     case TYPE_FLOAT_4:
>     case TYPE_FLOATN_4:
> -      params[3] = IROUND(v.value_float_4[3]);
> +      params[3] = lroundf(v.value_float_4[3]);
>     case TYPE_FLOAT_3:
>     case TYPE_FLOATN_3:
> -      params[2] = IROUND(v.value_float_4[2]);
> +      params[2] = lroundf(v.value_float_4[2]);
>     case TYPE_FLOAT_2:
>     case TYPE_FLOATN_2:
> -      params[1] = IROUND(v.value_float_4[1]);
> +      params[1] = lroundf(v.value_float_4[1]);
>     case TYPE_FLOAT:
>     case TYPE_FLOATN:
> -      params[0] = IROUND(v.value_float_4[0]);
> +      params[0] = lroundf(v.value_float_4[0]);
>        break;
>  
>     case TYPE_DOUBLEN_2:
> -      params[1] = IROUND(v.value_double_2[1]);
> +      params[1] = lround(v.value_double_2[1]);
>     case TYPE_DOUBLEN:
> -      params[0] = IROUND(v.value_double_2[0]);
> +      params[0] = lround(v.value_double_2[0]);
>        break;
>  
>     case TYPE_INT:
> diff --git a/src/mesa/main/imports.h b/src/mesa/main/imports.h
> index d96d666..5ed83e9 100644
> --- a/src/mesa/main/imports.h
> +++ b/src/mesa/main/imports.h
> @@ -141,31 +141,6 @@ static inline GLfloat LOG2(GLfloat x)
>  
>  
>  /**
> - * Convert float to int by rounding to nearest integer, away from zero.
> - */
> -static inline int IROUND(float f)
> -{
> -   return (int) ((f >= 0.0F) ? (f + 0.5F) : (f - 0.5F));
> -}
> -
> -/**
> - * Convert double to int by rounding to nearest integer, away from zero.
> - */
> -static inline int IROUNDD(double d)
> -{
> -   return (int) ((d >= 0.0) ? (d + 0.5) : (d - 0.5));
> -}
> -
> -/**
> - * Convert float to int64 by rounding to nearest integer.
> - */
> -static inline GLint64 IROUND64(float f)
> -{
> -   return (GLint64) ((f >= 0.0F) ? (f + 0.5F) : (f - 0.5F));
> -}
> -
> -
> -/**
>   * Convert positive float to int by rounding to nearest integer.
>   */
>  static inline int IROUND_POS(float f)
> diff --git a/src/mesa/main/light.c b/src/mesa/main/light.c
> index 4a8dee3..f17b67f 100644
> --- a/src/mesa/main/light.c
> +++ b/src/mesa/main/light.c
> @@ -34,6 +34,7 @@
>  #include "util/simple_list.h"
>  #include "mtypes.h"
>  #include "math/m_matrix.h"
> +#include "util/rounding.h"
>  
>  
>  void GLAPIENTRY
> @@ -840,12 +841,12 @@ _mesa_GetMaterialiv( GLenum face, GLenum pname, GLint *params )
>           params[3] = FLOAT_TO_INT( mat[MAT_ATTRIB_EMISSION(f)][3] );
>  	 break;
>        case GL_SHININESS:
> -         *params = IROUND( mat[MAT_ATTRIB_SHININESS(f)][0] );
> +         *params = lroundf( mat[MAT_ATTRIB_SHININESS(f)][0] );
>  	 break;
>        case GL_COLOR_INDEXES:
> -	 params[0] = IROUND( mat[MAT_ATTRIB_INDEXES(f)][0] );
> -	 params[1] = IROUND( mat[MAT_ATTRIB_INDEXES(f)][1] );
> -	 params[2] = IROUND( mat[MAT_ATTRIB_INDEXES(f)][2] );
> +	 params[0] = lroundf( mat[MAT_ATTRIB_INDEXES(f)][0] );
> +	 params[1] = lroundf( mat[MAT_ATTRIB_INDEXES(f)][1] );
> +	 params[2] = lroundf( mat[MAT_ATTRIB_INDEXES(f)][2] );
>  	 break;
>        default:
>           _mesa_error( ctx, GL_INVALID_ENUM, "glGetMaterialfv(pname)" );
> diff --git a/src/mesa/main/pixel.c b/src/mesa/main/pixel.c
> index 608a545..47c7f50 100644
> --- a/src/mesa/main/pixel.c
> +++ b/src/mesa/main/pixel.c
> @@ -114,7 +114,7 @@ store_pixelmap(struct gl_context *ctx, GLenum map, GLsizei mapsize,
>        /* special case */
>        ctx->PixelMaps.StoS.Size = mapsize;
>        for (i = 0; i < mapsize; i++) {
> -         ctx->PixelMaps.StoS.Map[i] = (GLfloat)IROUND(values[i]);
> +         ctx->PixelMaps.StoS.Map[i] = roundf(values[i]);
>        }
>        break;
>     case GL_PIXEL_MAP_I_TO_I:
> diff --git a/src/mesa/main/pixelstore.c b/src/mesa/main/pixelstore.c
> index fc81533..f74d0ee 100644
> --- a/src/mesa/main/pixelstore.c
> +++ b/src/mesa/main/pixelstore.c
> @@ -33,6 +33,7 @@
>  #include "context.h"
>  #include "pixelstore.h"
>  #include "mtypes.h"
> +#include "util/rounding.h"
>  
>  
>  void GLAPIENTRY
> @@ -223,7 +224,7 @@ invalid_value_error:
>  void GLAPIENTRY
>  _mesa_PixelStoref( GLenum pname, GLfloat param )
>  {
> -   _mesa_PixelStorei( pname, IROUND(param) );
> +   _mesa_PixelStorei( pname, lroundf(param) );
>  }
>  
>  
> diff --git a/src/mesa/main/samplerobj.c b/src/mesa/main/samplerobj.c
> index 14f2b45..bc6d5b7 100644
> --- a/src/mesa/main/samplerobj.c
> +++ b/src/mesa/main/samplerobj.c
> @@ -1390,19 +1390,19 @@ _mesa_GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
>        /* GL spec 'Data Conversions' section specifies that floating-point
>         * value in integer Get function is rounded to nearest integer
>         */
> -      *params = IROUND(sampObj->MinLod);
> +      *params = lroundf(sampObj->MinLod);
>        break;
>     case GL_TEXTURE_MAX_LOD:
>        /* GL spec 'Data Conversions' section specifies that floating-point
>         * value in integer Get function is rounded to nearest integer
>         */
> -      *params = IROUND(sampObj->MaxLod);
> +      *params = lroundf(sampObj->MaxLod);
>        break;
>     case GL_TEXTURE_LOD_BIAS:
>        /* GL spec 'Data Conversions' section specifies that floating-point
>         * value in integer Get function is rounded to nearest integer
>         */
> -      *params = IROUND(sampObj->LodBias);
> +      *params = lroundf(sampObj->LodBias);
>        break;
>     case GL_TEXTURE_COMPARE_MODE:
>        *params = sampObj->CompareMode;
> @@ -1414,7 +1414,7 @@ _mesa_GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
>        /* GL spec 'Data Conversions' section specifies that floating-point
>         * value in integer Get function is rounded to nearest integer
>         */
> -      *params = IROUND(sampObj->MaxAnisotropy);
> +      *params = lroundf(sampObj->MaxAnisotropy);
>        break;
>     case GL_TEXTURE_BORDER_COLOR:
>        params[0] = FLOAT_TO_INT(sampObj->BorderColor.f[0]);
> diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c
> index ba83f8f..91bc5ab 100644
> --- a/src/mesa/main/texparam.c
> +++ b/src/mesa/main/texparam.c
> @@ -2055,7 +2055,7 @@ get_tex_parameteriv(struct gl_context *ctx,
>           /* GL spec 'Data Conversions' section specifies that floating-point
>            * value in integer Get function is rounded to nearest integer
>            */
> -         *params = IROUND(obj->Sampler.MinLod);
> +         *params = lroundf(obj->Sampler.MinLod);
>           break;
>        case GL_TEXTURE_MAX_LOD:
>           if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
> @@ -2063,7 +2063,7 @@ get_tex_parameteriv(struct gl_context *ctx,
>           /* GL spec 'Data Conversions' section specifies that floating-point
>            * value in integer Get function is rounded to nearest integer
>            */
> -         *params = IROUND(obj->Sampler.MaxLod);
> +         *params = lroundf(obj->Sampler.MaxLod);
>           break;
>        case GL_TEXTURE_BASE_LEVEL:
>           if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
> @@ -2080,7 +2080,7 @@ get_tex_parameteriv(struct gl_context *ctx,
>           /* GL spec 'Data Conversions' section specifies that floating-point
>            * value in integer Get function is rounded to nearest integer
>            */
> -         *params = IROUND(obj->Sampler.MaxAnisotropy);
> +         *params = lroundf(obj->Sampler.MaxAnisotropy);
>           break;
>        case GL_GENERATE_MIPMAP_SGIS:
>           if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
> @@ -2118,7 +2118,7 @@ get_tex_parameteriv(struct gl_context *ctx,
>           /* GL spec 'Data Conversions' section specifies that floating-point
>            * value in integer Get function is rounded to nearest integer
>            */
> -         *params = IROUND(obj->Sampler.LodBias);
> +         *params = lroundf(obj->Sampler.LodBias);
>           break;
>        case GL_TEXTURE_CROP_RECT_OES:
>           if (ctx->API != API_OPENGLES || !ctx->Extensions.OES_draw_texture)
> diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
> index 997b0cb..cdde3a5 100644
> --- a/src/mesa/main/uniform_query.cpp
> +++ b/src/mesa/main/uniform_query.cpp
> @@ -431,13 +431,13 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location,
>  		   *      a floating-point value is rounded to the
>  		   *      nearest integer..."
>  		   */
> -		  dst[didx].i = IROUND(src[sidx].f);
> +		  dst[didx].i = lroundf(src[sidx].f);
>  		  break;
>  	       case GLSL_TYPE_BOOL:
>  		  dst[didx].i = src[sidx].i ? 1 : 0;
>  		  break;
>  	       case GLSL_TYPE_DOUBLE:
> -		  dst[didx].i = IROUNDD(*(double *)&src[sidx].f);
> +		  dst[didx].i = lround(*(double *)&src[sidx].f);
>  		  break;
>  	       default:
>  		  assert(!"Should not get here.");
> diff --git a/src/mesa/swrast/s_blit.c b/src/mesa/swrast/s_blit.c
> index 3e838a4..e960f4a 100644
> --- a/src/mesa/swrast/s_blit.c
> +++ b/src/mesa/swrast/s_blit.c
> @@ -31,6 +31,7 @@
>  #include "main/format_pack.h"
>  #include "main/condrender.h"
>  #include "s_context.h"
> +#include "util/rounding.h"
>  
>  
>  #define ABS(X)   ((X) < 0 ? -(X) : (X))
> @@ -296,7 +297,7 @@ blit_nearest(struct gl_context *ctx,
>  
>        for (dstRow = 0; dstRow < dstHeight; dstRow++) {
>           GLfloat srcRowF = (dstRow + 0.5F) / dstHeight * srcHeight - 0.5F;
> -         GLint srcRow = IROUND(srcRowF);
> +         GLint srcRow = lroundf(srcRowF);
>           GLubyte *dstRowStart = dstMap + dstRowStride * dstRow;
>  
>           assert(srcRow >= 0);
> diff --git a/src/mesa/swrast/s_context.h b/src/mesa/swrast/s_context.h
> index 7cf0e30..003bb29 100644
> --- a/src/mesa/swrast/s_context.h
> +++ b/src/mesa/swrast/s_context.h
> @@ -50,6 +50,7 @@
>  #include "swrast.h"
>  #include "s_fragprog.h"
>  #include "s_span.h"
> +#include "util/rounding.h"
>  
>  
>  typedef void (*texture_sample_func)(struct gl_context *ctx,
> @@ -434,7 +435,7 @@ _swrast_unmap_renderbuffers(struct gl_context *ctx);
>  #define FIXED_EPSILON   1
>  #define FIXED_SCALE     ((float) FIXED_ONE)
>  #define FIXED_DBL_SCALE ((double) FIXED_ONE)
> -#define FloatToFixed(X) (IROUND((X) * FIXED_SCALE))
> +#define FloatToFixed(X) (lroundf((X) * FIXED_SCALE))
>  #define FixedToDouble(X) ((X) * (1.0 / FIXED_DBL_SCALE))
>  #define IntToFixed(I)   ((I) << FIXED_SHIFT)
>  #define FixedToInt(X)   ((X) >> FIXED_SHIFT)
> 



More information about the mesa-dev mailing list