+ int spec_id = get_layout_value(var.layout.get(), "constant_id");
+ Id *spec_var_id = (spec_id>=0 ? &declared_spec_ids[spec_id] : 0);
+ if(spec_id>=0 && *spec_var_id)
+ {
+ insert_unique(declared_ids, &var, Declaration(*spec_var_id, type_id));
+ return;
+ }
+
SetFlag set_const(constant_expression);
SetFlag set_spec(spec_constant, spec_id>=0);
r_expression_result_id = 0;
var.init_expression->visit(*this);
var_id = r_expression_result_id;
insert_unique(declared_ids, &var, Declaration(var_id, type_id));
SetFlag set_const(constant_expression);
SetFlag set_spec(spec_constant, spec_id>=0);
r_expression_result_id = 0;
var.init_expression->visit(*this);
var_id = r_expression_result_id;
insert_unique(declared_ids, &var, Declaration(var_id, type_id));
/* It's unclear what should be done if a specialization constant is
initialized with anything other than a literal. GLSL doesn't seem to
/* It's unclear what should be done if a specialization constant is
initialized with anything other than a literal. GLSL doesn't seem to
- 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");
writer.write_op(content.globals, OP_VARIABLE, ptr_type_id, block_id, storage);
writer.write_op(content.globals, OP_VARIABLE, ptr_type_id, block_id, storage);
- 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);
+ }