]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/spirv.cpp
Don't try to access parameters with a pointer access instructior
[libs/gl.git] / source / glsl / spirv.cpp
index edbdf6359eeb8d751690f9e5d45923f9bac32fd9..91182a65725f3cae26a509ed588492ba08cfb881 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)
        {
@@ -1646,6 +1653,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)
                {
@@ -1858,7 +1870,8 @@ void SpirVGenerator::visit(Iteration &iter)
        if(iter.init_statement)
                iter.init_statement->visit(*this);
 
-       variable_load_ids.clear();
+       for(VariableDeclaration *v: AssignmentCollector().apply(iter))
+               variable_load_ids.erase(v);
 
        Id header_id = next_id++;
        Id continue_id = next_id++;