glsl: Propagate UBO binding qualifier into UBO member variables.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 18 Jul 2013 01:06:57 +0000 (18:06 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 18 Jul 2013 23:57:24 +0000 (16:57 -0700)
Without an instance name, there is no ir_variable representing the
actual uniform block declaration.  When the linker goes to set uniform
initializers, it only sees the members as ir_variables; never the block.

So, unfortunately, the members need to know about the binding.

There has to be a better way to do this.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Paul Berry <stereotype441@gmail.com>
src/glsl/ast_to_hir.cpp

index 761c799ed686a145b69a058ebb964962367aca8a..bfd5fda8f773c3864f4cdb97220dfb2af16581ec 100644 (file)
@@ -4387,6 +4387,13 @@ ast_interface_block::hir(exec_list *instructions,
                                    var_mode);
          var->interface_type = block_type;
 
+         /* Propagate the "binding" keyword into this UBO's fields;
+          * the UBO declaration itself doesn't get an ir_variable unless it
+          * has an instance name.  This is ugly.
+          */
+         var->explicit_binding = this->layout.flags.q.explicit_binding;
+         var->binding = this->layout.binding;
+
          state->symbols->add_variable(var);
          instructions->push_tail(var);
       }