]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/spirv.cpp
Refactor a common part in LocationAllocator into a function
[libs/gl.git] / source / glsl / spirv.cpp
index 2dcc285c624a2806dab80d3a6e487783138f732f..20345e20ae0760de48e4bbea923e89fea7d9356b 100644 (file)
@@ -690,6 +690,9 @@ void SpirVGenerator::visit(Swizzle &swizzle)
 
 void SpirVGenerator::visit(UnaryExpression &unary)
 {
+       if(composite_access)
+               return visit_isolated(unary);
+
        unary.expression->visit(*this);
 
        char oper = unary.oper->token[0];
@@ -774,6 +777,8 @@ void SpirVGenerator::visit(BinaryExpression &binary)
                visit_isolated(*binary.right);
                return visit_composite(*binary.left, 0x400000|r_expression_result_id, *binary.type);
        }
+       else if(composite_access)
+               return visit_isolated(binary);
 
        if(assignment_source_id)
                throw internal_error("invalid binary expression in assignment target");
@@ -998,6 +1003,8 @@ void SpirVGenerator::visit(Assignment &assign)
 
 void SpirVGenerator::visit(TernaryExpression &ternary)
 {
+       if(composite_access)
+               return visit_isolated(ternary);
        if(constant_expression)
        {
                ternary.condition->visit(*this);
@@ -1673,7 +1680,16 @@ void SpirVGenerator::visit(VariableDeclaration &var)
 
 void SpirVGenerator::visit(InterfaceBlock &iface)
 {
-       StorageClass storage = get_interface_storage(iface.interface, true);
+       const vector<Layout::Qualifier> *layout_ql = (iface.layout ? &iface.layout->qualifiers : 0);
+
+       bool push_const = false;
+       if(layout_ql)
+       {
+               auto i = find_member(*layout_ql, string("push_constant"), &Layout::Qualifier::name);
+               push_const = (i!=layout_ql->end());
+       }
+
+       StorageClass storage = (push_const ? STORAGE_PUSH_CONSTANT : get_interface_storage(iface.interface, true));
        Id type_id;
        if(iface.array)
                type_id = get_array_type_id(*iface.struct_declaration, 0);
@@ -1699,11 +1715,15 @@ void SpirVGenerator::visit(InterfaceBlock &iface)
 
        writer.write_op(content.globals, OP_VARIABLE, ptr_type_id, block_id, storage);
 
-       if(iface.layout)
+       if(layout_ql)
        {
-               auto i = find_member(iface.layout->qualifiers, string("binding"), &Layout::Qualifier::name);
-               if(i!=iface.layout->qualifiers.end())
-                       writer.write_op_decorate(block_id, DECO_BINDING, i->value);
+               for(const Layout::Qualifier &q: *layout_ql)
+               {
+                       if(q.name=="set")
+                               writer.write_op_decorate(block_id, DECO_DESCRIPTOR_SET, q.value);
+                       else if(q.name=="binding")
+                               writer.write_op_decorate(block_id, DECO_BINDING, q.value);
+               }
        }
 }
 
@@ -1849,6 +1869,8 @@ void SpirVGenerator::visit(Conditional &cond)
        writer.write_op(content.function_body, OP_SELECTION_MERGE, merge_block_id, 0);  // Selection control (none)
        writer.write_op(content.function_body, OP_BRANCH_CONDITIONAL, r_expression_result_id, true_label_id, false_label_id);
 
+       std::map<const VariableDeclaration *, Id> saved_load_ids = variable_load_ids;
+
        writer.write_op_label(true_label_id);
        cond.body.visit(*this);
        if(writer.get_current_block())
@@ -1859,6 +1881,7 @@ void SpirVGenerator::visit(Conditional &cond)
        reachable = true;
        if(!cond.else_body.body.empty())
        {
+               swap(saved_load_ids, variable_load_ids);
                writer.write_op_label(false_label_id);
                cond.else_body.visit(*this);
                reachable |= reachable_if_true;