[Mesa-dev] [PATCH 13/23] glsl/ir: add subroutine information storage to ir_function
Dave Airlie
airlied at gmail.com
Thu Apr 23 18:42:49 PDT 2015
From: Dave Airlie <airlied at redhat.com>
We need to store two sets of info into the ir_function,
if this is a function definition with a subroutine list
(subroutine_def) or if it a subroutine prototype.
Signed-off-by: Dave Airlie <airlied at redhat.com>
---
src/glsl/ir.cpp | 4 ++++
src/glsl/ir.h | 7 +++++++
src/glsl/ir_clone.cpp | 7 +++++++
src/glsl/ir_print_visitor.cpp | 2 +-
4 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index 9e32385..cdba11a 100644
--- a/src/glsl/ir.cpp
+++ b/src/glsl/ir.cpp
@@ -1851,6 +1851,7 @@ static void
steal_memory(ir_instruction *ir, void *new_ctx)
{
ir_variable *var = ir->as_variable();
+ ir_function *fn = ir->as_function();
ir_constant *constant = ir->as_constant();
if (var != NULL && var->constant_value != NULL)
steal_memory(var->constant_value, ir);
@@ -1858,6 +1859,9 @@ steal_memory(ir_instruction *ir, void *new_ctx)
if (var != NULL && var->constant_initializer != NULL)
steal_memory(var->constant_initializer, ir);
+ if (fn != NULL && fn->subroutine_types)
+ ralloc_steal(new_ctx, fn->subroutine_types);
+
/* The components of aggregate constants are not visited by the normal
* visitor, so steal their values by hand.
*/
diff --git a/src/glsl/ir.h b/src/glsl/ir.h
index fab1cd2..e70742f 100644
--- a/src/glsl/ir.h
+++ b/src/glsl/ir.h
@@ -1120,6 +1120,13 @@ public:
* List of ir_function_signature for each overloaded function with this name.
*/
struct exec_list signatures;
+
+ /* is this function just a subroutine type? */
+ bool is_subroutine;
+ bool is_subroutine_def;
+
+ int num_subroutine_types;
+ const struct glsl_type **subroutine_types;
};
inline const char *ir_function_signature::function_name() const
diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp
index 49834ff..bf25d6c 100644
--- a/src/glsl/ir_clone.cpp
+++ b/src/glsl/ir_clone.cpp
@@ -267,6 +267,13 @@ ir_function::clone(void *mem_ctx, struct hash_table *ht) const
{
ir_function *copy = new(mem_ctx) ir_function(this->name);
+ copy->is_subroutine = this->is_subroutine;
+ copy->is_subroutine_def = this->is_subroutine_def;
+ copy->num_subroutine_types = this->num_subroutine_types;
+ copy->subroutine_types = ralloc_array(mem_ctx, const struct glsl_type *, copy->num_subroutine_types);
+ for (int i = 0; i < copy->num_subroutine_types; i++)
+ copy->subroutine_types[i] = this->subroutine_types[i];
+
foreach_in_list(const ir_function_signature, sig, &this->signatures) {
ir_function_signature *sig_copy = sig->clone(mem_ctx, ht);
copy->add_signature(sig_copy);
diff --git a/src/glsl/ir_print_visitor.cpp b/src/glsl/ir_print_visitor.cpp
index 01f52e8..d9fd85c 100644
--- a/src/glsl/ir_print_visitor.cpp
+++ b/src/glsl/ir_print_visitor.cpp
@@ -225,7 +225,7 @@ void ir_print_visitor::visit(ir_function_signature *ir)
void ir_print_visitor::visit(ir_function *ir)
{
- fprintf(f, "(function %s\n", ir->name);
+ fprintf(f, "(%s function %s\n", ir->is_subroutine ? "subroutine" : "", ir->name);
indentation++;
foreach_in_list(ir_function_signature, sig, &ir->signatures) {
indent();
--
2.1.0
More information about the mesa-dev
mailing list