[Mesa-dev] [PATCH 7/7] mesa: Replace uses of IROUND{, 64} with libm functions.
Brian Paul
brian.e.paul at gmail.com
Sat Aug 1 09:27:33 PDT 2015
I don't remember the specifics, but I recall some of the old conformance
tests being sensitive to float->int conversion in a few areas. Matt, if
you have access to the conform tests and can run the old swrast driver with
your change, that'd be interesting.
-Brian
On Fri, Jul 31, 2015 at 7:52 PM, Roland Scheidegger <sroland at vmware.com>
wrote:
> I have some doubts of this. Given that IROUND was just plain incorrect,
> I think we should just use _mesa_lroundevenf() and see what happens.
> lroundf() is quite the shocker, my libm's implementation is totalling 40
> instructions (!) for it (not counting the last return, vs 1 for lrintf).
> Now it's probably not THAT bad (not all these 40 instructions will be
> executed), it still looks expensive (and gcc won't attempt to use a
> built-in for that mess, quite understandable).
> I don't see GL mentioning requiring such explicit rounding in general
> (though for instance the EXT_texture_shared_exponent does this
> implicitly, albeit I'm wondering if that was by choice or accident...).
> Different tie breaker (which we'd get with lrintf) sounds like a win
> over just bogus rounding (which we got before) any day to me.
>
> Roland
>
>
> Am 01.08.2015 um 01:26 schrieb Matt Turner:
> > lroundf is the most common replacement. I replaced uses of IROUND()
> > where there was a comment saying "rounded to nearest integer" with
> > _mesa_lroundevenf.
> >
> > IROUND64 is replaced with llroundf.
> > ---
> > src/mesa/main/drawpix.c | 21 +++++++++++----------
> > src/mesa/main/eval.c | 14 +++++++-------
> > src/mesa/main/get.c | 28 ++++++++++++++--------------
> > src/mesa/main/imports.h | 18 ------------------
> > src/mesa/main/light.c | 8 ++++----
> > 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 | 2 +-
> > src/mesa/swrast/s_blit.c | 2 +-
> > src/mesa/swrast/s_context.h | 2 +-
> > 12 files changed, 50 insertions(+), 66 deletions(-)
> >
> > diff --git a/src/mesa/main/drawpix.c b/src/mesa/main/drawpix.c
> > index 720a082..025cf7e 100644
> > --- a/src/mesa/main/drawpix.c
> > +++ b/src/mesa/main/drawpix.c
> > @@ -22,6 +22,7 @@
> > * OTHER DEALINGS IN THE SOFTWARE.
> > */
> >
> > +#include "c99_math.h"
> > #include "glheader.h"
> > #include "imports.h"
> > #include "bufferobj.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..b21a90d 100644
> > --- a/src/mesa/main/eval.c
> > +++ b/src/mesa/main/eval.c
> > @@ -704,7 +704,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 +728,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 307a5ff..5e6cd9b 100644
> > --- a/src/mesa/main/get.c
> > +++ b/src/mesa/main/get.c
> > @@ -1527,13 +1527,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:
> > @@ -1621,13 +1621,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:
> > @@ -2110,22 +2110,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 d61279a..1d4b9c1 100644
> > --- a/src/mesa/main/imports.h
> > +++ b/src/mesa/main/imports.h
> > @@ -144,24 +144,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 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 14b4b04..2c2e3af 100644
> > --- a/src/mesa/main/light.c
> > +++ b/src/mesa/main/light.c
> > @@ -850,12 +850,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..e691c01 100644
> > --- a/src/mesa/main/pixelstore.c
> > +++ b/src/mesa/main/pixelstore.c
> > @@ -28,6 +28,7 @@
> > */
> >
> >
> > +#include "c99_math.h"
> > #include "glheader.h"
> > #include "bufferobj.h"
> > #include "context.h"
> > @@ -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 32180fb1..9b16e78 100644
> > --- a/src/mesa/main/samplerobj.c
> > +++ b/src/mesa/main/samplerobj.c
> > @@ -1327,19 +1327,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 = _mesa_lroundevenf(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 = _mesa_lroundevenf(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 = _mesa_lroundevenf(sampObj->LodBias);
> > break;
> > case GL_TEXTURE_COMPARE_MODE:
> > if (!ctx->Extensions.ARB_shadow)
> > @@ -1355,7 +1355,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 = _mesa_lroundevenf(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 88c2c14..518d031 100644
> > --- a/src/mesa/main/texparam.c
> > +++ b/src/mesa/main/texparam.c
> > @@ -1959,7 +1959,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 = _mesa_lroundevenf(obj->Sampler.MinLod);
> > break;
> > case GL_TEXTURE_MAX_LOD:
> > if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
> > @@ -1967,7 +1967,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 = _mesa_lroundevenf(obj->Sampler.MaxLod);
> > break;
> > case GL_TEXTURE_BASE_LEVEL:
> > if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
> > @@ -1984,7 +1984,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 = _mesa_lroundevenf(obj->Sampler.MaxAnisotropy);
> > break;
> > case GL_GENERATE_MIPMAP_SGIS:
> > if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
> > @@ -2022,7 +2022,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 = _mesa_lroundevenf(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 036530e..60d9d81 100644
> > --- a/src/mesa/main/uniform_query.cpp
> > +++ b/src/mesa/main/uniform_query.cpp
> > @@ -407,7 +407,7 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint
> program, GLint location,
> > * a floating-point value is rounded to the
> > * nearest integer..."
> > */
> > - dst[i].i = IROUND(src[i].f);
> > + dst[i].i = _mesa_lroundevenf(src[i].f);
> > break;
> > case GLSL_TYPE_BOOL:
> > dst[i].i = src[i].i ? 1 : 0;
> > diff --git a/src/mesa/swrast/s_blit.c b/src/mesa/swrast/s_blit.c
> > index 3e838a4..b0339f5 100644
> > --- a/src/mesa/swrast/s_blit.c
> > +++ b/src/mesa/swrast/s_blit.c
> > @@ -296,7 +296,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..15ece26 100644
> > --- a/src/mesa/swrast/s_context.h
> > +++ b/src/mesa/swrast/s_context.h
> > @@ -434,7 +434,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)
> >
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150801/01eeea7e/attachment-0001.html>
More information about the mesa-dev
mailing list