]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/spirv.cpp
Fix a name conflict in certain inlining scenarios
[libs/gl.git] / source / glsl / spirv.cpp
index 609cdb1968ac896627045cf8de82c61dd9284d15..40e731fe63fa9fcfb384dd61baf8429e34be3382 100644 (file)
@@ -1582,16 +1582,6 @@ void SpirVGenerator::visit(StructDeclaration &strct)
 
 void SpirVGenerator::visit(VariableDeclaration &var)
 {
-       const vector<Layout::Qualifier> *layout_ql = (var.layout ? &var.layout->qualifiers : 0);
-
-       int spec_id = -1;
-       if(layout_ql)
-       {
-               auto i = find_member(*layout_ql, string("constant_id"), &Layout::Qualifier::name);
-               if(i!=layout_ql->end())
-                       spec_id = i->value;
-       }
-
        Id type_id = get_variable_type_id(var);
        Id var_id;
 
@@ -1600,6 +1590,8 @@ void SpirVGenerator::visit(VariableDeclaration &var)
                if(!var.init_expression)
                        throw internal_error("const variable without initializer");
 
+               int spec_id = get_layout_value(var.layout.get(), "constant_id");
+
                SetFlag set_const(constant_expression);
                SetFlag set_spec(spec_constant, spec_id>=0);
                r_expression_result_id = 0;
@@ -1650,9 +1642,9 @@ void SpirVGenerator::visit(VariableDeclaration &var)
                        writer.write(init_id);
                writer.end_op(OP_VARIABLE);
 
-               if(layout_ql)
+               if(var.layout)
                {
-                       for(const Layout::Qualifier &q: *layout_ql)
+                       for(const Layout::Qualifier &q: var.layout->qualifiers)
                        {
                                if(q.name=="location")
                                        writer.write_op_decorate(var_id, DECO_LOCATION, q.value);
@@ -1680,7 +1672,9 @@ void SpirVGenerator::visit(VariableDeclaration &var)
 
 void SpirVGenerator::visit(InterfaceBlock &iface)
 {
-       StorageClass storage = get_interface_storage(iface.interface, true);
+       bool push_const = has_layout_qualifier(iface.layout.get(), "push_constant");
+
+       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);
@@ -1708,9 +1702,13 @@ void SpirVGenerator::visit(InterfaceBlock &iface)
 
        if(iface.layout)
        {
-               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: iface.layout->qualifiers)
+               {
+                       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);
+               }
        }
 }