[Piglit] [PATCH 3/5] util: Add u/byte, u/short and half support to [vertex data]
Andres Gomez
agomez at igalia.com
Fri Jul 1 11:40:28 UTC 2016
On Wed, 2016-06-29 at 16:29 +0200, Alejandro Piñeiro wrote:
> On 14/06/16 23:36, Andres Gomez wrote:
[snip]
> > diff --git a/tests/util/piglit-vbo.cpp b/tests/util/piglit-vbo.cpp
> > index 274779f..6744b1e 100644
> > --- a/tests/util/piglit-vbo.cpp
> > +++ b/tests/util/piglit-vbo.cpp
[snip]
> > @@ -130,76 +129,136 @@
> > #include <string>
> > #include <vector>
> > #include <errno.h>
> > +#include <limits.h>
> > #include <ctype.h>
> >
> > #include "piglit-util.h"
> > #include "piglit-util-gl.h"
> > #include "piglit-vbo.h"
> >
> > +
>
> Unneeded extra space.
OK.
>
> > /**
> > - * Currently all the attribute types we support (int, uint, and
> > float)
> > - * are 4 bytes in width.
> > + * Convert a type name string to a GLenum.
> > */
> > -const int ATTRIBUTE_SIZE = 4;
> > +static bool
> > +decode_type(const char *type,
> > + GLenum *gl_type, size_t *gl_type_size, GLenum
> > *glsl_type)
> > +{
> > + assert(type);
> > + assert(gl_type);
> > + assert(gl_type_size);
> > +
> > + static struct type_table_entry {
> > + const char *type; /* NULL means end of table */
> > + GLenum gl_type;
> > + size_t gl_type_size;
> > + GLenum glsl_type;
> > + } const type_table[] = {
> > + { "byte", GL_BYTE, 1, GL_
> > INT },
> > + { "ubyte", GL_UNSIGNED_BYTE, 1, GL
> > _UNSIGNED_INT },
> > + { "short", GL_SHORT, 2, GL
> > _INT },
> > + { "ushort", GL_UNSIGNED_SHORT, 2, G
> > L_UNSIGNED_INT },
> > + { "int", GL_INT, 4, GL_I
> > NT },
> > + { "uint", GL_UNSIGNED_INT, 4, GL_
> > UNSIGNED_INT },
> > + { "half", GL_HALF_FLOAT, 2, GL_FL
> > OAT },
> > + { "float", GL_FLOAT, 4, GL
> > _FLOAT },
> > + { "double", GL_DOUBLE, 8, G
> > L_DOUBLE },
> > + { NULL, 0, 0, 0
> > },
> > + };
> > +
> > +
> > + for (int i = 0; type_table[i].type; ++i) {
> > + if (0 == strcmp(type, type_table[i].type)) {
> > + *gl_type = type_table[i].gl_type;
> > + *gl_type_size =
> > type_table[i].gl_type_size;
> > + if (glsl_type)
> > + *glsl_type =
> > type_table[i].glsl_type;
> > + return true;
> > + }
> > + }
> > +
> > + return false;
> > +}
> >
> >
> > /**
> > - * Convert a type name string to a GLenum.
> > + * Convert a GLSL type name string to its basic GLenum type.
> > */
> > -GLenum
> > -decode_type(const char *type, size_t *rows, size_t *cols)
> > +static bool
> > +decode_glsl_type(const char *type,
> > + GLenum *glsl_type, size_t *rows, size_t *cols,
> > char **endptr)
> Not sure if this is due my email-client, but that GLenum doesn't seem
> properly placed, should be at the same level that const.
Piglit uses tabs for indentation. Hence, the effect.
> > {
> > + assert(glsl_type);
> > + assert(rows);
> > + assert(cols);
> > + assert(endptr);
> > +
> > + if (isdigit(type[0])) {
> > + *rows = strtoul(type, endptr, 10);
> > + *cols = 1;
> > + *glsl_type = 0;
> > + return true;
> > + }
> > +
> > static struct type_table_entry {
> > const char *type; /* NULL means end of table */
> > - GLenum enum_value;
> > + GLenum glsl_type;
> > } const type_table[] = {
> > - { "int", GL_INT },
> > - { "uint", GL_UNSIGNED_INT },
> > - { "float", GL_FLOAT },
> > - { "double", GL_DOUBLE },
> > - { "ivec", GL_INT },
> > - { "uvec", GL_UNSIGNED_INT },
> > - { "vec", GL_FLOAT },
> > - { "dvec", GL_DOUBLE },
> > - { "mat", GL_FLOAT },
> > - { "dmat", GL_DOUBLE },
> > - { NULL, 0 }
> > + { "int", GL_INT },
> > + { "uint", GL_UNSIGNED_INT },
> > + { "float", GL_FLOAT },
> > + { "double", GL_DOUBLE },
> > + { "ivec", GL_INT },
> > + { "uvec", GL_UNSIGNED_INT },
> > + { "vec", GL_FLOAT },
> > + { "dvec", GL_DOUBLE },
> > + { "mat", GL_FLOAT },
> > + { "dmat", GL_DOUBLE },
> > + { NULL, 0 }
>
> Unless Im missing something, you didn't made any functionality-
> related
> change here, but a reformatting (more space between the string name
> and
> the GLenum). I wouldn't do that on this commit.
It is actually applying tabs instead of spaces but, yeah, I will remove
this part.
> > };
> >
> > -
> > for (int i = 0; type_table[i].type; ++i) {
> > - if (0 == strncmp(type, type_table[i].type,
> > strlen(type_table[i].type))) {
> > + const size_t type_len =
> > strlen(type_table[i].type);
> > + if (0 == strncmp(type, type_table[i].type,
> > type_len)) {
> > + *endptr = const_cast<char
> > *>(&type[type_len]);
> > +
> > /* In case of vectors or matrices, let's
> > - * calculate rows and columns, if needed.
> > + * calculate rows and columns.
> > */
> > - if (i > 3 && (rows || cols)) {
> > - size_t type_len = strlen(type);
> > - size_t the_rows = type[type_len -
> > 1] - '0';
> > - if (rows)
> > - *rows = the_rows;
> > - if (cols) {
> > - /* In case of matrices,
> > let's
> > - * calculate the columns.
> > - */
> > - if (i > 7)
> > - *cols =
> > type[type_len - 2] == 'x' ?
> > - type[type_
> > len - 3] - '0' : the_rows;
> > - else
> > - *cols = 1;
> > + if (i > 3) {
> > + if (!isdigit(**endptr))
> > + goto cleanup;
> > + *rows = **endptr - '0';
> > + ++*endptr;
> > +
> > + /* In case of matrices, let's
> > + * calculate the rows.
> > + */
> > + if (i > 7) {
> > + *cols = *rows;
> > + if (**endptr == 'x') {
> > + if
> > (!isdigit(*(++*endptr)))
> > + goto
> > cleanup;
> > + *rows = **endptr -
> > '0';
> > + ++*endptr;
> > + }
> > + } else {
> > + *cols = 1;
> > }
> > } else {
> > - if (rows)
> > - *rows = 1;
> > - if (cols)
> > - *cols = 1;
> > + *rows = 1;
> > + *cols = 1;
> > }
> > - return type_table[i].enum_value;
> > + *glsl_type = type_table[i].glsl_type;
> > + return true;
> > }
> > }
> >
> > - printf("Unrecognized type: %s\n", type);
> > - piglit_report_result(PIGLIT_FAIL);
> > - return 0;
> > +cleanup:
> > +
> Unneeded extra space.
OK.
[snip]
> > @@ -368,6 +459,15 @@ vertex_attrib_description::parse_datum(const
> > char **text, void *data) const
> > char *endptr;
> > errno = 0;
> > switch (this->data_type) {
> > + case GL_HALF_FLOAT: {
> > + unsigned short value = strtohf_hex(*text,
> > &endptr);
> > + if (errno == ERANGE) {
> > + printf("Could not parse as half float\n");
> > + return false;
> > + }
> > + *((GLhalf *) data) = value;
> > + break;
> > + }
> > case GL_FLOAT: {
> > float value = strtof_hex(*text, &endptr);
> > if (errno == ERANGE) {
> > @@ -386,6 +486,42 @@ vertex_attrib_description::parse_datum(const
> > char **text, void *data) const
> > *((GLdouble *) data) = value;
> > break;
> > }
> > + case GL_BYTE: {
> > + long value = strtol_hex(*text, &endptr);
> > + if (errno == ERANGE || value < SCHAR_MIN || value
> > > SCHAR_MAX) {
> > + printf("Could not parse as signed
> > byte\n");
> > + return false;
> > + }
> > + *((GLbyte *) data) = (GLbyte) value;
> > + break;
> > + }
> > + case GL_UNSIGNED_BYTE: {
> > + unsigned long value = strtoul(*text, &endptr, 0);
> > + if (errno == ERANGE || value > UCHAR_MAX) {
> > + printf("Could not parse as unsigned
> > byte\n");
> > + return false;
> > + }
> > + *((GLubyte *) data) = (GLubyte) value;
> > + break;
> > + }
> > + case GL_SHORT: {
> > + long value = strtol_hex(*text, &endptr);
> > + if (errno == ERANGE || value < SHRT_MIN || value >
> > SHRT_MAX) {
> > + printf("Could not parse as signed
> > short\n");
> > + return false;
> > + }
> > + *((GLshort *) data) = (GLshort) value;
> > + break;
> > + }
> > + case GL_UNSIGNED_SHORT: {
> > + unsigned long value = strtoul(*text, &endptr, 0);
> > + if (errno == ERANGE || value > USHRT_MAX) {
> > + printf("Could not parse as unsigned
> > short\n");
> > + return false;
> > + }
> > + *((GLushort *) data) = (GLushort) value;
> > + break;
> > + }
>
> Looking at GL_UNSIGNED_BYTE, GL_SHORT and GL_UNSIGNED_SHORT, I realized
> that there aren't hex wrappers like for the other types. So that means
> for some types you can use hexadecimal format but not for the others. I
> will assume that this is on purpose and that there is a good reason for
> that. But in that case, I think that it would be good to mention on the
> documentation-like comment at the beginning of the file (although it is
> true that it is already somewhat thick as it is).
The types that don't have _hex equivalent are the unsigned ones:
GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT and GL_UNSIGNED_INT.
The reason is because the original stroul function already does the
job, not that you cannot pass an hex value.
--
Br,
Andres
More information about the Piglit
mailing list