glsl: Add callback_leave to ir_hierarchical_visitor.
authorMatt Turner <mattst88@gmail.com>
Thu, 10 Jul 2014 17:39:19 +0000 (10:39 -0700)
committerMatt Turner <mattst88@gmail.com>
Tue, 15 Jul 2014 17:12:29 +0000 (10:12 -0700)
src/glsl/ir_hierarchical_visitor.cpp
src/glsl/ir_hierarchical_visitor.h
src/glsl/ir_validate.cpp

index d3c00ecdb7676fdff5f7f9628dc2d1b96c3646f4..adb629414a2c644e339fb7591d4fecb650f0e9c7 100644 (file)
 ir_hierarchical_visitor::ir_hierarchical_visitor()
 {
    this->base_ir = NULL;
-   this->callback = NULL;
-   this->data = NULL;
+   this->callback_enter = NULL;
+   this->callback_leave = NULL;
+   this->data_enter = NULL;
+   this->data_leave = NULL;
    this->in_assignee = false;
 }
 
 ir_visitor_status
 ir_hierarchical_visitor::visit(ir_rvalue *ir)
 {
-   if (this->callback != NULL)
-      this->callback(ir, this->data);
+   if (this->callback_enter != NULL)
+      this->callback_enter(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -44,8 +46,8 @@ ir_hierarchical_visitor::visit(ir_rvalue *ir)
 ir_visitor_status
 ir_hierarchical_visitor::visit(ir_variable *ir)
 {
-   if (this->callback != NULL)
-      this->callback(ir, this->data);
+   if (this->callback_enter != NULL)
+      this->callback_enter(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -53,8 +55,8 @@ ir_hierarchical_visitor::visit(ir_variable *ir)
 ir_visitor_status
 ir_hierarchical_visitor::visit(ir_constant *ir)
 {
-   if (this->callback != NULL)
-      this->callback(ir, this->data);
+   if (this->callback_enter != NULL)
+      this->callback_enter(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -62,8 +64,8 @@ ir_hierarchical_visitor::visit(ir_constant *ir)
 ir_visitor_status
 ir_hierarchical_visitor::visit(ir_loop_jump *ir)
 {
-   if (this->callback != NULL)
-      this->callback(ir, this->data);
+   if (this->callback_enter != NULL)
+      this->callback_enter(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -71,8 +73,8 @@ ir_hierarchical_visitor::visit(ir_loop_jump *ir)
 ir_visitor_status
 ir_hierarchical_visitor::visit(ir_dereference_variable *ir)
 {
-   if (this->callback != NULL)
-      this->callback(ir, this->data);
+   if (this->callback_enter != NULL)
+      this->callback_enter(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -80,8 +82,8 @@ ir_hierarchical_visitor::visit(ir_dereference_variable *ir)
 ir_visitor_status
 ir_hierarchical_visitor::visit_enter(ir_loop *ir)
 {
-   if (this->callback != NULL)
-      this->callback(ir, this->data);
+   if (this->callback_enter != NULL)
+      this->callback_enter(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -89,15 +91,17 @@ ir_hierarchical_visitor::visit_enter(ir_loop *ir)
 ir_visitor_status
 ir_hierarchical_visitor::visit_leave(ir_loop *ir)
 {
-   (void) ir;
+   if (this->callback_leave != NULL)
+      this->callback_leave(ir, this->data_leave);
+
    return visit_continue;
 }
 
 ir_visitor_status
 ir_hierarchical_visitor::visit_enter(ir_function_signature *ir)
 {
-   if (this->callback != NULL)
-      this->callback(ir, this->data);
+   if (this->callback_enter != NULL)
+      this->callback_enter(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -105,15 +109,17 @@ ir_hierarchical_visitor::visit_enter(ir_function_signature *ir)
 ir_visitor_status
 ir_hierarchical_visitor::visit_leave(ir_function_signature *ir)
 {
-   (void) ir;
+   if (this->callback_leave != NULL)
+      this->callback_leave(ir, this->data_leave);
+
    return visit_continue;
 }
 
 ir_visitor_status
 ir_hierarchical_visitor::visit_enter(ir_function *ir)
 {
-   if (this->callback != NULL)
-      this->callback(ir, this->data);
+   if (this->callback_enter != NULL)
+      this->callback_enter(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -121,15 +127,17 @@ ir_hierarchical_visitor::visit_enter(ir_function *ir)
 ir_visitor_status
 ir_hierarchical_visitor::visit_leave(ir_function *ir)
 {
-   (void) ir;
+   if (this->callback_leave != NULL)
+      this->callback_leave(ir, this->data_leave);
+
    return visit_continue;
 }
 
 ir_visitor_status
 ir_hierarchical_visitor::visit_enter(ir_expression *ir)
 {
-   if (this->callback != NULL)
-      this->callback(ir, this->data);
+   if (this->callback_enter != NULL)
+      this->callback_enter(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -137,15 +145,17 @@ ir_hierarchical_visitor::visit_enter(ir_expression *ir)
 ir_visitor_status
 ir_hierarchical_visitor::visit_leave(ir_expression *ir)
 {
-   (void) ir;
+   if (this->callback_leave != NULL)
+      this->callback_leave(ir, this->data_leave);
+
    return visit_continue;
 }
 
 ir_visitor_status
 ir_hierarchical_visitor::visit_enter(ir_texture *ir)
 {
-   if (this->callback != NULL)
-      this->callback(ir, this->data);
+   if (this->callback_enter != NULL)
+      this->callback_enter(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -153,15 +163,17 @@ ir_hierarchical_visitor::visit_enter(ir_texture *ir)
 ir_visitor_status
 ir_hierarchical_visitor::visit_leave(ir_texture *ir)
 {
-   (void) ir;
+   if (this->callback_leave != NULL)
+      this->callback_leave(ir, this->data_leave);
+
    return visit_continue;
 }
 
 ir_visitor_status
 ir_hierarchical_visitor::visit_enter(ir_swizzle *ir)
 {
-   if (this->callback != NULL)
-      this->callback(ir, this->data);
+   if (this->callback_enter != NULL)
+      this->callback_enter(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -169,15 +181,17 @@ ir_hierarchical_visitor::visit_enter(ir_swizzle *ir)
 ir_visitor_status
 ir_hierarchical_visitor::visit_leave(ir_swizzle *ir)
 {
-   (void) ir;
+   if (this->callback_leave != NULL)
+      this->callback_leave(ir, this->data_leave);
+
    return visit_continue;
 }
 
 ir_visitor_status
 ir_hierarchical_visitor::visit_enter(ir_dereference_array *ir)
 {
-   if (this->callback != NULL)
-      this->callback(ir, this->data);
+   if (this->callback_enter != NULL)
+      this->callback_enter(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -185,15 +199,17 @@ ir_hierarchical_visitor::visit_enter(ir_dereference_array *ir)
 ir_visitor_status
 ir_hierarchical_visitor::visit_leave(ir_dereference_array *ir)
 {
-   (void) ir;
+   if (this->callback_leave != NULL)
+      this->callback_leave(ir, this->data_leave);
+
    return visit_continue;
 }
 
 ir_visitor_status
 ir_hierarchical_visitor::visit_enter(ir_dereference_record *ir)
 {
-   if (this->callback != NULL)
-      this->callback(ir, this->data);
+   if (this->callback_enter != NULL)
+      this->callback_enter(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -201,15 +217,17 @@ ir_hierarchical_visitor::visit_enter(ir_dereference_record *ir)
 ir_visitor_status
 ir_hierarchical_visitor::visit_leave(ir_dereference_record *ir)
 {
-   (void) ir;
+   if (this->callback_leave != NULL)
+      this->callback_leave(ir, this->data_leave);
+
    return visit_continue;
 }
 
 ir_visitor_status
 ir_hierarchical_visitor::visit_enter(ir_assignment *ir)
 {
-   if (this->callback != NULL)
-      this->callback(ir, this->data);
+   if (this->callback_enter != NULL)
+      this->callback_enter(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -217,15 +235,17 @@ ir_hierarchical_visitor::visit_enter(ir_assignment *ir)
 ir_visitor_status
 ir_hierarchical_visitor::visit_leave(ir_assignment *ir)
 {
-   (void) ir;
+   if (this->callback_leave != NULL)
+      this->callback_leave(ir, this->data_leave);
+
    return visit_continue;
 }
 
 ir_visitor_status
 ir_hierarchical_visitor::visit_enter(ir_call *ir)
 {
-   if (this->callback != NULL)
-      this->callback(ir, this->data);
+   if (this->callback_enter != NULL)
+      this->callback_enter(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -233,15 +253,17 @@ ir_hierarchical_visitor::visit_enter(ir_call *ir)
 ir_visitor_status
 ir_hierarchical_visitor::visit_leave(ir_call *ir)
 {
-   (void) ir;
+   if (this->callback_leave != NULL)
+      this->callback_leave(ir, this->data_leave);
+
    return visit_continue;
 }
 
 ir_visitor_status
 ir_hierarchical_visitor::visit_enter(ir_return *ir)
 {
-   if (this->callback != NULL)
-      this->callback(ir, this->data);
+   if (this->callback_enter != NULL)
+      this->callback_enter(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -249,15 +271,17 @@ ir_hierarchical_visitor::visit_enter(ir_return *ir)
 ir_visitor_status
 ir_hierarchical_visitor::visit_leave(ir_return *ir)
 {
-   (void) ir;
+   if (this->callback_leave != NULL)
+      this->callback_leave(ir, this->data_leave);
+
    return visit_continue;
 }
 
 ir_visitor_status
 ir_hierarchical_visitor::visit_enter(ir_discard *ir)
 {
-   if (this->callback != NULL)
-      this->callback(ir, this->data);
+   if (this->callback_enter != NULL)
+      this->callback_enter(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -265,15 +289,17 @@ ir_hierarchical_visitor::visit_enter(ir_discard *ir)
 ir_visitor_status
 ir_hierarchical_visitor::visit_leave(ir_discard *ir)
 {
-   (void) ir;
+   if (this->callback_leave != NULL)
+      this->callback_leave(ir, this->data_leave);
+
    return visit_continue;
 }
 
 ir_visitor_status
 ir_hierarchical_visitor::visit_enter(ir_if *ir)
 {
-   if (this->callback != NULL)
-      this->callback(ir, this->data);
+   if (this->callback_enter != NULL)
+      this->callback_enter(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -281,15 +307,17 @@ ir_hierarchical_visitor::visit_enter(ir_if *ir)
 ir_visitor_status
 ir_hierarchical_visitor::visit_leave(ir_if *ir)
 {
-   (void) ir;
+   if (this->callback_leave != NULL)
+      this->callback_leave(ir, this->data_leave);
+
    return visit_continue;
 }
 
 ir_visitor_status
 ir_hierarchical_visitor::visit_enter(ir_emit_vertex *ir)
 {
-   if (this->callback != NULL)
-      this->callback(ir, this->data);
+   if (this->callback_enter != NULL)
+      this->callback_enter(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -297,15 +325,17 @@ ir_hierarchical_visitor::visit_enter(ir_emit_vertex *ir)
 ir_visitor_status
 ir_hierarchical_visitor::visit_leave(ir_emit_vertex *ir)
 {
-   (void) ir;
+   if (this->callback_leave != NULL)
+      this->callback_leave(ir, this->data_leave);
+
    return visit_continue;
 }
 
 ir_visitor_status
 ir_hierarchical_visitor::visit_enter(ir_end_primitive *ir)
 {
-   if (this->callback != NULL)
-      this->callback(ir, this->data);
+   if (this->callback_enter != NULL)
+      this->callback_enter(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -313,7 +343,9 @@ ir_hierarchical_visitor::visit_enter(ir_end_primitive *ir)
 ir_visitor_status
 ir_hierarchical_visitor::visit_leave(ir_end_primitive *ir)
 {
-   (void) ir;
+   if (this->callback_leave != NULL)
+      this->callback_leave(ir, this->data_leave);
+
    return visit_continue;
 }
 
@@ -326,13 +358,17 @@ ir_hierarchical_visitor::run(exec_list *instructions)
 
 void
 visit_tree(ir_instruction *ir,
-          void (*callback)(class ir_instruction *ir, void *data),
-          void *data)
+          void (*callback_enter)(class ir_instruction *ir, void *data),
+          void *data_enter,
+          void (*callback_leave)(class ir_instruction *ir, void *data),
+           void *data_leave)
 {
    ir_hierarchical_visitor v;
 
-   v.callback = callback;
-   v.data = data;
+   v.callback_enter = callback_enter;
+   v.callback_leave = callback_leave;
+   v.data_enter = data_enter;
+   v.data_leave = data_leave;
 
    ir->accept(&v);
 }
index bc89a04d8c95079e64a49fe96feb50febdab58dc..faa52fd79c0deeffe7764c0c7addb65d8826f19f 100644 (file)
@@ -163,14 +163,29 @@ public:
     * \warning
     * Visitor classes derived from \c ir_hierarchical_visitor \b may \b not
     * invoke this function.  This can be used, for example, to cause the
-    * callback to be invoked on every node type execpt one.
+    * callback to be invoked on every node type except one.
     */
-   void (*callback)(class ir_instruction *ir, void *data);
+   void (*callback_enter)(class ir_instruction *ir, void *data);
 
    /**
-    * Extra data parameter passed to the per-node callback function
+    * Callback function that is invoked on exit of each node visited.
+    *
+    * \warning
+    * Visitor classes derived from \c ir_hierarchical_visitor \b may \b not
+    * invoke this function.  This can be used, for example, to cause the
+    * callback to be invoked on every node type except one.
+    */
+   void (*callback_leave)(class ir_instruction *ir, void *data);
+
+   /**
+    * Extra data parameter passed to the per-node callback_enter function
+    */
+   void *data_enter;
+
+   /**
+    * Extra data parameter passed to the per-node callback_leave function
     */
-   void *data;
+   void *data_leave;
 
    /**
     * Currently in the LHS of an assignment?
@@ -181,8 +196,10 @@ public:
 };
 
 void visit_tree(ir_instruction *ir,
-               void (*callback)(class ir_instruction *ir, void *data),
-               void *data);
+               void (*callback_enter)(class ir_instruction *ir, void *data),
+               void *data_enter,
+               void (*callback_leave)(class ir_instruction *ir, void *data) = NULL,
+               void *data_leave = NULL);
 
 ir_visitor_status visit_list_elements(ir_hierarchical_visitor *v, exec_list *l,
                                       bool statement_list = true);
index 42142da02d1e00a9c21660edec8ec8d516e6ed5f..37e1ce33e7ad448ce2adbe9172d6d55001ef087c 100644 (file)
@@ -49,8 +49,8 @@ public:
 
       this->current_function = NULL;
 
-      this->callback = ir_validate::validate_ir;
-      this->data = ht;
+      this->callback_enter = ir_validate::validate_ir;
+      this->data_enter = ht;
    }
 
    ~ir_validate()
@@ -100,7 +100,7 @@ ir_validate::visit(ir_dereference_variable *ir)
       abort();
    }
 
-   this->validate_ir(ir, this->data);
+   this->validate_ir(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -167,7 +167,7 @@ ir_validate::visit_enter(ir_function *ir)
     */
    this->current_function = ir;
 
-   this->validate_ir(ir, this->data);
+   this->validate_ir(ir, this->data_enter);
 
    /* Verify that all of the things stored in the list of signatures are,
     * in fact, function signatures.
@@ -211,7 +211,7 @@ ir_validate::visit_enter(ir_function_signature *ir)
       abort();
    }
 
-   this->validate_ir(ir, this->data);
+   this->validate_ir(ir, this->data_enter);
 
    return visit_continue;
 }
@@ -726,7 +726,7 @@ ir_validate::visit_enter(ir_assignment *ir)
       }
    }
 
-   this->validate_ir(ir, this->data);
+   this->validate_ir(ir, this->data_enter);
 
    return visit_continue;
 }