mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 04:20:08 +01:00
mesa: Follow OpenGL conversion rules for values that exceed storage size
Section 2.2.2 (Data Conversions For State Query Commands) of the
OpenGL 4.5 spec says:
Following these steps, if a value is so large in magnitude that
it cannot be represented by the returned data type, then the
nearest value representable using that type is returned.
The current code doesn't do the correct thing, because it truncates a
long (potentially a 64bit values) to an int.
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/2828
Fixes: 53c36dfcfe
("replace IROUND with util functions")
Reviewed-by: Matt Turner <mattst88@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4673>
This commit is contained in:
parent
76c5688018
commit
35ee6b3d36
1 changed files with 33 additions and 4 deletions
|
|
@ -45,6 +45,7 @@
|
|||
#include "main/teximage.h"
|
||||
#include "main/texstate.h"
|
||||
#include "program/prog_instruction.h"
|
||||
#include "util/u_math.h"
|
||||
|
||||
|
||||
/**
|
||||
|
|
@ -2423,16 +2424,30 @@ get_tex_parameteriv(struct gl_context *ctx,
|
|||
goto invalid_pname;
|
||||
/* GL spec 'Data Conversions' section specifies that floating-point
|
||||
* value in integer Get function is rounded to nearest integer
|
||||
*
|
||||
* Section 2.2.2 (Data Conversions For State Query Commands) of the
|
||||
* OpenGL 4.5 spec says:
|
||||
*
|
||||
* Following these steps, if a value is so large in magnitude that
|
||||
* it cannot be represented by the returned data type, then the
|
||||
* nearest value representable using that type is returned.
|
||||
*/
|
||||
*params = lroundf(obj->Sampler.MinLod);
|
||||
*params = CLAMP(lroundf(obj->Sampler.MinLod), INT_MIN, INT_MAX);
|
||||
break;
|
||||
case GL_TEXTURE_MAX_LOD:
|
||||
if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
|
||||
goto invalid_pname;
|
||||
/* GL spec 'Data Conversions' section specifies that floating-point
|
||||
* value in integer Get function is rounded to nearest integer
|
||||
*
|
||||
* Section 2.2.2 (Data Conversions For State Query Commands) of the
|
||||
* OpenGL 4.5 spec says:
|
||||
*
|
||||
* Following these steps, if a value is so large in magnitude that
|
||||
* it cannot be represented by the returned data type, then the
|
||||
* nearest value representable using that type is returned.
|
||||
*/
|
||||
*params = lroundf(obj->Sampler.MaxLod);
|
||||
*params = CLAMP(lroundf(obj->Sampler.MaxLod), INT_MIN, INT_MAX);
|
||||
break;
|
||||
case GL_TEXTURE_BASE_LEVEL:
|
||||
if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
|
||||
|
|
@ -2448,8 +2463,15 @@ get_tex_parameteriv(struct gl_context *ctx,
|
|||
goto invalid_pname;
|
||||
/* GL spec 'Data Conversions' section specifies that floating-point
|
||||
* value in integer Get function is rounded to nearest integer
|
||||
*
|
||||
* Section 2.2.2 (Data Conversions For State Query Commands) of the
|
||||
* OpenGL 4.5 spec says:
|
||||
*
|
||||
* Following these steps, if a value is so large in magnitude that
|
||||
* it cannot be represented by the returned data type, then the
|
||||
* nearest value representable using that type is returned.
|
||||
*/
|
||||
*params = lroundf(obj->Sampler.MaxAnisotropy);
|
||||
*params = CLAMP(lroundf(obj->Sampler.MaxAnisotropy), INT_MIN, INT_MAX);
|
||||
break;
|
||||
case GL_GENERATE_MIPMAP_SGIS:
|
||||
if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
|
||||
|
|
@ -2486,8 +2508,15 @@ 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
|
||||
*
|
||||
* Section 2.2.2 (Data Conversions For State Query Commands) of the
|
||||
* OpenGL 4.5 spec says:
|
||||
*
|
||||
* Following these steps, if a value is so large in magnitude that
|
||||
* it cannot be represented by the returned data type, then the
|
||||
* nearest value representable using that type is returned.
|
||||
*/
|
||||
*params = lroundf(obj->Sampler.LodBias);
|
||||
*params = CLAMP(lroundf(obj->Sampler.LodBias), INT_MIN, INT_MAX);
|
||||
break;
|
||||
case GL_TEXTURE_CROP_RECT_OES:
|
||||
if (ctx->API != API_OPENGLES || !ctx->Extensions.OES_draw_texture)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue