summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/glsl/ir.cpp2
-rw-r--r--src/glsl/ir.h6
-rw-r--r--src/glsl/ir_clone.cpp3
-rw-r--r--src/glsl/ir_constant_expression.cpp2
-rw-r--r--src/glsl/ir_import_prototypes.cpp2
-rw-r--r--src/glsl/ir_print_visitor.cpp10
-rw-r--r--src/glsl/ir_reader.cpp2
-rw-r--r--src/glsl/linker.cpp4
8 files changed, 13 insertions, 18 deletions
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index 31e40cac8c6..8779ec73c9b 100644
--- a/src/glsl/ir.cpp
+++ b/src/glsl/ir.cpp
@@ -982,7 +982,6 @@ ir_function_signature::ir_function_signature(const glsl_type *return_type)
: return_type(return_type), is_defined(false), _function(NULL)
{
this->ir_type = ir_type_function_signature;
- this->is_built_in = false;
}
@@ -1034,6 +1033,7 @@ ir_function::ir_function(const char *name)
{
this->ir_type = ir_type_function;
this->name = talloc_strdup(this, name);
+ this->is_builtin = false;
}
diff --git a/src/glsl/ir.h b/src/glsl/ir.h
index 500b1524089..0f887a9327e 100644
--- a/src/glsl/ir.h
+++ b/src/glsl/ir.h
@@ -342,9 +342,6 @@ public:
/** Whether or not this function has a body (which may be empty). */
unsigned is_defined:1;
- /** Whether or not this function signature is a built-in. */
- unsigned is_built_in:1;
-
/** Body of instructions in the function. */
struct exec_list body;
@@ -410,6 +407,9 @@ public:
*/
const char *name;
+ /** Whether or not this function is a built-in. */
+ unsigned is_builtin:1;
+
/**
* List of ir_function_signature for each overloaded function with this name.
*/
diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp
index 0a9e25a295a..1d690a4da7c 100644
--- a/src/glsl/ir_clone.cpp
+++ b/src/glsl/ir_clone.cpp
@@ -249,6 +249,8 @@ ir_function::clone(void *mem_ctx, struct hash_table *ht) const
{
ir_function *copy = new(mem_ctx) ir_function(this->name);
+ copy->is_builtin = this->is_builtin;
+
foreach_list_const(node, &this->signatures) {
const ir_function_signature *const sig =
(const ir_function_signature *const) node;
@@ -271,7 +273,6 @@ ir_function_signature::clone(void *mem_ctx, struct hash_table *ht) const
new(mem_ctx) ir_function_signature(this->return_type);
copy->is_defined = this->is_defined;
- copy->is_built_in = this->is_built_in;
/* Clone the parameter list.
*/
diff --git a/src/glsl/ir_constant_expression.cpp b/src/glsl/ir_constant_expression.cpp
index f1c175c97aa..5ec60c522f5 100644
--- a/src/glsl/ir_constant_expression.cpp
+++ b/src/glsl/ir_constant_expression.cpp
@@ -785,7 +785,7 @@ ir_call::constant_expression_value()
* "Function calls to user-defined functions (non-built-in functions)
* cannot be used to form constant expressions."
*/
- if (!this->callee->is_built_in)
+ if (!this->callee->function()->is_builtin)
return NULL;
unsigned num_parameters = 0;
diff --git a/src/glsl/ir_import_prototypes.cpp b/src/glsl/ir_import_prototypes.cpp
index e553e12a491..a39b384071a 100644
--- a/src/glsl/ir_import_prototypes.cpp
+++ b/src/glsl/ir_import_prototypes.cpp
@@ -59,6 +59,7 @@ public:
this->function = this->symbols->get_function(ir->name);
if (!this->function) {
this->function = new(this->mem_ctx) ir_function(ir->name);
+ this->function->is_builtin = ir->is_builtin;
list->push_tail(this->function);
@@ -86,7 +87,6 @@ public:
new(mem_ctx) ir_function_signature(ir->return_type);
copy->is_defined = false;
- copy->is_built_in = ir->is_built_in;
/* Clone the parameter list, but NOT the body.
*/
diff --git a/src/glsl/ir_print_visitor.cpp b/src/glsl/ir_print_visitor.cpp
index 83e64032723..f47ad875506 100644
--- a/src/glsl/ir_print_visitor.cpp
+++ b/src/glsl/ir_print_visitor.cpp
@@ -153,14 +153,8 @@ void ir_print_visitor::visit(ir_function_signature *ir)
void ir_print_visitor::visit(ir_function *ir)
{
- bool found_non_builtin_proto = false;
-
- foreach_iter(exec_list_iterator, iter, *ir) {
- ir_function_signature *const sig = (ir_function_signature *) iter.get();
- if (sig->is_defined || !sig->is_built_in)
- found_non_builtin_proto = true;
- }
- if (!found_non_builtin_proto)
+ /* Don't print built-in functions as part of the IR. */
+ if (ir->is_builtin)
return;
printf("(function %s\n", ir->name);
diff --git a/src/glsl/ir_reader.cpp b/src/glsl/ir_reader.cpp
index 3e221c0e5ff..366db327740 100644
--- a/src/glsl/ir_reader.cpp
+++ b/src/glsl/ir_reader.cpp
@@ -209,6 +209,7 @@ read_function(_mesa_glsl_parse_state *st, s_list *list, bool skip_body)
ir_function *f = st->symbols->get_function(name->value());
if (f == NULL) {
f = new(ctx) ir_function(name->value());
+ f->is_builtin = true;
added = st->symbols->add_function(f->name, f);
assert(added);
}
@@ -281,7 +282,6 @@ read_function_sig(_mesa_glsl_parse_state *st, ir_function *f, s_list *list,
if (sig == NULL && skip_body) {
/* If scanning for prototypes, generate a new signature. */
sig = new(ctx) ir_function_signature(return_type);
- sig->is_built_in = true;
f->add_signature(sig);
} else if (sig != NULL) {
const char *badvar = sig->qualifiers_match(&hir_parameters);
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 0348bd01e84..3de069b5312 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -726,14 +726,14 @@ link_intrastage_shaders(GLcontext *ctx,
ir_function_signature *sig =
(ir_function_signature *) iter.get();
- if (!sig->is_defined || sig->is_built_in)
+ if (!sig->is_defined || f->is_builtin)
continue;
ir_function_signature *other_sig =
other->exact_matching_signature(& sig->parameters);
if ((other_sig != NULL) && other_sig->is_defined
- && !other_sig->is_built_in) {
+ && !other_sig->function()->is_builtin) {
linker_error_printf(prog,
"function `%s' is multiply defined",
f->name);