Lines Matching full:arguments
53 static bool has_compile_time_constant_arguments(const ExpressionArray& arguments) { in has_compile_time_constant_arguments() argument
54 for (const std::unique_ptr<Expression>& arg : arguments) { in has_compile_time_constant_arguments()
90 // Takes up to two vector or scalar arguments and coalesces them in sequence: in coalesce_n_way_vector()
98 // If an argument is null, zero is passed to the coalesce function. If the arguments are a mix in coalesce_n_way_vector()
145 static std::unique_ptr<Expression> coalesce_vector(const IntrinsicArguments& arguments, in coalesce_vector() argument
150 SkASSERT(arguments[0]); in coalesce_vector()
151 SkASSERT(!arguments[1]); in coalesce_vector()
152 type_check_expression<T>(*arguments[0]); in coalesce_vector()
154 return coalesce_n_way_vector(arguments[0], /*arg1=*/nullptr, in coalesce_vector()
159 static std::unique_ptr<Expression> coalesce_pairwise_vectors(const IntrinsicArguments& arguments, in coalesce_pairwise_vectors() argument
164 SkASSERT(arguments[0]); in coalesce_pairwise_vectors()
165 SkASSERT(arguments[1]); in coalesce_pairwise_vectors()
166 SkASSERT(!arguments[2]); in coalesce_pairwise_vectors()
167 type_check_expression<T>(*arguments[0]); in coalesce_pairwise_vectors()
168 type_check_expression<T>(*arguments[1]); in coalesce_pairwise_vectors()
170 return coalesce_n_way_vector(arguments[0], arguments[1], in coalesce_pairwise_vectors()
177 const IntrinsicArguments& arguments, in optimize_comparison() argument
179 const Expression* left = arguments[0]; in optimize_comparison()
180 const Expression* right = arguments[1]; in optimize_comparison()
183 SkASSERT(!arguments[2]); in optimize_comparison()
212 // Takes up to three arguments and evaluates all of them, left-to-right, in tandem. in evaluate_n_way_intrinsic()
219 // If an argument is null, zero is passed to the evaluation function. If the arguments are a mix in evaluate_n_way_intrinsic()
265 const IntrinsicArguments& arguments, in evaluate_intrinsic() argument
268 SkASSERT(arguments[0]); in evaluate_intrinsic()
269 SkASSERT(!arguments[1]); in evaluate_intrinsic()
270 type_check_expression<T>(*arguments[0]); in evaluate_intrinsic()
272 return evaluate_n_way_intrinsic(context, arguments[0], /*arg1=*/nullptr, /*arg2=*/nullptr, in evaluate_intrinsic()
277 const IntrinsicArguments& arguments, in evaluate_intrinsic_numeric() argument
280 SkASSERT(arguments[0]); in evaluate_intrinsic_numeric()
281 SkASSERT(!arguments[1]); in evaluate_intrinsic_numeric()
282 const Type& type = arguments[0]->type().componentType(); in evaluate_intrinsic_numeric()
285 return evaluate_intrinsic<float>(context, arguments, returnType, eval); in evaluate_intrinsic_numeric()
288 return evaluate_intrinsic<SKSL_INT>(context, arguments, returnType, eval); in evaluate_intrinsic_numeric()
296 const IntrinsicArguments& arguments, in evaluate_pairwise_intrinsic() argument
299 SkASSERT(arguments[0]); in evaluate_pairwise_intrinsic()
300 SkASSERT(arguments[1]); in evaluate_pairwise_intrinsic()
301 SkASSERT(!arguments[2]); in evaluate_pairwise_intrinsic()
302 const Type& type = arguments[0]->type().componentType(); in evaluate_pairwise_intrinsic()
305 type_check_expression<float>(*arguments[0]); in evaluate_pairwise_intrinsic()
306 type_check_expression<float>(*arguments[1]); in evaluate_pairwise_intrinsic()
308 type_check_expression<SKSL_INT>(*arguments[0]); in evaluate_pairwise_intrinsic()
309 type_check_expression<SKSL_INT>(*arguments[1]); in evaluate_pairwise_intrinsic()
315 return evaluate_n_way_intrinsic(context, arguments[0], arguments[1], /*arg2=*/nullptr, in evaluate_pairwise_intrinsic()
320 const IntrinsicArguments& arguments, in evaluate_3_way_intrinsic() argument
323 SkASSERT(arguments[0]); in evaluate_3_way_intrinsic()
324 SkASSERT(arguments[1]); in evaluate_3_way_intrinsic()
325 SkASSERT(arguments[2]); in evaluate_3_way_intrinsic()
326 const Type& type = arguments[0]->type().componentType(); in evaluate_3_way_intrinsic()
329 type_check_expression<float>(*arguments[0]); in evaluate_3_way_intrinsic()
330 type_check_expression<float>(*arguments[1]); in evaluate_3_way_intrinsic()
331 type_check_expression<float>(*arguments[2]); in evaluate_3_way_intrinsic()
333 type_check_expression<SKSL_INT>(*arguments[0]); in evaluate_3_way_intrinsic()
334 type_check_expression<SKSL_INT>(*arguments[1]); in evaluate_3_way_intrinsic()
335 type_check_expression<SKSL_INT>(*arguments[2]); in evaluate_3_way_intrinsic()
341 return evaluate_n_way_intrinsic(context, arguments[0], arguments[1], arguments[2], in evaluate_3_way_intrinsic()
444 std::unique_ptr<Expression> evaluate_length(const IntrinsicArguments& arguments) { in evaluate_length() argument
445 return coalesce_vector<float>(arguments, /*startingState=*/0, in evaluate_length()
446 arguments[0]->type().componentType(), in evaluate_length()
451 std::unique_ptr<Expression> evaluate_distance(const IntrinsicArguments& arguments) { in evaluate_distance() argument
452 return coalesce_pairwise_vectors<float>(arguments, /*startingState=*/0, in evaluate_distance()
453 arguments[0]->type().componentType(), in evaluate_distance()
457 std::unique_ptr<Expression> evaluate_dot(const IntrinsicArguments& arguments) { in evaluate_dot() argument
458 return coalesce_pairwise_vectors<float>(arguments, /*startingState=*/0, in evaluate_dot()
459 arguments[0]->type().componentType(), in evaluate_dot()
465 const IntrinsicArguments& arguments) { in evaluate_sign() argument
466 return evaluate_intrinsic_numeric(context, arguments, arguments[0]->type(), in evaluate_sign()
471 const IntrinsicArguments& arguments) { in evaluate_opposite_sign() argument
472 return evaluate_intrinsic_numeric(context, arguments, arguments[0]->type(), in evaluate_opposite_sign()
477 const IntrinsicArguments& arguments) { in evaluate_add() argument
478 return evaluate_pairwise_intrinsic(context, arguments, arguments[0]->type(), in evaluate_add()
483 const IntrinsicArguments& arguments) { in evaluate_sub() argument
484 return evaluate_pairwise_intrinsic(context, arguments, arguments[0]->type(), in evaluate_sub()
489 const IntrinsicArguments& arguments) { in evaluate_mul() argument
490 return evaluate_pairwise_intrinsic(context, arguments, arguments[0]->type(), in evaluate_mul()
495 const IntrinsicArguments& arguments) { in evaluate_div() argument
496 return evaluate_pairwise_intrinsic(context, arguments, arguments[0]->type(), in evaluate_div()
501 const IntrinsicArguments& arguments) { in evaluate_normalize() argument
503 std::unique_ptr<Expression> length = Intrinsics::evaluate_length(arguments); in evaluate_normalize()
506 const IntrinsicArguments divArgs = {arguments[0], length.get(), nullptr}; in evaluate_normalize()
511 const IntrinsicArguments& arguments) { in evaluate_faceforward() argument
512 const Expression* N = arguments[0]; // vector in evaluate_faceforward()
513 const Expression* I = arguments[1]; // vector in evaluate_faceforward()
514 const Expression* NRef = arguments[2]; // vector in evaluate_faceforward()
530 const IntrinsicArguments& arguments) { in evaluate_reflect() argument
531 const Expression* I = arguments[0]; // vector in evaluate_reflect()
532 const Expression* N = arguments[1]; // vector in evaluate_reflect()
552 const IntrinsicArguments& arguments) { in evaluate_refract() argument
553 const Expression* I = arguments[0]; // vector in evaluate_refract()
554 const Expression* N = arguments[1]; // vector in evaluate_refract()
555 const Expression* Eta = arguments[2]; // scalar in evaluate_refract()
641 IntrinsicArguments arguments = {}; in optimize_intrinsic_call() local
642 SkASSERT(SkToSizeT(argArray.size()) <= arguments.size()); in optimize_intrinsic_call()
644 arguments[index] = ConstantFolder::GetConstantValueForVariable(*argArray[index]); in optimize_intrinsic_call()
648 return *arguments[idx]->getConstantValue(col); in optimize_intrinsic_call()
654 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
657 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
660 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
663 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
666 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
669 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
672 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
675 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
678 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
681 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
685 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
688 return evaluate_pairwise_intrinsic(context, arguments, returnType, in optimize_intrinsic_call()
692 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
696 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
699 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
703 return evaluate_pairwise_intrinsic(context, arguments, returnType, in optimize_intrinsic_call()
706 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
709 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
712 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
715 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
718 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
721 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
725 return evaluate_intrinsic_numeric(context, arguments, returnType, in optimize_intrinsic_call()
728 return Intrinsics::evaluate_sign(context, arguments); in optimize_intrinsic_call()
731 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
734 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
737 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
740 return evaluate_pairwise_intrinsic(context, arguments, returnType, in optimize_intrinsic_call()
743 return evaluate_pairwise_intrinsic(context, arguments, returnType, in optimize_intrinsic_call()
746 return evaluate_pairwise_intrinsic(context, arguments, returnType, in optimize_intrinsic_call()
749 return evaluate_3_way_intrinsic(context, arguments, returnType, in optimize_intrinsic_call()
752 return evaluate_3_way_intrinsic(context, arguments, returnType, in optimize_intrinsic_call()
755 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
758 if (arguments[2]->type().componentType().isBoolean()) { in optimize_intrinsic_call()
759 const SkSL::Type& numericType = arguments[0]->type().componentType(); in optimize_intrinsic_call()
762 type_check_expression<float>(*arguments[0]); in optimize_intrinsic_call()
763 type_check_expression<float>(*arguments[1]); in optimize_intrinsic_call()
765 type_check_expression<SKSL_INT>(*arguments[0]); in optimize_intrinsic_call()
766 type_check_expression<SKSL_INT>(*arguments[1]); in optimize_intrinsic_call()
768 type_check_expression<bool>(*arguments[0]); in optimize_intrinsic_call()
769 type_check_expression<bool>(*arguments[1]); in optimize_intrinsic_call()
774 return evaluate_n_way_intrinsic(context, arguments[0], arguments[1], arguments[2], in optimize_intrinsic_call()
777 return evaluate_3_way_intrinsic(context, arguments, returnType, in optimize_intrinsic_call()
781 return evaluate_pairwise_intrinsic(context, arguments, returnType, in optimize_intrinsic_call()
784 return evaluate_3_way_intrinsic(context, arguments, returnType, in optimize_intrinsic_call()
787 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
791 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
794 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
797 return evaluate_intrinsic<float>(context, arguments, returnType, in optimize_intrinsic_call()
800 return evaluate_intrinsic<SKSL_INT>(context, arguments, returnType, in optimize_intrinsic_call()
803 return evaluate_intrinsic<SKSL_INT>(context, arguments, returnType, in optimize_intrinsic_call()
813 return ConstructorCompound::MakeFromConstants(context, arguments[0]->fPosition, in optimize_intrinsic_call()
823 return ConstructorCompound::MakeFromConstants(context, arguments[0]->fPosition, in optimize_intrinsic_call()
832 return ConstructorCompound::MakeFromConstants(context, arguments[0]->fPosition, in optimize_intrinsic_call()
836 SKSL_INT x = *arguments[0]->getConstantValue(0); in optimize_intrinsic_call()
841 return ConstructorCompound::MakeFromConstants(context, arguments[0]->fPosition, in optimize_intrinsic_call()
845 SKSL_INT x = *arguments[0]->getConstantValue(0); in optimize_intrinsic_call()
850 return ConstructorCompound::MakeFromConstants(context, arguments[0]->fPosition, in optimize_intrinsic_call()
854 SKSL_INT x = *arguments[0]->getConstantValue(0); in optimize_intrinsic_call()
859 return ConstructorCompound::MakeFromConstants(context, arguments[0]->fPosition, in optimize_intrinsic_call()
864 return Intrinsics::evaluate_length(arguments); in optimize_intrinsic_call()
867 return Intrinsics::evaluate_distance(arguments); in optimize_intrinsic_call()
870 return Intrinsics::evaluate_dot(arguments); in optimize_intrinsic_call()
875 SkASSERT(arguments[0]->type().columns() == 3); // the vec2 form is not a real intrinsic in optimize_intrinsic_call()
880 return ConstructorCompound::MakeFromConstants(context, arguments[0]->fPosition, in optimize_intrinsic_call()
884 return Intrinsics::evaluate_normalize(context, arguments); in optimize_intrinsic_call()
887 return Intrinsics::evaluate_faceforward(context, arguments); in optimize_intrinsic_call()
890 return Intrinsics::evaluate_reflect(context, arguments); in optimize_intrinsic_call()
893 return Intrinsics::evaluate_refract(context, arguments); in optimize_intrinsic_call()
897 return evaluate_pairwise_intrinsic(context, arguments, returnType, in optimize_intrinsic_call()
907 return ConstructorCompound::MakeFromConstants(context, arguments[0]->fPosition, in optimize_intrinsic_call()
918 return ConstructorCompound::MakeFromConstants(context, arguments[0]->fPosition, in optimize_intrinsic_call()
923 extract_matrix(arguments[0], mat); in optimize_intrinsic_call()
925 switch (arguments[0]->type().slotCount()) { in optimize_intrinsic_call()
936 SkDEBUGFAILF("unsupported type %s", arguments[0]->type().description().c_str()); in optimize_intrinsic_call()
939 return Literal::MakeFloat(arguments[0]->fPosition, determinant, &returnType); in optimize_intrinsic_call()
943 extract_matrix(arguments[0], mat); in optimize_intrinsic_call()
944 switch (arguments[0]->type().slotCount()) { in optimize_intrinsic_call()
961 SkDEBUGFAILF("unsupported type %s", arguments[0]->type().description().c_str()); in optimize_intrinsic_call()
967 return ConstructorCompound::MakeFromConstants(context, arguments[0]->fPosition, in optimize_intrinsic_call()
972 return optimize_comparison(context, arguments, Intrinsics::compare_lessThan); in optimize_intrinsic_call()
975 return optimize_comparison(context, arguments, Intrinsics::compare_lessThanEqual); in optimize_intrinsic_call()
978 return optimize_comparison(context, arguments, Intrinsics::compare_greaterThan); in optimize_intrinsic_call()
981 return optimize_comparison(context, arguments, Intrinsics::compare_greaterThanEqual); in optimize_intrinsic_call()
984 return optimize_comparison(context, arguments, Intrinsics::compare_equal); in optimize_intrinsic_call()
987 return optimize_comparison(context, arguments, Intrinsics::compare_notEqual); in optimize_intrinsic_call()
990 return coalesce_vector<bool>(arguments, /*startingState=*/false, returnType, in optimize_intrinsic_call()
994 return coalesce_vector<bool>(arguments, /*startingState=*/true, returnType, in optimize_intrinsic_call()
998 return evaluate_intrinsic<bool>(context, arguments, returnType, in optimize_intrinsic_call()
1007 this->arguments().clone(), this->stablePointer()); in clone()
1013 for (const std::unique_ptr<Expression>& arg : this->arguments()) { in description()
1050 * arguments of the function to the required types. Cost has no particular meaning other than "lower
1056 const ExpressionArray& arguments) { in call_cost() argument
1062 if (function.parameters().size() != SkToSizeT(arguments.size())) { in call_cost()
1065 // If the arguments cannot be coerced to the parameter types, the function is never a match. in call_cost()
1068 if (!function.determineFinalTypes(arguments, &types, &ignored)) { in call_cost()
1071 // If the arguments do not match the parameter types due to mismatched modifiers, the function in call_cost()
1073 for (int i = 0; i < arguments.size(); i++) { in call_cost()
1074 const Expression& arg = *arguments[i]; in call_cost()
1082 for (int i = 0; i < arguments.size(); i++) { in call_cost()
1083 total = total + arguments[i]->coercionCost(*types[i]); in call_cost()
1091 const ExpressionArray& arguments) { in FindBestFunctionForCall() argument
1098 CoercionCost cost = call_cost(context, *f, arguments); in FindBestFunctionForCall()
1107 static std::string build_argument_type_list(SkSpan<const std::unique_ptr<Expression>> arguments) { in build_argument_type_list() argument
1110 for (const std::unique_ptr<Expression>& arg : arguments) { in build_argument_type_list()
1120 ExpressionArray arguments) { in Convert() argument
1126 std::move(arguments)); in Convert()
1130 arguments); in Convert()
1132 return FunctionCall::Convert(context, pos, *best, std::move(arguments)); in Convert()
1135 build_argument_type_list(arguments); in Convert()
1141 arguments.push_back(std::move(ref.self())); in Convert()
1144 arguments); in Convert()
1146 return FunctionCall::Convert(context, pos, *best, std::move(arguments)); in Convert()
1149 "no match for " + arguments.back()->type().displayName() + in Convert()
1151 build_argument_type_list(SkSpan(arguments).first(arguments.size() - 1)); in Convert()
1167 ExpressionArray arguments) { in Convert() argument
1174 // Reject function calls with the wrong number of arguments. in Convert()
1175 if (function.parameters().size() != SkToSizeT(arguments.size())) { in Convert()
1181 msg += ", but found " + std::to_string(arguments.size()); in Convert()
1186 // If the arguments do not match the parameter types due to mismatched modifiers, reject the in Convert()
1188 for (int i = 0; i < arguments.size(); i++) { in Convert()
1189 const Expression& arg = *arguments[i]; in Convert()
1203 if (!function.determineFinalTypes(arguments, &types, &returnType)) { in Convert()
1205 build_argument_type_list(arguments); in Convert()
1210 for (int i = 0; i < arguments.size(); i++) { in Convert()
1212 arguments[i] = types[i]->coerceExpression(std::move(arguments[i]), context); in Convert()
1213 if (!arguments[i]) { in Convert()
1222 if (!Analysis::UpdateVariableRefKind(arguments[i].get(), refKind, context.fErrors)) { in Convert()
1236 const Variable& child = *arguments.back()->as<VariableReference>().variable(); in Convert()
1237 arguments.pop_back(); in Convert()
1238 return ChildCall::Make(context, pos, returnType, child, std::move(arguments)); in Convert()
1241 return Make(context, pos, returnType, function, std::move(arguments)); in Convert()
1248 ExpressionArray arguments) { in Make() argument
1249 SkASSERT(function.parameters().size() == SkToSizeT(arguments.size())); in Make()
1252 if (function.isIntrinsic() && has_compile_time_constant_arguments(arguments)) { in Make()
1257 arguments, in Make()
1264 return std::make_unique<FunctionCall>(pos, returnType, &function, std::move(arguments), in Make()