[Piglit] [PATCH] util: Wrappers to load hex values for floats

Alejandro Piñeiro apinheiro at igalia.com
Mon May 2 09:11:39 UTC 2016


Reviewed-by: Alejandro Piñeiro <apinheiro at igalia.com>

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 <agomez at igalia.com>
> ---
>  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;



More information about the Piglit mailing list