SpirVGenerator::Id SpirVGenerator::allocate_id(Node &node, Id type_id)
{
+ map<Node *, Declaration>::iterator i = declared_ids.find(&node);
+ if(i!=declared_ids.end())
+ {
+ if(i->second.type_id)
+ throw key_error(&node);
+ i->second.type_id = type_id;
+ return i->second.id;
+ }
+
+ Id id = next_id++;
+ declared_ids.insert(make_pair(&node, Declaration(id, type_id)));
+ return id;
+}
+
+SpirVGenerator::Id SpirVGenerator::allocate_forward_id(Node &node)
+{
+ map<Node *, Declaration>::iterator i = declared_ids.find(&node);
+ if(i!=declared_ids.end())
+ return i->second.id;
+
Id id = next_id++;
- insert_unique(declared_ids, &node, Declaration(id, type_id));
+ declared_ids.insert(make_pair(&node, Declaration(id, 0)));
return id;
}
Id zero_id = get_constant_id(get_id(elem), 0.0f);
for(unsigned i=0; i<n_columns; ++i)
{
- column_ids[i] = begin_expression(OP_COMPOSITE_CONSTRUCT, col_type_id, n_rows);;
+ column_ids[i] = begin_expression(OP_COMPOSITE_CONSTRUCT, col_type_id, n_rows);
for(unsigned j=0; j<n_rows; ++j)
writer.write(j==i ? argument_ids[0] : zero_id);
end_expression(OP_COMPOSITE_CONSTRUCT);
}
if(init_id && current_function)
+ {
writer.write_op(content.function_body, OP_STORE, var_id, init_id);
+ variable_load_ids[&var] = init_id;
+ }
}
writer.write_op_name(var_id, var.name);
void SpirVGenerator::visit(FunctionDeclaration &func)
{
- if(func.source==BUILTIN_SOURCE || func.definition!=&func)
+ if(func.source==BUILTIN_SOURCE)
+ return;
+ else if(func.definition!=&func)
+ {
+ if(func.definition)
+ allocate_forward_id(*func.definition);
return;
+ }
Id return_type_id = get_id(*func.return_type_declaration);
vector<unsigned> param_type_ids;
if(iter.init_statement)
iter.init_statement->visit(*this);
+ variable_load_ids.clear();
+
Id header_id = next_id++;
Id continue_id = next_id++;
Id merge_block_id = next_id++;
writer.write_op(content.function_body, OP_BRANCH, header_id);
writer.write_op_label(merge_block_id);
- prune_loads(header_id);
reachable = true;
}