glsl: Add ir_variable::interface_type field
authorIan Romanick <ian.d.romanick@intel.com>
Tue, 22 Jan 2013 02:51:15 +0000 (21:51 -0500)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 25 Jan 2013 14:07:34 +0000 (09:07 -0500)
For variables that are in an interface block or are an instance of an
interface block, this is the GLSL_TYPE_INTERFACE type for that block.

Convert the ir_variable::is_in_uniform_block method added in the
previous commit to use this field instead of ir_variable::uniform_block.

v2: Fix the place-holder comment on ir_variable::interface_type.
Suggested 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/ast_to_hir.cpp
src/glsl/ir.h
src/glsl/ir_clone.cpp

index 163c39aeb930b067b2e866274ba536c477d7e24f..372ffde1b16b611c352f28eceee74b7186c8cd90 100644 (file)
@@ -4268,6 +4268,7 @@ ast_uniform_block::hir(exec_list *instructions,
                                                 this->instance_name,
                                                 ir_var_uniform);
 
+      var->interface_type = block_type;
       state->symbols->add_variable(var);
       instructions->push_tail(var);
    } else {
@@ -4277,6 +4278,7 @@ ast_uniform_block::hir(exec_list *instructions,
                                    ralloc_strdup(state, fields[i].name),
                                    ir_var_uniform);
          var->uniform_block = ubo - state->uniform_blocks;
+         var->interface_type = block_type;
 
          state->symbols->add_variable(var);
          instructions->push_tail(var);
index 14212dfb7a276db9f0d0018da887a482d87a5a3f..ff47b3a5a80b00da9e20371dffceb834a49f3422 100644 (file)
@@ -354,7 +354,7 @@ public:
     */
    inline bool is_in_uniform_block() const
    {
-      return this->mode == ir_var_uniform && this->uniform_block != -1;
+      return this->mode == ir_var_uniform && this->interface_type != NULL;
    }
 
    /**
@@ -540,6 +540,14 @@ public:
     * objects.
     */
    ir_constant *constant_initializer;
+
+   /**
+    * For variables that are in an interface block or are an instance of an
+    * interface block, this is the \c GLSL_TYPE_INTERFACE type for that block.
+    *
+    * \sa ir_variable::location
+    */
+   const glsl_type *interface_type;
 };
 
 
index 3e22f2d2ab00ee3580e5ba154eeee1b83cdff203..c221a96c3f3562504e134ea9d70dcd0768781264 100644 (file)
@@ -77,6 +77,8 @@ ir_variable::clone(void *mem_ctx, struct hash_table *ht) const
       var->constant_initializer =
         this->constant_initializer->clone(mem_ctx, ht);
 
+   var->interface_type = this->interface_type;
+
    if (ht) {
       hash_table_insert(ht, var, (void *)const_cast<ir_variable *>(this));
    }