[Mesa-dev] [PATCH 5/6] mesa: Add conversion from double to uint64/int64 in GetUniform*i64v()

Iago Toral itoral at igalia.com
Mon May 15 11:29:14 UTC 2017


On Fri, 2017-05-12 at 10:36 +0200, Nicolai Hähnle wrote:
> On 11.05.2017 13:10, Iago Toral Quiroga wrote:
> > ---
> >  src/mesa/main/uniform_query.cpp | 14 ++++++++++++++
> >  1 file changed, 14 insertions(+)
> > 
> > diff --git a/src/mesa/main/uniform_query.cpp
> > b/src/mesa/main/uniform_query.cpp
> > index 42abd18..25acc31 100644
> > --- a/src/mesa/main/uniform_query.cpp
> > +++ b/src/mesa/main/uniform_query.cpp
> > @@ -579,6 +579,13 @@ _mesa_get_uniform(struct gl_context *ctx,
> > GLuint program, GLint location,
> >                    memcpy(&dst[didx].u, &tmp, sizeof(tmp));
> >                    break;
> >                 }
> > +               case GLSL_TYPE_DOUBLE: {
> > +                  double d;
> > +                  memcpy(&d, &src[sidx].f, sizeof(d));
> > +                  int64_t tmp = IROUNDD64(d);
> > +                  memcpy(&dst[didx].u, &tmp, sizeof(tmp));
> > +                  break;
> > +               }
> >                 default:
> >                    assert(!"Should not get here.");
> >                    break;
> > @@ -616,6 +623,13 @@ _mesa_get_uniform(struct gl_context *ctx,
> > GLuint program, GLint location,
> >                    memcpy(&dst[didx].u, &tmp, sizeof(tmp));
> >                    break;
> >                 }
> > +               case GLSL_TYPE_DOUBLE: {
> > +                  double d;
> > +                  memcpy(&d, &src[sidx].f, sizeof(d));
> > +                  uint64_t tmp = (d < 0.0) ? 0 : IROUNDD64(d);
> 
> This needs to use an unsigned rounding function, doesn't it?

Good question... the existing code seems to assume otherwise, since
there are only signed IROUND*() macros and conversions from
float/double to unsigned are currently using these. As far as I know,
casts between signed and unsigned integers are not supposed to alter
the bit-level representation, so I believe this should be fine?

> Cheers,
> Nicolai
> 
> 
> > +                  memcpy(&dst[didx].u, &tmp, sizeof(tmp));
> > +                  break;
> > +               }
> >                 default:
> >                    assert(!"Should not get here.");
> >                    break;
> > 
> 
> 


More information about the mesa-dev mailing list