]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/spirv.cpp
Improve layout qualifier handling with some more utility functions
[libs/gl.git] / source / glsl / spirv.cpp
index 20345e20ae0760de48e4bbea923e89fea7d9356b..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,14 +1672,7 @@ void SpirVGenerator::visit(VariableDeclaration &var)
 
 void SpirVGenerator::visit(InterfaceBlock &iface)
 {
-       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());
-       }
+       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;
@@ -1715,9 +1700,9 @@ void SpirVGenerator::visit(InterfaceBlock &iface)
 
        writer.write_op(content.globals, OP_VARIABLE, ptr_type_id, block_id, storage);
 
-       if(layout_ql)
+       if(iface.layout)
        {
-               for(const Layout::Qualifier &q: *layout_ql)
+               for(const Layout::Qualifier &q: iface.layout->qualifiers)
                {
                        if(q.name=="set")
                                writer.write_op_decorate(block_id, DECO_DESCRIPTOR_SET, q.value);