]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/spirv.cpp
Process loop initialization outside the body in UnusedVariableRemover
[libs/gl.git] / source / glsl / spirv.cpp
index d8f24d20b7007342827423cfd3b7d3b5b85bee79..7bec551b166fd4b3303c23591c24886f1baac9b6 100644 (file)
@@ -518,8 +518,15 @@ void SpirVGenerator::visit(VariableReference &var)
        r_constant_result = false;
        if(composite_access)
        {
-               r_composite_base = var.declaration;
                r_expression_result_id = 0;
+               if(!assignment_source_id)
+               {
+                       auto i = variable_load_ids.find(var.declaration);
+                       if(i!=variable_load_ids.end())
+                               r_expression_result_id = i->second;
+               }
+               if(!r_expression_result_id)
+                       r_composite_base = var.declaration;
        }
        else if(assignment_source_id)
        {
@@ -1021,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);
@@ -1808,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);
@@ -1841,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;