| 428 | } |
| 429 | |
| 430 | void GLSLCompiler::translateFunctionCall(glsl::astFunctionCall *expression) { |
| 431 | m_exportLine(expression); |
| 432 | |
| 433 | Function data = matchFunction(expression->name, expression->parameters); |
| 434 | std::vector<GLSLCompiler::ExpressionType> paramTypes(expression->parameters.size()); |
| 435 | for (int i = 0; i < data.Arguments.size(); i++) |
| 436 | paramTypes[i] = m_convertExprType(data.Arguments[i].Type); |
| 437 | |
| 438 | for (int i = expression->parameters.size() - 1; i >= 0; i--) { |
| 439 | bool temp_usePointer = m_usePointer; |
| 440 | |
| 441 | if (data.Name.empty()) { |
| 442 | if (m_builtInFuncsPtrs.count(expression->name) > 0) |
| 443 | if (std::count(m_builtInFuncsPtrs[expression->name].begin(), m_builtInFuncsPtrs[expression->name].end(), i) > 0) |
| 444 | m_usePointer = true; |
| 445 | } |
| 446 | else if (data.Arguments[i].Storage == sd::Variable::StorageType::Out) |
| 447 | m_usePointer = true; |
| 448 | |
| 449 | translateExpression(expression->parameters[i]); |
| 450 | |
| 451 | m_usePointer = temp_usePointer; |
| 452 | |
| 453 | if (!data.Name.empty() && paramTypes[i] != evaluateExpressionType(expression->parameters[i])) |
| 454 | generateConvert(paramTypes[i]); |
| 455 | } |
| 456 | |
| 457 | |
| 458 | m_gen.Function.CallReturn(expression->name, expression->parameters.size()); |
| 459 | } |
| 460 | |
| 461 | void GLSLCompiler::translateConstructorCall(glsl::astConstructorCall *expression) { |
| 462 | m_exportLine(expression); |