X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fspirv.cpp;h=c6f15614f5c8a56a36c7e7236a1c785f081e0a19;hb=77f6973f58167d94059d3f324c29ab2ca8de4544;hp=4828a00c452ad1e35e54156f97dfaf2ef4a4ffd8;hpb=03b2ea5c9c611cfa5f02afb49ed7e05743e691b4;p=libs%2Fgl.git diff --git a/source/glsl/spirv.cpp b/source/glsl/spirv.cpp index 4828a00c..c6f15614 100644 --- a/source/glsl/spirv.cpp +++ b/source/glsl/spirv.cpp @@ -375,17 +375,13 @@ SpirVGenerator::Id SpirVGenerator::get_variable_type_id(const VariableDeclaratio if(const BasicTypeDeclaration *basic = dynamic_cast(var.type_declaration)) if(basic->kind==BasicTypeDeclaration::ARRAY) { - Id size_id = 0; - if(var.array_size) - { - SetFlag set_const(constant_expression); - r_expression_result_id = 0; - var.array_size->visit(*this); - size_id = r_expression_result_id; - } - else - size_id = get_constant_id(get_standard_type_id(BasicTypeDeclaration::INT, 1), 1); - return get_array_type_id(*basic->base_type, size_id, basic->extended_alignment); + if(!var.array_size) + throw logic_error("array without size"); + + SetFlag set_const(constant_expression); + r_expression_result_id = 0; + var.array_size->visit(*this); + return get_array_type_id(*basic->base_type, r_expression_result_id, basic->extended_alignment); } return get_id(*var.type_declaration); @@ -1025,18 +1021,22 @@ void SpirVGenerator::visit(TernaryExpression &ternary) writer.write_op(content.function_body, OP_SELECTION_MERGE, merge_block_id, 0); // Selection control (none) writer.write_op(content.function_body, OP_BRANCH_CONDITIONAL, condition_id, true_label_id, false_label_id); + std::map saved_load_ids = variable_load_ids; + writer.write_op_label(true_label_id); ternary.true_expr->visit(*this); Id true_result_id = r_expression_result_id; true_label_id = writer.get_current_block(); writer.write_op(content.function_body, OP_BRANCH, merge_block_id); + swap(saved_load_ids, variable_load_ids); writer.write_op_label(false_label_id); ternary.false_expr->visit(*this); Id false_result_id = r_expression_result_id; false_label_id = writer.get_current_block(); writer.write_op_label(merge_block_id); + prune_loads(true_label_id); r_expression_result_id = begin_expression(OP_PHI, get_id(*ternary.type), 4); writer.write(true_result_id); writer.write(true_label_id); @@ -1516,7 +1516,7 @@ void SpirVGenerator::visit(StructDeclaration &strct) return; Id type_id = allocate_id(strct, 0); - writer.write_op_name(type_id, strct.name); + writer.write_op_name(type_id, (strct.block_name.empty() ? strct.name : strct.block_name)); if(!strct.block_name.empty()) writer.write_op_decorate(type_id, DECO_BLOCK); @@ -1674,7 +1674,8 @@ void SpirVGenerator::visit(VariableDeclaration &var) } } - writer.write_op_name(var_id, var.name); + if(var.name.find(' ')==string::npos) + writer.write_op_name(var_id, var.name); } void SpirVGenerator::visit_entry_point(FunctionDeclaration &func, Id func_id) @@ -1704,7 +1705,10 @@ void SpirVGenerator::visit_entry_point(FunctionDeclaration &func, Id func_id) writer.write_op(content.exec_modes, OP_EXECUTION_MODE, func_id, origin); } else if(stage->type==Stage::GEOMETRY) + { use_capability(CAP_GEOMETRY); + writer.write_op(content.exec_modes, OP_EXECUTION_MODE, func_id, EXEC_INVOCATIONS, 1); + } for(const InterfaceLayout *i: interface_layouts) { @@ -1780,6 +1784,7 @@ void SpirVGenerator::visit(FunctionDeclaration &func) { Id param_id = allocate_id(*func.parameters[i], param_type_ids[i]); writer.write_op(content.functions, OP_FUNCTION_PARAMETER, param_type_ids[i], param_id); + writer.write_op_name(param_id, func.parameters[i]->name); // TODO This is probably incorrect if the parameter is assigned to. variable_load_ids[func.parameters[i].get()] = param_id; }