]> 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 e12d0bfc6285c0fa65858f71fdb1d0cb0ad74025..20345e20ae0760de48e4bbea923e89fea7d9356b 100644 (file)
@@ -1680,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);
@@ -1706,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);
+               }
        }
 }
 
@@ -1856,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())
@@ -1866,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;