• Home
  • Raw
  • Download

Lines Matching +full:is +full:- +full:arguments

4  * Use of this source code is governed by a BSD-style license that can be
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()
102 Position pos = arg0->fPosition; in coalesce_n_way_vector()
106 const Type& vecType = arg0->type().isVector() ? arg0->type() : in coalesce_n_way_vector()
107 (arg1 && arg1->type().isVector()) ? arg1->type() : in coalesce_n_way_vector()
108 arg0->type(); in coalesce_n_way_vector()
109 SkASSERT( arg0->type().componentType().matches(vecType.componentType())); in coalesce_n_way_vector()
110 SkASSERT(!arg1 || arg1->type().componentType().matches(vecType.componentType())); in coalesce_n_way_vector()
116 std::optional<double> arg0Value = arg0->getConstantValue(arg0Index); in coalesce_n_way_vector()
117 arg0Index += arg0->type().isVector() ? 1 : 0; in coalesce_n_way_vector()
122 arg1Value = arg1->getConstantValue(arg1Index); in coalesce_n_way_vector()
123 arg1Index += arg1->type().isVector() ? 1 : 0; in coalesce_n_way_vector()
132 // The value is outside the float range or is NaN (all if-checks fail); do not optimize. 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()
185 const Type& type = left->type(); in optimize_comparison()
188 SkASSERT(type.matches(right->type())); in optimize_comparison()
193 std::optional<double> leftValue = left->getConstantValue(index); in optimize_comparison()
194 std::optional<double> rightValue = right->getConstantValue(index); in optimize_comparison()
200 const Type& bvecType = context.fTypes.fBool->toCompound(context, type.columns(), /*rows=*/1); in optimize_comparison()
201 return ConstructorCompound::MakeFromConstants(context, left->fPosition, bvecType, array); 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()
232 std::optional<double> arg0Value = arg0->getConstantValue(arg0Index); in evaluate_n_way_intrinsic()
233 arg0Index += arg0->type().isScalar() ? 0 : 1; in evaluate_n_way_intrinsic()
238 arg1Value = arg1->getConstantValue(arg1Index); in evaluate_n_way_intrinsic()
239 arg1Index += arg1->type().isScalar() ? 0 : 1; in evaluate_n_way_intrinsic()
245 arg2Value = arg2->getConstantValue(arg2Index); in evaluate_n_way_intrinsic()
246 arg2Index += arg2->type().isScalar() ? 0 : 1; in evaluate_n_way_intrinsic()
255 // The value is outside the float range or is NaN (all if-checks fail); do not optimize. in evaluate_n_way_intrinsic()
260 return ConstructorCompound::MakeFromConstants(context, arg0->fPosition, returnType, array); 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()
353 // Return the value-of-type-T2 as a double. (Non-finite values will prohibit optimization.) in pun_value()
364 double coalesce_distance(double a, double b, double c) { b -= c; return a + (b * b); } in coalesce_distance()
402 double evaluate_sub(double a, double b, double) { return a - b; } in evaluate_sub()
406 double evaluate_sign(double a, double, double) { return (a > 0) - (a < 0); } in evaluate_sign()
407 double evaluate_opposite_sign(double a,double, double) { return (a < 0) - (a > 0); } in evaluate_opposite_sign()
410 double evaluate_fract(double a, double, double) { return a - std::floor(a); } in evaluate_fract()
416 double evaluate_mix(double x, double y, double a) { return x * (1 - a) + y * a; } in evaluate_mix()
419 return a - b * std::floor(sk_ieee_double_divide(a, b)); in evaluate_mod()
422 double t = sk_ieee_double_divide(x - edge0, edge1 - edge0); in evaluate_smoothstep()
424 return t * t * (3.0 - 2.0 * t); in evaluate_smoothstep()
435 // The semantics of std::remainder guarantee a rounded-to-even result here, regardless of the in evaluate_round()
436 // current float-rounding mode. in evaluate_round()
437 return a - std::remainder(a, 1.0); in evaluate_round()
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()
516 // faceforward(N,I,NRef): N * -sign(dot(I, NRef)) 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()
534 // reflect(I,N): temp = (N * dot(N, I)); reflect = I - (temp + temp) 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()
557 // K = 1.0 - Eta^2 * (1.0 - Dot(N, I)^2); in evaluate_refract()
569 // OneMinusDot = 1 - DotNI2 in evaluate_refract()
570 Literal oneLiteral{Position{}, 1.0, &DotNI2Expr->type()}; in evaluate_refract()
585 // K = 1.0 - Eta2xDot in evaluate_refract()
588 if (!KExpr || !KExpr->is<Literal>()) { return nullptr; } in evaluate_refract()
591 double kValue = KExpr->as<Literal>().value(); in evaluate_refract()
594 return ConstructorCompound::MakeFromConstants(context, I->fPosition, I->type(), kZero); in evaluate_refract()
597 // When K ≥ 0, Refract(I, N, Eta) = (I * Eta) - N * (Eta * Dot(N,I) + Sqrt(K)) in evaluate_refract()
605 Literal sqrtKLiteral{Position{}, std::sqrt(kValue), &Eta->type()}; in evaluate_refract()
620 // Refract = IEta - NxEDS in evaluate_refract()
629 size_t numSlots = expr->type().slotCount(); in extract_matrix()
631 mat[index] = *expr->getConstantValue(index); in extract_matrix()
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()
647 auto Get = [&](int idx, int col) -> float { 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()
790 case k_roundEven_IntrinsicKind: // and is allowed to behave identically to `roundEven`. 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()
805 // 8.4 : Floating-Point Pack and Unpack Functions in optimize_intrinsic_call()
807 auto Pack = [&](int n) -> unsigned int { in optimize_intrinsic_call()
813 return ConstructorCompound::MakeFromConstants(context, arguments[0]->fPosition, in optimize_intrinsic_call()
817 auto Pack = [&](int n) -> unsigned int { in optimize_intrinsic_call()
819 return (int)std::round(Intrinsics::evaluate_clamp(x, -1.0, 1.0) * 32767.0); in optimize_intrinsic_call()
823 return ConstructorCompound::MakeFromConstants(context, arguments[0]->fPosition, in optimize_intrinsic_call()
827 auto Pack = [&](int n) -> unsigned int { 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()
848 const double unpacked[2] = {Intrinsics::evaluate_clamp(double(a) / 32767.0, -1.0, 1.0), in optimize_intrinsic_call()
849 Intrinsics::evaluate_clamp(double(b) / 32767.0, -1.0, 1.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()
873 auto X = [&](int n) -> float { return Get(0, n); }; in optimize_intrinsic_call()
874 auto Y = [&](int n) -> float { return Get(1, n); }; in optimize_intrinsic_call()
875 SkASSERT(arguments[0]->type().columns() == 3); // the vec2 form is not a real intrinsic in optimize_intrinsic_call()
877 double vec[3] = {X(1) * Y(2) - Y(1) * X(2), in optimize_intrinsic_call()
878 X(2) * Y(0) - Y(2) * X(0), in optimize_intrinsic_call()
879 X(0) * Y(1) - Y(0) * X(1)}; 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()
1006 return std::make_unique<FunctionCall>(pos, &this->type(), &this->function(), in clone()
1007 this->arguments().clone()); in clone()
1011 std::string result = std::string(this->function().name()) + "("; in description()
1013 for (const std::unique_ptr<Expression>& arg : this->arguments()) { in description()
1015 result += arg->description(OperatorPrecedence::kSequence); in description()
1027 // The only SkSL type that supports pixel-format qualifiers is a storage texture. in argument_and_parameter_flags_match()
1031 if (!argument.is<VariableReference>()) { in argument_and_parameter_flags_match()
1035 // The variable's pixel-format flags must match. (Only one pixel-format bit can be set.) in argument_and_parameter_flags_match()
1050 * arguments of the function to the required types. Cost has no particular meaning other than "lower
1051 * costs are preferred". Returns CoercionCost::Impossible() if the call is not valid. This is never
1056 const ExpressionArray& arguments) { in call_cost() argument
1057 // Strict-ES2 programs can never call an `$es3` function. in call_cost()
1058 if (context.fConfig->strictES2Mode() && function.modifierFlags().isES3()) { in call_cost()
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()
1072 // is never a match. 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
1092 if (!overloadChain->nextOverload()) { in FindBestFunctionForCall()
1097 for (const FunctionDeclaration* f = overloadChain; f != nullptr; f = f->nextOverload()) { in FindBestFunctionForCall()
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()
1112 result += arg->type().displayName(); in build_argument_type_list()
1120 ExpressionArray arguments) { in Convert() argument
1121 switch (functionValue->kind()) { in Convert()
1125 functionValue->as<TypeReference>().value(), in Convert()
1126 std::move(arguments)); in Convert()
1128 const FunctionReference& ref = functionValue->as<FunctionReference>(); in Convert()
1130 arguments); in Convert()
1132 return FunctionCall::Convert(context, pos, *best, std::move(arguments)); in Convert()
1134 std::string msg = "no match for " + std::string(ref.overloadChain()->name()) + in Convert()
1135 build_argument_type_list(arguments); in Convert()
1136 context.fErrors->error(pos, msg); in Convert()
1140 MethodReference& ref = functionValue->as<MethodReference>(); 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()
1150 "::" + std::string(ref.overloadChain()->name().substr(1)) + in Convert()
1151 build_argument_type_list(SkSpan(arguments).first(arguments.size() - 1)); in Convert()
1152 context.fErrors->error(pos, msg); in Convert()
1156 functionValue->fPosition = pos; in Convert()
1159 context.fErrors->error(pos, "not a function"); in Convert()
1167 ExpressionArray arguments) { in Convert() argument
1169 if (context.fConfig->strictES2Mode() && function.modifierFlags().isES3()) { in Convert()
1170 context.fErrors->error(pos, "call to '" + function.description() + "' is not supported"); in Convert()
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()
1182 context.fErrors->error(pos, msg); 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()
1192 context.fErrors->error(arg.position(), "expected argument of type '" + in Convert()
1203 if (!function.determineFinalTypes(arguments, &types, &returnType)) { in Convert()
1205 build_argument_type_list(arguments); in Convert()
1206 context.fErrors->error(pos, msg); 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()
1216 // Update the refKind on out-parameters, and ensure that they are actually assignable. in Convert()
1217 ModifierFlags paramFlags = function.parameters()[i]->modifierFlags(); in Convert()
1222 if (!Analysis::UpdateVariableRefKind(arguments[i].get(), refKind, context.fErrors)) { in Convert()
1229 context.fErrors->error(pos, "call to 'main' is not allowed"); in Convert()
1234 // This is a method call on an effect child. Translate it into a ChildCall, which simplifies 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()
1251 // We might be able to optimize built-in intrinsics. in Make()
1252 if (function.isIntrinsic() && has_compile_time_constant_arguments(arguments)) { in Make()
1253 // The function is an intrinsic and all inputs are compile-time constants. Optimize it. in Make()
1257 arguments, in Make()
1259 expr->fPosition = pos; in Make()
1264 return std::make_unique<FunctionCall>(pos, returnType, &function, std::move(arguments)); in Make()