glsl: Modify uniform_field_visitor::recursion to take a row_major parameter
authorIan Romanick <ian.d.romanick@intel.com>
Tue, 22 Jan 2013 03:32:07 +0000 (22:32 -0500)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 25 Jan 2013 14:07:34 +0000 (09:07 -0500)
Not used yet, but the UBO layout visitor will use this.

v2: Add some commentary as to why row_major is always set to false in
process.  Suggesed by Paul Berry.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Carl Worth <cworth@cworth.org>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/link_uniforms.cpp
src/glsl/linker.h

index c639a3d16a415f3239fab6e955ff3a11ceed8de7..c5661bb2f47e0cac20836b6f9e1aed56d5ea54b1 100644 (file)
@@ -62,10 +62,15 @@ uniform_field_visitor::process(ir_variable *var)
 {
    const glsl_type *t = var->type;
 
+   /* false is always passed for the row_major parameter to the other
+    * processing functions because no information is available to do
+    * otherwise.  See the warning in linker.h.
+    */
+
    /* Only strdup the name if we actually will need to modify it. */
    if (t->is_record() || (t->is_array() && t->fields.array->is_record())) {
       char *name = ralloc_strdup(NULL, var->name);
-      recursion(var->type, &name, strlen(name));
+      recursion(var->type, &name, strlen(name), false);
       ralloc_free(name);
    } else {
       this->visit_field(t, var->name);
@@ -74,7 +79,7 @@ uniform_field_visitor::process(ir_variable *var)
 
 void
 uniform_field_visitor::recursion(const glsl_type *t, char **name,
-                                size_t name_length)
+                                 size_t name_length, bool row_major)
 {
    /* Records need to have each field processed individually.
     *
@@ -90,7 +95,8 @@ uniform_field_visitor::recursion(const glsl_type *t, char **name,
         /* Append '.field' to the current uniform name. */
         ralloc_asprintf_rewrite_tail(name, &new_length, ".%s", field);
 
-        recursion(t->fields.structure[i].type, name, new_length);
+         recursion(t->fields.structure[i].type, name, new_length,
+                   t->fields.structure[i].row_major);
       }
    } else if (t->is_array() && t->fields.array->is_record()) {
       for (unsigned i = 0; i < t->length; i++) {
@@ -99,7 +105,8 @@ uniform_field_visitor::recursion(const glsl_type *t, char **name,
         /* Append the subscript to the current uniform name */
         ralloc_asprintf_rewrite_tail(name, &new_length, "[%u]", i);
 
-        recursion(t->fields.array, name, new_length);
+         recursion(t->fields.array, name, new_length,
+                   t->fields.structure[i].row_major);
       }
    } else {
       this->visit_field(t, *name);
index c8f38444c820b97713c038f05b4fe6130fb68765..e69098afdc3d450a337ac0063531ca062289d198 100644 (file)
@@ -75,6 +75,12 @@ public:
     * \param var  The uniform variable that is to be processed
     *
     * Calls \c ::visit_field for each leaf of the uniform.
+    *
+    * \warning
+    * This entry should only be used with uniform blocks in cases where the
+    * row / column ordering of matrices in the block does not matter.  For
+    * example, enumerating the names of members of the block, but not for
+    * determining the offsets of members.
     */
    void process(ir_variable *var);
 
@@ -92,7 +98,8 @@ private:
     * \param name_length  Length of the current name \b not including the
     *                     terminating \c NUL character.
     */
-   void recursion(const glsl_type *t, char **name, size_t name_length);
+   void recursion(const glsl_type *t, char **name, size_t name_length,
+                  bool row_major);
 };
 
 void