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;
-- 
2.8.0.rc3

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

Reply via email to