glsl: Fix depth unbalancing problem in if-statement flattening
authorIan Romanick <ian.d.romanick@intel.com>
Thu, 2 Jun 2011 19:42:48 +0000 (12:42 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Mon, 27 Jun 2011 21:00:14 +0000 (14:00 -0700)
Previously, if max_depth were 1, the following code would see the
first if-statement (correctly) not get flattened, but the second
if-statement would (incorrectly) get flattened:

void main()
{
    if (a)
        gl_Position = vec4(0);

    if (b)
        gl_Position = vec4(1);
}

This is because the visit_leave(ir_if*) method would not decrement the
depth before returning on the first if-statement.

NOTE: This is a candidate for the 7.10 and 7.11 branches.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/lower_if_to_cond_assign.cpp

index e3a1065d9963e5026df7af2745c33450f87f4e71..b637eb4fe1db16a155f2f8be12c963e955c31c91 100644 (file)
@@ -149,11 +149,9 @@ ir_visitor_status
 ir_if_to_cond_assign_visitor::visit_leave(ir_if *ir)
 {
    /* Only flatten when beyond the GPU's maximum supported nesting depth. */
-   if (this->depth <= this->max_depth)
+   if (this->depth-- <= this->max_depth)
       return visit_continue;
 
-   this->depth--;
-
    bool found_control_flow = false;
    ir_variable *cond_var;
    ir_assignment *assign;