[Mesa-dev] [PATCH] mesa: Clamp GetUniformuiv values to be >= 0.
Antía Puentes
apuentes at igalia.com
Thu Feb 16 19:24:26 UTC 2017
On lun, 2016-12-12 at 10:43 +0100, Nicolai Hähnle wrote:
> On 12.12.2016 00:25, Kenneth Graunke wrote:
> >
> > Section 2.2.2 (Data Conversions For State Query Commands) of the
> > OpenGL 4.5 October 24th 2016 specification says:
> >
> > "If a command returning unsigned integer data is called, such as
> > GetSamplerParameterIuiv, negative values are clamped to zero."
> >
> > Fixes GL44-CTS.gpu_shader_fp64.state_query.
> >
> > Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> > ---
> > src/mesa/main/uniform_query.cpp | 48
> > +++++++++++++++++++++++++++++++++--------
> > 1 file changed, 39 insertions(+), 9 deletions(-)
> >
> > Hey Nicolai,
> >
> > I wrote a similar patch a while back, but never got around to
> > sending it,
> > since I realized that the gl45release branch expects our current
> > behavior,
> > and the change to make the CTS expect clamping is only on the
> > master branch.
> >
> > Apparently I made some additional changes, compared to yours. I
> > figured
> > I'd send this along and let you see if you think any of my extra
> > changes
> > are still necessary. If so, feel free to fold them into your
> > patch.
> >
> > I also think we need to fix several other glGet* commands...it's
> > just that
> > this is the only one currently tested. A bunch work because the
> > values
> > returned can't be negative.
> I think your patch is a strict superset of what mine does and should
> be
> used instead. I do have one comment below, with that fixed it has my
> R-b.
This patch was never pushed, was it? and GL45-CTS.gpu_shader_fp64.state_query
fails in the new vk-gl-cts repository because it expects these negative
values to be clamped.
> There is the more general question of how to cope with those cases
> where
> the CTS requires non-standard behavior. I think we should insist on
> doing the right thing in Mesa, and push for changes to the CTS.
>
> Until quite recently, I've been occupied by radeonsi- and
> Gallium-specific bugs, but that's changing and I'm looking into
> using
> CTS master rather than back-porting fixes to the dead gl45release
> branch
> (hence this patch).
>
> >
> >
> > --Ken
> >
> > diff --git a/src/mesa/main/uniform_query.cpp
> > b/src/mesa/main/uniform_query.cpp
> > index db700df..f05a29f 100644
> > --- a/src/mesa/main/uniform_query.cpp
> > +++ b/src/mesa/main/uniform_query.cpp
> > @@ -347,14 +347,10 @@ _mesa_get_uniform(struct gl_context *ctx,
> > GLuint program, GLint location,
> > * just memcpy the data. If the types are not compatible,
> > perform a
> > * slower convert-and-copy process.
> > */
> > - if (returnType == uni->type->base_type
> > - || ((returnType == GLSL_TYPE_INT
> > - || returnType == GLSL_TYPE_UINT)
> > - &&
> > - (uni->type->base_type == GLSL_TYPE_INT
> > - || uni->type->base_type == GLSL_TYPE_UINT
> > - || uni->type->base_type == GLSL_TYPE_SAMPLER
> > - || uni->type->base_type == GLSL_TYPE_IMAGE))) {
> > + if (returnType == uni->type->base_type ||
> > + ((returnType == GLSL_TYPE_INT || returnType ==
> > GLSL_TYPE_UINT) &&
> > + (uni->type->base_type == GLSL_TYPE_SAMPLER ||
> > + uni->type->base_type == GLSL_TYPE_IMAGE))) {
> > memcpy(paramsOut, src, bytes);
> > } else {
> > union gl_constant_value *const dst =
> > @@ -422,7 +418,6 @@ _mesa_get_uniform(struct gl_context *ctx,
> > GLuint program, GLint location,
> > }
> > break;
> > case GLSL_TYPE_INT:
> > - case GLSL_TYPE_UINT:
> > switch (uni->type->base_type) {
> > case GLSL_TYPE_FLOAT:
> > /* While the GL 3.2 core spec doesn't explicitly
> > @@ -447,6 +442,9 @@ _mesa_get_uniform(struct gl_context *ctx,
> > GLuint program, GLint location,
> > case GLSL_TYPE_BOOL:
> > dst[didx].i = src[sidx].i ? 1 : 0;
> > break;
> > + case GLSL_TYPE_UINT:
> > + dst[didx].i = src[sidx].i;
> I think this should be
>
> dst[didx].i = MIN2(src[sidx].u, INT_MAX);
>
> Cheers,
> Nicolai
>
> >
> > + break;
> > case GLSL_TYPE_DOUBLE: {
> > double tmp;
> > memcpy(&tmp, &src[sidx].f, sizeof(tmp));
> > @@ -458,6 +456,38 @@ _mesa_get_uniform(struct gl_context *ctx,
> > GLuint program, GLint location,
> > break;
> > }
> > break;
> > + case GLSL_TYPE_UINT:
> > + switch (uni->type->base_type) {
> > + case GLSL_TYPE_FLOAT:
> > + /* The spec isn't terribly clear how to handle
> > negative
> > + * values with an unsigned return type.
> > + *
> > + * GL 4.5 section 2.2.2 ("Data Conversions for
> > State
> > + * Query Commands") says:
> > + *
> > + * "If a value is so large in magnitude that it
> > cannot be
> > + * represented by the returned data type, then
> > the nearest
> > + * value representable using the requested type
> > is
> > + * returned."
> > + */
> > + dst[didx].i = src[sidx].f < 0.0f ? 0 :
> > IROUND(src[sidx].f);
> > + break;
> > + case GLSL_TYPE_BOOL:
> > + dst[didx].i = src[sidx].i ? 1 : 0;
> > + break;
> > + case GLSL_TYPE_INT:
> > + dst[didx].i = MAX2(src[sidx].i, 0);
> > + break;
> > + case GLSL_TYPE_DOUBLE: {
> > + double tmp;
> > + memcpy(&tmp, &src[sidx].f, sizeof(tmp));
> > + dst[didx].i = tmp < 0.0 ? 0 : IROUNDD(tmp);
> > + break;
> > + }
> > + default:
> > + unreachable("invalid uniform type");
> > + }
> > + break;
> >
> > default:
> > assert(!"Should not get here.");
> >
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list