X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fgenerate.cpp;h=d4623a7fd85064acf8eb0860c9e9dae149e2798c;hb=c315e77b7791fe92d42e1566b5adaddf2699a758;hp=6430f9d8a0e53d630e284f64ef4ab869a2f85925;hpb=3f44e477f81983c66947fe8a6d8640a3b2f9e0b3;p=libs%2Fgl.git diff --git a/source/glsl/generate.cpp b/source/glsl/generate.cpp index 6430f9d8..d4623a7f 100644 --- a/source/glsl/generate.cpp +++ b/source/glsl/generate.cpp @@ -182,7 +182,7 @@ void TypeResolver::visit(InterfaceBlock &iface) StructDeclaration *strct = new StructDeclaration; strct->source = INTERNAL_SOURCE; - strct->name = format("_%s_%s", iface.interface, iface.name); + strct->name = format("_%s_%s", iface.interface, iface.block_name); strct->members.body.splice(strct->members.body.begin(), iface.members->body); stage->content.body.insert(type_insert_point, strct); stage->types.insert(make_pair(strct->name, strct)); @@ -488,7 +488,7 @@ void VariableResolver::visit(InterfaceBlock &iface) { /* Block names can be reused in different interfaces. Prefix the name with the first character of the interface to avoid conflicts. */ - stage->interface_blocks.insert(make_pair(iface.interface+iface.name, &iface)); + stage->interface_blocks.insert(make_pair(iface.interface+iface.block_name, &iface)); if(!iface.instance_name.empty()) stage->interface_blocks.insert(make_pair("_"+iface.instance_name, &iface)); @@ -579,8 +579,7 @@ void ExpressionResolver::convert_to(RefPtr &expr, BasicTypeDeclarati RefPtr call = new FunctionCall; call->name = type.name; call->constructor = true; - call->arguments.push_back(0); - call->arguments.back() = expr; + call->arguments.push_back_nocopy(expr); call->type = &type; expr = call; } @@ -908,6 +907,9 @@ void ExpressionResolver::visit(TernaryExpression &ternary) { BasicTypeDeclaration *basic_true = dynamic_cast(ternary.true_expr->type); BasicTypeDeclaration *basic_false = dynamic_cast(ternary.false_expr->type); + if(!basic_true || !basic_false) + return; + Compatibility compat = get_compatibility(*basic_true, *basic_false); if(compat==NOT_COMPATIBLE) return; @@ -1012,7 +1014,7 @@ void ExpressionResolver::visit_constructor(FunctionCall &call) stage inline it if that's reasonable. */ RefPtr temporary = new VariableDeclaration; temporary->type = args.front().type->name; - temporary->name = get_unused_variable_name(*current_block, "_temp", string()); + temporary->name = get_unused_variable_name(*current_block, "_temp"); temporary->init_expression = call.arguments.front(); current_block->body.insert(insert_point, temporary); @@ -1343,12 +1345,12 @@ VariableDeclaration *InterfaceGenerator::generate_interface(VariableDeclaration InterfaceBlock *InterfaceGenerator::generate_interface(InterfaceBlock &out_block) { - if(stage->interface_blocks.count("in"+out_block.name)) + if(stage->interface_blocks.count("in"+out_block.block_name)) return 0; InterfaceBlock *in_block = new InterfaceBlock; in_block->interface = "in"; - in_block->name = out_block.name; + in_block->block_name = out_block.block_name; in_block->members = new Block; in_block->instance_name = out_block.instance_name; if(stage->type==Stage::GEOMETRY) @@ -1369,7 +1371,7 @@ InterfaceBlock *InterfaceGenerator::generate_interface(InterfaceBlock &out_block } iface_target_block->body.insert(iface_insert_point, in_block); - stage->interface_blocks.insert(make_pair("in"+in_block->name, in_block)); + stage->interface_blocks.insert(make_pair("in"+in_block->block_name, in_block)); if(!in_block->instance_name.empty()) stage->interface_blocks.insert(make_pair("_"+in_block->instance_name, in_block)); @@ -1500,7 +1502,7 @@ void InterfaceGenerator::visit(InterfaceBlock &iface) if(!iface.linked_block && stage->previous) { const map &prev_blocks = stage->previous->interface_blocks; - map::const_iterator i = prev_blocks.find("out"+iface.name); + map::const_iterator i = prev_blocks.find("out"+iface.block_name); if(i!=prev_blocks.end()) { iface.linked_block = i->second;