X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fspirv.cpp;h=40e731fe63fa9fcfb384dd61baf8429e34be3382;hb=66cf095b3eeb3f5a37cc16231680a18d67b292fb;hp=609cdb1968ac896627045cf8de82c61dd9284d15;hpb=4dea96e285c123aab7d2c849ea3deaf512c3689c;p=libs%2Fgl.git diff --git a/source/glsl/spirv.cpp b/source/glsl/spirv.cpp index 609cdb19..40e731fe 100644 --- a/source/glsl/spirv.cpp +++ b/source/glsl/spirv.cpp @@ -1582,16 +1582,6 @@ void SpirVGenerator::visit(StructDeclaration &strct) void SpirVGenerator::visit(VariableDeclaration &var) { - const vector *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); + } } }