From: Timothy Arceri <timothy.arc...@collabora.com>

This allows data to be set for matrix attributes in shader runner.

For example to set colunm 2 of mat2x3:
attname/float/3/1

v2 (changes made by Alejandro in behalf of Timothy Arceri):
 * Fix matrix_index, as was wrongly being substracted by 1 (so for
   column 0, matrix index was -1)
 * Document matrix support at the header

Signed-off-by: Alejandro Piñeiro <apinhe...@igalia.com>
---
 tests/util/piglit-vbo.cpp | 63 +++++++++++++++++++++++++++++++++++------------
 1 file changed, 47 insertions(+), 16 deletions(-)

diff --git a/tests/util/piglit-vbo.cpp b/tests/util/piglit-vbo.cpp
index 6453d40..6d94194 100644
--- a/tests/util/piglit-vbo.cpp
+++ b/tests/util/piglit-vbo.cpp
@@ -36,10 +36,20 @@
  *
  * The format consists of a row of column headers followed by any
  * number of rows of data.  Each column header has the form
- * "ATTRNAME/TYPE/COUNT", where ATTRNAME is the name of the vertex
- * attribute to be bound to this column, TYPE is the type of data that
- * follows ("float", "int", or "uint"), and COUNT is the vector length
- * of the data (e.g. "3" for vec3 data).
+ * "ATTRNAME/TYPE/COUNT/MATRIX_COLUMN", where ATTRNAME is the name of
+ * the vertex attribute to be bound to this column, TYPE is the type
+ * of data that follows ("float", "int", or "uint"), COUNT is the
+ * vector length of the data (e.g. "3" for vec3 data) and
+ * MATRIX_COLUMN is the column number of the data in case of being a
+ * matrix. MATRIX_COLUMN doesn't need to be be specified if it is not
+ * a matrix column as in the example before. So another example, if
+ * you want to specify the data of a mat2x3:
+ *
+ *  \verbatim
+ *  foomatrix/float/3/0 foomatrix/float/3/1
+ *  0.0 1.0 2.0         3.0 4.0 5.0
+ *  6.0 7.0 8.0         9.0 10.0 11.0
+ *  \endverbatim
  *
  * The data follows the column headers in space-separated form.  "#"
  * can be used for comments, as in shell scripts.
@@ -52,8 +62,8 @@
  * If an error occurs, setup_vbo_from_text() will print out a
  * description of the error and exit with PIGLIT_FAIL.
  *
- * For the example above, the call to setup_vbo_from_text() is roughly
- * equivalent to the following GL operations:
+ * For the first example above, the call to setup_vbo_from_text() is
+ * roughly equivalent to the following GL operations:
  *
  * \code
  * struct vertex_attributes {
@@ -151,6 +161,11 @@ public:
        size_t count;
 
        /**
+        * Index of the matrix column for this attribute.
+        */
+       size_t matrix_index;
+
+       /**
         * Index of this vertex attribute in the linked program.
         */
        GLuint index;
@@ -171,7 +186,8 @@ vertex_attrib_description::vertex_attrib_description(GLuint 
prog,
        /* Split the column header into name/type/count fields */
        const char *first_slash = strchr(text, '/');
        if (first_slash == NULL) {
-               printf("Column headers must be in the form name/type/count.  "
+               printf("Column headers must be in the form 
name/type/count/matrix_column.\n"
+                      "Note: matrix_column is optional.\n"
                       "Got: %s\n",
                       text);
                piglit_report_result(PIGLIT_FAIL);
@@ -179,7 +195,7 @@ vertex_attrib_description::vertex_attrib_description(GLuint 
prog,
        std::string name(text, first_slash);
        const char *second_slash = strchr(first_slash + 1, '/');
        if (second_slash == NULL) {
-               printf("Column headers must be in the form name/type/count.  "
+               printf("Column headers must be in the form 
name/type/count/matrix_column.\n"
                       "Got: %s\n",
                       text);
                piglit_report_result(PIGLIT_FAIL);
@@ -188,11 +204,26 @@ 
vertex_attrib_description::vertex_attrib_description(GLuint prog,
        this->data_type = decode_type(type_str.c_str());
        char *endptr;
        this->count = strtoul(second_slash + 1, &endptr, 10);
+
        if (*endptr != '\0') {
-               printf("Column headers must be in the form name/type/count.  "
-                      "Got: %s\n",
-                      text);
-               piglit_report_result(PIGLIT_FAIL);
+               const char *third_slash = strchr(second_slash + 1, '/');
+               this->matrix_index = strtoul(third_slash + 1, &endptr, 10);
+
+               if (this->matrix_index < 0 || this->matrix_index > 3) {
+                       printf("Matrix column index must be between 0 and 3.  
Got: %lu\n",
+                               (unsigned long) this->matrix_index);
+                       piglit_report_result(PIGLIT_FAIL);
+               }
+
+               if (*endptr != '\0') {
+                       printf("Column headers must be in the form 
name/type/matrix_column.\n"
+                              "Note: matrix_column is optional.\n"
+                              "Got: %s\n",
+                              text);
+                       piglit_report_result(PIGLIT_FAIL);
+               }
+       } else {
+               this->matrix_index = 0;
        }
 
        GLint attrib_location = glGetAttribLocation(prog, name.c_str());
@@ -293,7 +324,7 @@ vertex_attrib_description::setup(size_t *offset, size_t 
stride) const
        int attribute_size = ATTRIBUTE_SIZE;
        switch (this->data_type) {
        case GL_FLOAT:
-               glVertexAttribPointer(this->index, this->count,
+               glVertexAttribPointer(this->index + this->matrix_index, 
this->count,
                                      this->data_type, GL_FALSE, stride,
                                      (void *) *offset);
                break;
@@ -302,7 +333,7 @@ vertex_attrib_description::setup(size_t *offset, size_t 
stride) const
                        fprintf(stderr,"vertex_attrib_description fail. no 
64-bit float support\n");
                        return;
                }
-               glVertexAttribLPointer(this->index, this->count,
+               glVertexAttribLPointer(this->index + this->matrix_index, 
this->count,
                                      this->data_type, stride,
                                      (void *) *offset);
                attribute_size *= 2;
@@ -312,12 +343,12 @@ vertex_attrib_description::setup(size_t *offset, size_t 
stride) const
                        fprintf(stderr,"vertex_attrib_description fail. no int 
support\n");
                        return;
                }
-               glVertexAttribIPointer(this->index, this->count,
+               glVertexAttribIPointer(this->index + this->matrix_index, 
this->count,
                                       this->data_type, stride,
                                       (void *) *offset);
                break;
        }
-       glEnableVertexAttribArray(index);
+       glEnableVertexAttribArray(index + this->matrix_index);
        *offset += attribute_size * this->count;
 }
 
-- 
2.5.0

_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to