Reviewed-by: Alejandro Piñeiro <[email protected]>

On 25/04/16 15:53, Andres Gomez wrote:
> For some cases we want to have shaders where we load an exact bit
> pattern into a float or double. We already have this in place for
> uniforms. Now, the methods have been refactorized so they can be used in
> VBOs too.
>
> Signed-off-by: Andres Gomez <[email protected]>
> ---
>  tests/shaders/shader_runner.c | 35 +++++--------------------------
>  tests/util/piglit-util.h      | 48 
> +++++++++++++++++++++++++++++++++++++++++++
>  tests/util/piglit-vbo.cpp     |  9 ++++----
>  3 files changed, 58 insertions(+), 34 deletions(-)
>
> diff --git a/tests/shaders/shader_runner.c b/tests/shaders/shader_runner.c
> index 239735c..e0d3416 100644
> --- a/tests/shaders/shader_runner.c
> +++ b/tests/shaders/shader_runner.c
> @@ -25,6 +25,7 @@
>  #include <string.h>
>  #include <ctype.h>
>  
> +#include "piglit-util.h"
>  #include "piglit-util-gl.h"
>  #include "piglit-vbo.h"
>  
> @@ -1371,21 +1372,8 @@ get_floats(const char *line, float *f, unsigned count)
>  {
>       unsigned i;
>  
> -     for (i = 0; i < count; i++) {
> -             line = eat_whitespace(line);
> -
> -             if (strncmp(line, "0x", 2) == 0) {
> -                     union {
> -                             uint32_t u;
> -                             float f;
> -                     } x;
> -
> -                     x.u = strtoul(line, (char **) &line, 16);
> -                     f[i] = x.f;
> -             } else {
> -                     f[i] = strtod_inf(line, (char **) &line);
> -             }
> -     }
> +     for (i = 0; i < count; i++)
> +             f[i] = strtof_hex(line, (char **) &line);
>  }
>  
>  static void
> @@ -1393,21 +1381,8 @@ get_doubles(const char *line, double *d, unsigned 
> count)
>  {
>       unsigned i;
>  
> -     for (i = 0; i < count; i++) {
> -             line = eat_whitespace(line);
> -
> -             if (strncmp(line, "0x", 2) == 0) {
> -                     union {
> -                             uint64_t u64;
> -                             double d;
> -                     } x;
> -
> -                     x.u64 = strtoull(line, (char **) &line, 16);
> -                     d[i] = x.d;
> -             } else {
> -                     d[i] = strtod_inf(line, (char **) &line);
> -             }
> -     }
> +     for (i = 0; i < count; i++)
> +             d[i] = strtod_hex(line, (char **) &line);
>  }
>  
>  
> diff --git a/tests/util/piglit-util.h b/tests/util/piglit-util.h
> index 985ebbd..1e57215 100644
> --- a/tests/util/piglit-util.h
> +++ b/tests/util/piglit-util.h
> @@ -221,6 +221,54 @@ strtod_inf(const char *nptr, char **endptr)
>       return strtod(nptr, endptr);
>  }
>  
> +/**
> + * Wrapper for strtod_inf() which allows using an exact hex bit
> + * pattern to generate a float value.
> + */
> +static inline float
> +strtof_hex(const char *nptr, char **endptr)
> +{
> +     /* skip spaces and tabs */
> +     while (*nptr == ' ' || *nptr == '\t')
> +             nptr++;
> +
> +     if (strncmp(nptr, "0x", 2) == 0) {
> +             union {
> +                     uint32_t u;
> +                     float f;
> +             } x;
> +
> +             x.u = strtoul(nptr, endptr, 16);
> +             return x.f;
> +     } else {
> +             return strtod_inf(nptr, endptr);
> +     }
> +}
> +
> +/**
> + * Wrapper for strtod_inf() which allows using an exact hex bit
> + * pattern to generate a double value.
> + */
> +static inline double
> +strtod_hex(const char *nptr, char **endptr)
> +{
> +     /* skip spaces and tabs */
> +     while (*nptr == ' ' || *nptr == '\t')
> +             nptr++;
> +
> +     if (strncmp(nptr, "0x", 2) == 0) {
> +             union {
> +                     uint64_t u64;
> +                     double d;
> +             } x;
> +
> +             x.u64 = strtoull(nptr, endptr, 16);
> +             return x.d;
> +     } else {
> +             return strtod_inf(nptr, endptr);
> +     }
> +}
> +
>  #ifndef HAVE_STRCHRNUL
>  static inline char *
>  strchrnul(const char *s, int c)
> diff --git a/tests/util/piglit-vbo.cpp b/tests/util/piglit-vbo.cpp
> index 11a4adc..5147234 100644
> --- a/tests/util/piglit-vbo.cpp
> +++ b/tests/util/piglit-vbo.cpp
> @@ -102,6 +102,7 @@
>  #include <errno.h>
>  #include <ctype.h>
>  
> +#include "piglit-util.h"
>  #include "piglit-util-gl.h"
>  #include "piglit-vbo.h"
>  
> @@ -271,16 +272,16 @@ vertex_attrib_description::parse_datum(const char 
> **text, void *data) const
>       errno = 0;
>       switch (this->data_type) {
>       case GL_FLOAT: {
> -             double value = strtod(*text, &endptr);
> +             float value = strtof_hex(*text, &endptr);
>               if (errno == ERANGE) {
> -                     printf("Could not parse as double\n");
> +                     printf("Could not parse as float\n");
>                       return false;
>               }
> -             *((GLfloat *) data) = (float) value;
> +             *((GLfloat *) data) = value;
>               break;
>       }
>       case GL_DOUBLE: {
> -             double value = strtod(*text, &endptr);
> +             double value = strtod_hex(*text, &endptr);
>               if (errno == ERANGE) {
>                       printf("Could not parse as double\n");
>                       return false;

_______________________________________________
Piglit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to