X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fresolve.cpp;h=406d7780e810181ffc8650e9c0ba8c20466d67aa;hb=3fe1aab63922eec99d8bf6fd4fd60bec10df173c;hp=b80ae2176f5c8fae81a3c36cdaaf22a383f59256;hpb=f438142c7589df7480aa640cf62b7a2c3d48bab2;p=libs%2Fgl.git diff --git a/source/glsl/resolve.cpp b/source/glsl/resolve.cpp index b80ae217..406d7780 100644 --- a/source/glsl/resolve.cpp +++ b/source/glsl/resolve.cpp @@ -972,6 +972,11 @@ void ExpressionResolver::visit_constructor(FunctionCall &call) { unsigned column_count = basic->size&0xFFFF; unsigned row_count = basic->size>>16; + + vector > columns; + columns.reserve(column_count); + bool changed_columns = false; + if(call.arguments.size()==1) { /* A matrix can be constructed from a single element or another @@ -994,8 +999,6 @@ void ExpressionResolver::visit_constructor(FunctionCall &call) current_block->body.insert(insert_point, temporary); // Create expressions to build each column. - vector > columns; - columns.reserve(column_count); for(unsigned j=0; j ref = new VariableReference; @@ -1016,13 +1019,7 @@ void ExpressionResolver::visit_constructor(FunctionCall &call) truncate_vector(columns.back(), row_count); } - call.arguments.resize(column_count); - copy(columns.begin(), columns.end(), call.arguments.begin()); - - /* Let VariableResolver process the new nodes and finish - resolving the constructor on the next pass. */ - r_any_resolved = true; - return; + changed_columns = true; } else return; @@ -1031,9 +1028,6 @@ void ExpressionResolver::visit_constructor(FunctionCall &call) { /* Construct a matrix from individual components in column-major order. Arguments must align at column boundaries. */ - vector > columns; - columns.reserve(column_count); - vector > column_args; column_args.reserve(row_count); unsigned column_component_count = 0; @@ -1067,11 +1061,24 @@ void ExpressionResolver::visit_constructor(FunctionCall &call) else if(column_component_count>row_count) // Argument alignment mismatch. return; + + changed_columns = true; } } } else return; + + if(changed_columns) + { + call.arguments.resize(column_count); + copy(columns.begin(), columns.end(), call.arguments.begin()); + + /* Let VariableResolver process the new nodes and finish + resolving the constructor on the next pass. */ + r_any_resolved = true; + return; + } } else return; @@ -1141,6 +1148,28 @@ void ExpressionResolver::visit(VariableDeclaration &var) convert_to(var.init_expression, *var_basic); } +void ExpressionResolver::visit(FunctionDeclaration &func) +{ + SetForScope set_func(current_function, &func); + TraversingVisitor::visit(func); +} + +void ExpressionResolver::visit(Return &ret) +{ + TraversingVisitor::visit(ret); + if(!current_function || !ret.expression) + return; + + BasicTypeDeclaration *ret_basic = dynamic_cast(current_function->return_type_declaration); + BasicTypeDeclaration *expr_basic = dynamic_cast(ret.expression->type); + if(!ret_basic || !expr_basic) + return; + + Compatibility compat = get_compatibility(*ret_basic, *expr_basic); + if(compat==RIGHT_CONVERTIBLE) + convert_to(ret.expression, *ret_basic); +} + bool FunctionResolver::apply(Stage &s) {