]> 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 16168a8cb8725671197bf39567d276992e6c5695..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);
@@ -1646,6 +1655,11 @@ void SpirVGenerator::visit(VariableDeclaration &var)
                                        writer.write_op_decorate(var_id, DECO_BINDING, q.value);
                        }
                }
+               if(!var.name.compare(0, 3, "gl_"))
+               {
+                       BuiltinSemantic semantic = get_builtin_semantic(var.name);
+                       writer.write_op_decorate(var_id, DECO_BUILTIN, semantic);
+               }
 
                if(init_id && current_function)
                {
@@ -1803,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);
@@ -1836,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;