+ // Compute the input sizes for all inputs for all effects in a given phase,
+ // and inform the effects about the results.
+ void inform_input_sizes(Phase *phase);
+
+ // Determine the preferred output size of a given phase.
+ // Requires that all input phases (if any) already have output sizes set.
+ void find_output_size(Phase *phase);
+
+ // Find all inputs eventually feeding into this effect that have
+ // output gamma different from GAMMA_LINEAR.
+ void find_all_nonlinear_inputs(Node *effect, std::vector<Node *> *nonlinear_inputs);
+
+ // Create a GLSL program computing the given effects in order.
+ Phase *compile_glsl_program(const std::vector<Node *> &inputs,
+ const std::vector<Node *> &effects);
+
+ // Create all GLSL programs needed to compute the given effect, and all outputs
+ // that depends on it (whenever possible).
+ void construct_glsl_programs(Node *output);
+
+ // Output the current graph to the given file in a Graphviz-compatible format;
+ // only useful for debugging.
+ void output_dot(const char *filename);
+
+ // Some of the graph algorithms assume that the nodes array is sorted
+ // topologically (inputs are always before outputs), but some operations
+ // (like graph rewriting) can change that. This function restores that order.
+ void sort_nodes_topologically();
+ void topological_sort_visit_node(Node *node, std::set<Node *> *visited_nodes, std::vector<Node *> *sorted_list);
+
+ // Used during finalize().
+ void propagate_gamma_and_color_space();
+ Node *find_output_node();