glsl: Add an ir_variable::reinit_interface_type() function.
authorPaul Berry <stereotype441@gmail.com>
Sat, 28 Sep 2013 17:04:41 +0000 (10:04 -0700)
committerPaul Berry <stereotype441@gmail.com>
Thu, 10 Oct 2013 21:27:22 +0000 (14:27 -0700)
This will be used by future patches to change an ir_variable's
interface type when the gl_PerVertex built-in interface block is
redeclared.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/glsl/ir.h

index 0f8e9a15d96616975c21fdac8c56393777475039..aac8cbb7dbe09de61edbeb061d4e294a38fda768 100644 (file)
@@ -420,6 +420,31 @@ public:
       this->interface_type = type;
    }
 
+   /**
+    * Change this->interface_type on a variable that previously had a
+    * different, and incompatible, interface_type. This is used during
+    * compilation to handle redeclaration of the built-in gl_PerVertex
+    * interface block.
+    */
+   void reinit_interface_type(const struct glsl_type *type)
+   {
+      if (this->max_ifc_array_access != NULL) {
+#ifndef _NDEBUG
+         /* Redeclaring gl_PerVertex is only allowed if none of the built-ins
+          * it defines have been accessed yet; so it's safe to throw away the
+          * old max_ifc_array_access pointer, since all of its values are
+          * zero.
+          */
+         for (unsigned i = 0; i < this->interface_type->length; i++)
+            assert(this->max_ifc_array_access[i] == 0);
+#endif
+         ralloc_free(this->max_ifc_array_access);
+         this->max_ifc_array_access = NULL;
+      }
+      this->interface_type = NULL;
+      init_interface_type(type);
+   }
+
    const glsl_type *get_interface_type() const
    {
       return this->interface_type;