#include "program/symbol_table.h"
}
#include "ir.h"
-#include "glsl_types.h"
class symbol_table_entry;
+struct glsl_type;
/**
* Facade class for _mesa_symbol_table
* type safe and some symbol table invariants.
*/
struct glsl_symbol_table {
-private:
- static int
- _glsl_symbol_table_destructor (glsl_symbol_table *table)
- {
- table->~glsl_symbol_table();
-
- return 0;
- }
-
-public:
- /* Callers of this talloc-based new need not call delete. It's
- * easier to just talloc_free 'ctx' (or any of its ancestors). */
- static void* operator new(size_t size, void *ctx)
- {
- void *table;
-
- table = talloc_size(ctx, size);
- assert(table != NULL);
-
- talloc_set_destructor(table, (int (*)(void*)) _glsl_symbol_table_destructor);
-
- return table;
- }
-
- /* If the user *does* call delete, that's OK, we will just
- * talloc_free in that case. Here, C++ will have already called the
- * destructor so tell talloc not to do that again. */
- static void operator delete(void *table)
- {
- talloc_set_destructor(table, NULL);
- talloc_free(table);
- }
-
+ DECLARE_RALLOC_CXX_OPERATORS(glsl_symbol_table)
+
glsl_symbol_table();
~glsl_symbol_table();
- unsigned int language_version;
+ /* In 1.10, functions and variables have separate namespaces. */
+ bool separate_function_namespace;
void push_scope();
void pop_scope();
* reduces the clarity of the intention of code that uses these methods.
*/
/*@{*/
- bool add_variable(const char *name, ir_variable *v);
+ bool add_variable(ir_variable *v);
bool add_type(const char *name, const glsl_type *t);
- bool add_function(const char *name, ir_function *f);
+ bool add_function(ir_function *f);
+ bool add_interface(const char *name, const glsl_type *i,
+ enum ir_variable_mode mode);
/*@}*/
+ /**
+ * Add an function at global scope without checking for scoping conflicts.
+ */
+ void add_global_function(ir_function *f);
+
/**
* \name Methods to get symbols from the table
*/
ir_variable *get_variable(const char *name);
const glsl_type *get_type(const char *name);
ir_function *get_function(const char *name);
+ const glsl_type *get_interface(const char *name,
+ 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);