glsl: Make it possible to disable a variable in the symbol table.
authorPaul Berry <stereotype441@gmail.com>
Tue, 1 Oct 2013 23:33:56 +0000 (16:33 -0700)
committerPaul Berry <stereotype441@gmail.com>
Thu, 10 Oct 2013 21:27:27 +0000 (14:27 -0700)
In later patches, we'll use this in order to implement the required
behaviour that after the gl_PerVertex interface block has been
redeclared, only members of the redeclared interface block may be
used.

v2: Update the function name and comment to clarify that we aren't
actually removing the variable from the symbol table, just disabling
it.

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

index 6e916b458d64400d700b1ac9297da1d3909b1802..11569f47eda03f8a5332eb71d17a7e8bc8195639 100644 (file)
@@ -256,3 +256,18 @@ symbol_table_entry *glsl_symbol_table::get_entry(const char *name)
    return (symbol_table_entry *)
       _mesa_symbol_table_find_symbol(table, -1, name);
 }
+
+void
+glsl_symbol_table::disable_variable(const char *name)
+{
+   /* Ideally we would remove the variable's entry from the symbol table, but
+    * that would be difficult.  Fortunately, since this is only used for
+    * built-in variables, it won't be possible for the shader to re-introduce
+    * the variable later, so all we really need to do is to make sure that
+    * further attempts to access it using get_variable() will return NULL.
+    */
+   symbol_table_entry *entry = get_entry(name);
+   if (entry != NULL) {
+      entry->v = NULL;
+   }
+}
index 62d26b89ac4b5d6c3506219fc2e9aefe3fe712d7..0e62448e2e7ca6c4ff5df1a3ce44afa4ddc5b6e2 100644 (file)
@@ -121,6 +121,14 @@ public:
                                   enum ir_variable_mode mode);
    /*@}*/
 
+   /**
+    * Disable a previously-added variable so that it no longer appears to be
+    * in the symbol table.  This is necessary when gl_PerVertex is redeclared,
+    * to ensure that previously-available built-in variables are no longer
+    * available.
+    */
+   void disable_variable(const char *name);
+
 private:
    symbol_table_entry *get_entry(const char *name);