]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/spirv.cpp
Recognize increment/decrement operators as modifying the target variable
[libs/gl.git] / source / glsl / spirv.cpp
index 91182a65725f3cae26a509ed588492ba08cfb881..2dcc285c624a2806dab80d3a6e487783138f732f 100644 (file)
@@ -1028,11 +1028,13 @@ void SpirVGenerator::visit(TernaryExpression &ternary)
        writer.write_op_label(true_label_id);
        ternary.true_expr->visit(*this);
        Id true_result_id = r_expression_result_id;
+       true_label_id = writer.get_current_block();
        writer.write_op(content.function_body, OP_BRANCH, merge_block_id);
 
        writer.write_op_label(false_label_id);
        ternary.false_expr->visit(*this);
        Id false_result_id = r_expression_result_id;
+       false_label_id = writer.get_current_block();
 
        writer.write_op_label(merge_block_id);
        r_expression_result_id = begin_expression(OP_PHI, get_id(*ternary.type), 4);
@@ -1815,11 +1817,12 @@ void SpirVGenerator::visit(FunctionDeclaration &func)
                variable_load_ids[func.parameters[i].get()] = param_id;
        }
 
+       reachable = true;
        writer.begin_function_body(next_id++);
        SetForScope<FunctionDeclaration *> set_func(current_function, &func);
        func.body.visit(*this);
 
-       if(writer.has_current_block())
+       if(writer.get_current_block())
        {
                if(!reachable)
                        writer.write_op(content.function_body, OP_UNREACHABLE);
@@ -1848,7 +1851,7 @@ void SpirVGenerator::visit(Conditional &cond)
 
        writer.write_op_label(true_label_id);
        cond.body.visit(*this);
-       if(writer.has_current_block())
+       if(writer.get_current_block())
                writer.write_op(content.function_body, OP_BRANCH, merge_block_id);
 
        bool reachable_if_true = reachable;
@@ -1870,8 +1873,9 @@ void SpirVGenerator::visit(Iteration &iter)
        if(iter.init_statement)
                iter.init_statement->visit(*this);
 
-       for(VariableDeclaration *v: AssignmentCollector().apply(iter))
-               variable_load_ids.erase(v);
+       for(Node *n: AssignmentCollector().apply(iter))
+               if(VariableDeclaration *var = dynamic_cast<VariableDeclaration *>(n))
+                       variable_load_ids.erase(var);
 
        Id header_id = next_id++;
        Id continue_id = next_id++;