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;
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;
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);
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;
writer.write_op(content.globals, OP_VARIABLE, ptr_type_id, block_id, storage);
- if(layout_ql)
+ if(iface.layout)
{
- auto i = find_member(*layout_ql, string("binding"), &Layout::Qualifier::name);
- if(i!=layout_ql->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);
+ }
}
}