[Mesa-dev] [PATCH] mesa: Correctly set base and max texture levels in glTexparameterf

Brian Paul brianp at vmware.com
Wed Jan 2 10:20:47 PST 2013


On 01/02/2013 10:39 AM, Paul Berry wrote:
> On 2 January 2013 07:38, Anuj Phogat <anuj.phogat at gmail.com
> <mailto:anuj.phogat at gmail.com>> wrote:
>
>     gles3 conformance sgis_texture_lod_basic_getter.test expects base
>     and max texture levels to be rounded to nearest integer. e.g. round
>     2.3 to 2 and 2.6 to 3. OpenGL 3.0 and OpenGL ES 3.0 specifications
>     suggest similar rounding to select level when filtering mode is
>     GL_NEAREST.
>
>     This patch makes sgis_texture_lod_basic_getter.test pass.
>
>
> It looks to me from reading the spec like this logic should be applied
> in all cases where _mesa_TexParameterf converts floats to ints, not
> just base and max texture level.  GL 4.3, section 8.10 ("Texture
> Parameters") simply says "Data conversions are performed as specified
> in section 2.2.1.", and section 2.2.1 ("Data Conversion For
> State-Setting Commands") says that "Floating-point values are rounded
> to the nearest integer."  There's no mention that this rule should
> apply only to base and max texture level.
>
> So rather than create a separate case in the switch statement to
> handle GL_TEXTURE_BASE_LEVEL and GL_TEXTURE_MAX_LEVEL, I'd recommend
> just fixing the existing case to do the rounding properly.
>
> Also, the switch statement as it exists today contains two separate
> blocks with identical code (one to handle
> GL_TEXTURE_SWIZZLE_{R,G,B,A}_EXT and one to handle all other
> float-to-int conversions).  That's silly--we should have just one block.
>
> One other comment below:
>
>
>     Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com
>     <mailto:anuj.phogat at gmail.com>>
>     ---
>       src/mesa/main/texparam.c |   24 ++++++++++++++++++++++--
>       1 files changed, 22 insertions(+), 2 deletions(-)
>
>     diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c
>     index ca5a21f..f3f97ca 100644
>     --- a/src/mesa/main/texparam.c
>     +++ b/src/mesa/main/texparam.c
>     @@ -654,8 +654,6 @@ _mesa_TexParameterf(GLenum target, GLenum
>     pname, GLfloat param)
>          case GL_TEXTURE_WRAP_S:
>          case GL_TEXTURE_WRAP_T:
>          case GL_TEXTURE_WRAP_R:
>     -   case GL_TEXTURE_BASE_LEVEL:
>     -   case GL_TEXTURE_MAX_LEVEL:
>          case GL_GENERATE_MIPMAP_SGIS:
>          case GL_TEXTURE_COMPARE_MODE_ARB:
>          case GL_TEXTURE_COMPARE_FUNC_ARB:
>     @@ -670,6 +668,28 @@ _mesa_TexParameterf(GLenum target, GLenum
>     pname, GLfloat param)
>                need_update = set_tex_parameteri(ctx, texObj, pname, p);
>             }
>             break;
>     +   case GL_TEXTURE_BASE_LEVEL:
>     +   case GL_TEXTURE_MAX_LEVEL:
>     +      {
>     +         GLint p[4];
>     +         /* Check if param exceeds maximum value an integer can
>     hold */
>     +         if (param > 2147483647.0f) {
>     +            p[0] = (GLint) 2147483647.0f;
>     +         }
>     +         else if (param < 0.0f) {
>     +            p[0] = 0;
>     +        }
>
>
> I'm not convinced that this amount of thoroughness is necessary.
> There's no language in the spec (or test cases that I'm aware of) to
> indicate that out-of-range floats need to be translated to INT_MAX or
> 0.  I think it would be adequate to just do "p[0] = (int)
> round(param);" and just let the behaviour be undefined for
> out-of-range values.
>
>     +         else {
>     +            /* Round float param to nearest integer. e.g round
>     2.3 to 2
>     +             * and 2.8 to 3.
>     +             */
>     +            p[0] = (GLint) (param + 0.5);
>     +         }
>     +
>     +        p[1] = p[2] = p[3] = 0;
>     +         need_update = set_tex_parameteri(ctx, texObj, pname, p);
>     +      }
>     +      break;
>          case GL_TEXTURE_SWIZZLE_R_EXT:
>          case GL_TEXTURE_SWIZZLE_G_EXT:
>          case GL_TEXTURE_SWIZZLE_B_EXT:
>     --

I second Paul's comments.

-Brian



More information about the mesa-dev mailing list