1/* 2 * Copyright © 2010 Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 * DEALINGS IN THE SOFTWARE. 22 */ 23 24#include "glsl_symbol_table.h" 25#include "ast.h" 26#include "compiler/glsl_types.h" 27#include "ir.h" 28#include "main/shader_types.h" 29#include "main/consts_exts.h" 30#include "main/shaderobj.h" 31#include "builtin_functions.h" 32 33static ir_rvalue * 34convert_component(ir_rvalue *src, const glsl_type *desired_type); 35 36static unsigned 37process_parameters(exec_list *instructions, exec_list *actual_parameters, 38 exec_list *parameters, 39 struct _mesa_glsl_parse_state *state) 40{ 41 void *mem_ctx = state; 42 unsigned count = 0; 43 44 foreach_list_typed(ast_node, ast, link, parameters) { 45 /* We need to process the parameters first in order to know if we can 46 * raise or not a unitialized warning. Calling set_is_lhs silence the 47 * warning for now. Raising the warning or not will be checked at 48 * verify_parameter_modes. 49 */ 50 ast->set_is_lhs(true); 51 ir_rvalue *result = ast->hir(instructions, state); 52 53 /* Error happened processing function parameter */ 54 if (!result) { 55 actual_parameters->push_tail(ir_rvalue::error_value(mem_ctx)); 56 count++; 57 continue; 58 } 59 60 ir_constant *const constant = 61 result->constant_expression_value(mem_ctx); 62 63 if (constant != NULL) 64 result = constant; 65 66 actual_parameters->push_tail(result); 67 count++; 68 } 69 70 return count; 71} 72 73 74/** 75 * Generate a source prototype for a function signature 76 * 77 * \param return_type Return type of the function. May be \c NULL. 78 * \param name Name of the function. 79 * \param parameters List of \c ir_instruction nodes representing the 80 * parameter list for the function. This may be either a 81 * formal (\c ir_variable) or actual (\c ir_rvalue) 82 * parameter list. Only the type is used. 83 * 84 * \return 85 * A ralloced string representing the prototype of the function. 86 */ 87char * 88prototype_string(const glsl_type *return_type, const char *name, 89 exec_list *parameters) 90{ 91 char *str = NULL; 92 93 if (return_type != NULL) 94 str = ralloc_asprintf(NULL, "%s ", return_type->name); 95 96 ralloc_asprintf_append(&str, "%s(", name); 97 98 const char *comma = ""; 99 foreach_in_list(const ir_variable, param, parameters) { 100 ralloc_asprintf_append(&str, "%s%s", comma, param->type->name); 101 comma = ", "; 102 } 103 104 ralloc_strcat(&str, ")"); 105 return str; 106} 107 108static bool 109verify_image_parameter(YYLTYPE *loc, _mesa_glsl_parse_state *state, 110 const ir_variable *formal, const ir_variable *actual) 111{ 112 /** 113 * From the ARB_shader_image_load_store specification: 114 * 115 * "The values of image variables qualified with coherent, 116 * volatile, restrict, readonly, or writeonly may not be passed 117 * to functions whose formal parameters lack such 118 * qualifiers. [...] It is legal to have additional qualifiers 119 * on a formal parameter, but not to have fewer." 120 */ 121 if (actual->data.memory_coherent && !formal->data.memory_coherent) { 122 _mesa_glsl_error(loc, state, 123 "function call parameter `%s' drops " 124 "`coherent' qualifier", formal->name); 125 return false; 126 } 127 128 if (actual->data.memory_volatile && !formal->data.memory_volatile) { 129 _mesa_glsl_error(loc, state, 130 "function call parameter `%s' drops " 131 "`volatile' qualifier", formal->name); 132 return false; 133 } 134 135 if (actual->data.memory_restrict && !formal->data.memory_restrict) { 136 _mesa_glsl_error(loc, state, 137 "function call parameter `%s' drops " 138 "`restrict' qualifier", formal->name); 139 return false; 140 } 141 142 if (actual->data.memory_read_only && !formal->data.memory_read_only) { 143 _mesa_glsl_error(loc, state, 144 "function call parameter `%s' drops " 145 "`readonly' qualifier", formal->name); 146 return false; 147 } 148 149 if (actual->data.memory_write_only && !formal->data.memory_write_only) { 150 _mesa_glsl_error(loc, state, 151 "function call parameter `%s' drops " 152 "`writeonly' qualifier", formal->name); 153 return false; 154 } 155 156 return true; 157} 158 159static bool 160verify_first_atomic_parameter(YYLTYPE *loc, _mesa_glsl_parse_state *state, 161 ir_variable *var) 162{ 163 if (!var || 164 (!var->is_in_shader_storage_block() && 165 var->data.mode != ir_var_shader_shared)) { 166 _mesa_glsl_error(loc, state, "First argument to atomic function " 167 "must be a buffer or shared variable"); 168 return false; 169 } 170 return true; 171} 172 173static bool 174is_atomic_function(const char *func_name) 175{ 176 return !strcmp(func_name, "atomicAdd") || 177 !strcmp(func_name, "atomicMin") || 178 !strcmp(func_name, "atomicMax") || 179 !strcmp(func_name, "atomicAnd") || 180 !strcmp(func_name, "atomicOr") || 181 !strcmp(func_name, "atomicXor") || 182 !strcmp(func_name, "atomicExchange") || 183 !strcmp(func_name, "atomicCompSwap"); 184} 185 186static bool 187verify_atomic_image_parameter_qualifier(YYLTYPE *loc, _mesa_glsl_parse_state *state, 188 ir_variable *var) 189{ 190 if (!var || 191 (var->data.image_format != PIPE_FORMAT_R32_UINT && 192 var->data.image_format != PIPE_FORMAT_R32_SINT && 193 var->data.image_format != PIPE_FORMAT_R32_FLOAT)) { 194 _mesa_glsl_error(loc, state, "Image atomic functions should use r32i/r32ui " 195 "format qualifier"); 196 return false; 197 } 198 return true; 199} 200 201static bool 202is_atomic_image_function(const char *func_name) 203{ 204 return !strcmp(func_name, "imageAtomicAdd") || 205 !strcmp(func_name, "imageAtomicMin") || 206 !strcmp(func_name, "imageAtomicMax") || 207 !strcmp(func_name, "imageAtomicAnd") || 208 !strcmp(func_name, "imageAtomicOr") || 209 !strcmp(func_name, "imageAtomicXor") || 210 !strcmp(func_name, "imageAtomicExchange") || 211 !strcmp(func_name, "imageAtomicCompSwap") || 212 !strcmp(func_name, "imageAtomicIncWrap") || 213 !strcmp(func_name, "imageAtomicDecWrap"); 214} 215 216 217/** 218 * Verify that 'out' and 'inout' actual parameters are lvalues. Also, verify 219 * that 'const_in' formal parameters (an extension in our IR) correspond to 220 * ir_constant actual parameters. 221 */ 222static bool 223verify_parameter_modes(_mesa_glsl_parse_state *state, 224 ir_function_signature *sig, 225 exec_list &actual_ir_parameters, 226 exec_list &actual_ast_parameters) 227{ 228 exec_node *actual_ir_node = actual_ir_parameters.get_head_raw(); 229 exec_node *actual_ast_node = actual_ast_parameters.get_head_raw(); 230 231 foreach_in_list(const ir_variable, formal, &sig->parameters) { 232 /* The lists must be the same length. */ 233 assert(!actual_ir_node->is_tail_sentinel()); 234 assert(!actual_ast_node->is_tail_sentinel()); 235 236 const ir_rvalue *const actual = (ir_rvalue *) actual_ir_node; 237 const ast_expression *const actual_ast = 238 exec_node_data(ast_expression, actual_ast_node, link); 239 240 YYLTYPE loc = actual_ast->get_location(); 241 242 /* Verify that 'const_in' parameters are ir_constants. */ 243 if (formal->data.mode == ir_var_const_in && 244 actual->ir_type != ir_type_constant) { 245 _mesa_glsl_error(&loc, state, 246 "parameter `in %s' must be a constant expression", 247 formal->name); 248 return false; 249 } 250 251 /* Verify that shader_in parameters are shader inputs */ 252 if (formal->data.must_be_shader_input) { 253 const ir_rvalue *val = actual; 254 255 /* GLSL 4.40 allows swizzles, while earlier GLSL versions do not. */ 256 if (val->ir_type == ir_type_swizzle) { 257 if (!state->is_version(440, 0)) { 258 _mesa_glsl_error(&loc, state, 259 "parameter `%s` must not be swizzled", 260 formal->name); 261 return false; 262 } 263 val = ((ir_swizzle *)val)->val; 264 } 265 266 for (;;) { 267 if (val->ir_type == ir_type_dereference_array) { 268 val = ((ir_dereference_array *)val)->array; 269 } else if (val->ir_type == ir_type_dereference_record && 270 !state->es_shader) { 271 val = ((ir_dereference_record *)val)->record; 272 } else 273 break; 274 } 275 276 ir_variable *var = NULL; 277 if (const ir_dereference_variable *deref_var = val->as_dereference_variable()) 278 var = deref_var->variable_referenced(); 279 280 if (!var || var->data.mode != ir_var_shader_in) { 281 _mesa_glsl_error(&loc, state, 282 "parameter `%s` must be a shader input", 283 formal->name); 284 return false; 285 } 286 287 var->data.must_be_shader_input = 1; 288 } 289 290 /* Verify that 'out' and 'inout' actual parameters are lvalues. */ 291 if (formal->data.mode == ir_var_function_out 292 || formal->data.mode == ir_var_function_inout) { 293 const char *mode = NULL; 294 switch (formal->data.mode) { 295 case ir_var_function_out: mode = "out"; break; 296 case ir_var_function_inout: mode = "inout"; break; 297 default: assert(false); break; 298 } 299 300 /* This AST-based check catches errors like f(i++). The IR-based 301 * is_lvalue() is insufficient because the actual parameter at the 302 * IR-level is just a temporary value, which is an l-value. 303 */ 304 if (actual_ast->non_lvalue_description != NULL) { 305 _mesa_glsl_error(&loc, state, 306 "function parameter '%s %s' references a %s", 307 mode, formal->name, 308 actual_ast->non_lvalue_description); 309 return false; 310 } 311 312 ir_variable *var = actual->variable_referenced(); 313 314 if (var && formal->data.mode == ir_var_function_inout) { 315 if ((var->data.mode == ir_var_auto || 316 var->data.mode == ir_var_shader_out) && 317 !var->data.assigned && 318 !is_gl_identifier(var->name)) { 319 _mesa_glsl_warning(&loc, state, "`%s' used uninitialized", 320 var->name); 321 } 322 } 323 324 if (var) 325 var->data.assigned = true; 326 327 if (var && var->data.read_only) { 328 _mesa_glsl_error(&loc, state, 329 "function parameter '%s %s' references the " 330 "read-only variable '%s'", 331 mode, formal->name, 332 actual->variable_referenced()->name); 333 return false; 334 } else if (!actual->is_lvalue(state)) { 335 _mesa_glsl_error(&loc, state, 336 "function parameter '%s %s' is not an lvalue", 337 mode, formal->name); 338 return false; 339 } 340 } else { 341 assert(formal->data.mode == ir_var_function_in || 342 formal->data.mode == ir_var_const_in); 343 ir_variable *var = actual->variable_referenced(); 344 if (var) { 345 if ((var->data.mode == ir_var_auto || 346 var->data.mode == ir_var_shader_out) && 347 !var->data.assigned && 348 !is_gl_identifier(var->name)) { 349 _mesa_glsl_warning(&loc, state, "`%s' used uninitialized", 350 var->name); 351 } 352 } 353 } 354 355 if (formal->type->is_image() && 356 actual->variable_referenced()) { 357 if (!verify_image_parameter(&loc, state, formal, 358 actual->variable_referenced())) 359 return false; 360 } 361 362 actual_ir_node = actual_ir_node->next; 363 actual_ast_node = actual_ast_node->next; 364 } 365 366 /* The first parameter of atomic functions must be a buffer variable */ 367 const char *func_name = sig->function_name(); 368 bool is_atomic = is_atomic_function(func_name); 369 if (is_atomic) { 370 const ir_rvalue *const actual = 371 (ir_rvalue *) actual_ir_parameters.get_head_raw(); 372 373 const ast_expression *const actual_ast = 374 exec_node_data(ast_expression, 375 actual_ast_parameters.get_head_raw(), link); 376 YYLTYPE loc = actual_ast->get_location(); 377 378 if (!verify_first_atomic_parameter(&loc, state, 379 actual->variable_referenced())) { 380 return false; 381 } 382 } else if (is_atomic_image_function(func_name)) { 383 const ir_rvalue *const actual = 384 (ir_rvalue *) actual_ir_parameters.get_head_raw(); 385 386 const ast_expression *const actual_ast = 387 exec_node_data(ast_expression, 388 actual_ast_parameters.get_head_raw(), link); 389 YYLTYPE loc = actual_ast->get_location(); 390 391 if (!verify_atomic_image_parameter_qualifier(&loc, state, 392 actual->variable_referenced())) { 393 return false; 394 } 395 } 396 397 return true; 398} 399 400struct copy_index_deref_data { 401 void *mem_ctx; 402 exec_list *before_instructions; 403}; 404 405static void 406copy_index_derefs_to_temps(ir_instruction *ir, void *data) 407{ 408 struct copy_index_deref_data *d = (struct copy_index_deref_data *)data; 409 410 if (ir->ir_type == ir_type_dereference_array) { 411 ir_dereference_array *a = (ir_dereference_array *) ir; 412 ir = a->array->as_dereference(); 413 414 ir_rvalue *idx = a->array_index; 415 ir_variable *var = idx->variable_referenced(); 416 417 /* If the index is read only it cannot change so there is no need 418 * to copy it. 419 */ 420 if (!var || var->data.read_only || var->data.memory_read_only) 421 return; 422 423 ir_variable *tmp = new(d->mem_ctx) ir_variable(idx->type, "idx_tmp", 424 ir_var_temporary); 425 d->before_instructions->push_tail(tmp); 426 427 ir_dereference_variable *const deref_tmp_1 = 428 new(d->mem_ctx) ir_dereference_variable(tmp); 429 ir_assignment *const assignment = 430 new(d->mem_ctx) ir_assignment(deref_tmp_1, 431 idx->clone(d->mem_ctx, NULL)); 432 d->before_instructions->push_tail(assignment); 433 434 /* Replace the array index with a dereference of the new temporary */ 435 ir_dereference_variable *const deref_tmp_2 = 436 new(d->mem_ctx) ir_dereference_variable(tmp); 437 a->array_index = deref_tmp_2; 438 } 439} 440 441static void 442fix_parameter(void *mem_ctx, ir_rvalue *actual, const glsl_type *formal_type, 443 exec_list *before_instructions, exec_list *after_instructions, 444 bool parameter_is_inout) 445{ 446 ir_expression *const expr = actual->as_expression(); 447 448 /* If the types match exactly and the parameter is not a vector-extract, 449 * nothing needs to be done to fix the parameter. 450 */ 451 if (formal_type == actual->type 452 && (expr == NULL || expr->operation != ir_binop_vector_extract) 453 && actual->as_dereference_variable()) 454 return; 455 456 /* An array index could also be an out variable so we need to make a copy 457 * of them before the function is called. 458 */ 459 if (!actual->as_dereference_variable()) { 460 struct copy_index_deref_data data; 461 data.mem_ctx = mem_ctx; 462 data.before_instructions = before_instructions; 463 464 visit_tree(actual, copy_index_derefs_to_temps, &data); 465 } 466 467 /* To convert an out parameter, we need to create a temporary variable to 468 * hold the value before conversion, and then perform the conversion after 469 * the function call returns. 470 * 471 * This has the effect of transforming code like this: 472 * 473 * void f(out int x); 474 * float value; 475 * f(value); 476 * 477 * Into IR that's equivalent to this: 478 * 479 * void f(out int x); 480 * float value; 481 * int out_parameter_conversion; 482 * f(out_parameter_conversion); 483 * value = float(out_parameter_conversion); 484 * 485 * If the parameter is an ir_expression of ir_binop_vector_extract, 486 * additional conversion is needed in the post-call re-write. 487 */ 488 ir_variable *tmp = 489 new(mem_ctx) ir_variable(formal_type, "inout_tmp", ir_var_temporary); 490 491 before_instructions->push_tail(tmp); 492 493 /* If the parameter is an inout parameter, copy the value of the actual 494 * parameter to the new temporary. Note that no type conversion is allowed 495 * here because inout parameters must match types exactly. 496 */ 497 if (parameter_is_inout) { 498 /* Inout parameters should never require conversion, since that would 499 * require an implicit conversion to exist both to and from the formal 500 * parameter type, and there are no bidirectional implicit conversions. 501 */ 502 assert (actual->type == formal_type); 503 504 ir_dereference_variable *const deref_tmp_1 = 505 new(mem_ctx) ir_dereference_variable(tmp); 506 ir_assignment *const assignment = 507 new(mem_ctx) ir_assignment(deref_tmp_1, actual->clone(mem_ctx, NULL)); 508 before_instructions->push_tail(assignment); 509 } 510 511 /* Replace the parameter in the call with a dereference of the new 512 * temporary. 513 */ 514 ir_dereference_variable *const deref_tmp_2 = 515 new(mem_ctx) ir_dereference_variable(tmp); 516 actual->replace_with(deref_tmp_2); 517 518 519 /* Copy the temporary variable to the actual parameter with optional 520 * type conversion applied. 521 */ 522 ir_rvalue *rhs = new(mem_ctx) ir_dereference_variable(tmp); 523 if (actual->type != formal_type) 524 rhs = convert_component(rhs, actual->type); 525 526 ir_rvalue *lhs = actual; 527 if (expr != NULL && expr->operation == ir_binop_vector_extract) { 528 lhs = new(mem_ctx) ir_dereference_array(expr->operands[0]->clone(mem_ctx, 529 NULL), 530 expr->operands[1]->clone(mem_ctx, 531 NULL)); 532 } 533 534 ir_assignment *const assignment_2 = new(mem_ctx) ir_assignment(lhs, rhs); 535 after_instructions->push_tail(assignment_2); 536} 537 538/** 539 * Generate a function call. 540 * 541 * For non-void functions, this returns a dereference of the temporary 542 * variable which stores the return value for the call. For void functions, 543 * this returns NULL. 544 */ 545static ir_rvalue * 546generate_call(exec_list *instructions, ir_function_signature *sig, 547 exec_list *actual_parameters, 548 ir_variable *sub_var, 549 ir_rvalue *array_idx, 550 struct _mesa_glsl_parse_state *state) 551{ 552 void *ctx = state; 553 exec_list post_call_conversions; 554 555 /* Perform implicit conversion of arguments. For out parameters, we need 556 * to place them in a temporary variable and do the conversion after the 557 * call takes place. Since we haven't emitted the call yet, we'll place 558 * the post-call conversions in a temporary exec_list, and emit them later. 559 */ 560 foreach_two_lists(formal_node, &sig->parameters, 561 actual_node, actual_parameters) { 562 ir_rvalue *actual = (ir_rvalue *) actual_node; 563 ir_variable *formal = (ir_variable *) formal_node; 564 565 if (formal->type->is_numeric() || formal->type->is_boolean()) { 566 switch (formal->data.mode) { 567 case ir_var_const_in: 568 case ir_var_function_in: { 569 ir_rvalue *converted 570 = convert_component(actual, formal->type); 571 actual->replace_with(converted); 572 break; 573 } 574 case ir_var_function_out: 575 case ir_var_function_inout: 576 fix_parameter(ctx, actual, formal->type, 577 instructions, &post_call_conversions, 578 formal->data.mode == ir_var_function_inout); 579 break; 580 default: 581 assert (!"Illegal formal parameter mode"); 582 break; 583 } 584 } 585 } 586 587 /* Section 4.3.2 (Const) of the GLSL 1.10.59 spec says: 588 * 589 * "Initializers for const declarations must be formed from literal 590 * values, other const variables (not including function call 591 * paramaters), or expressions of these. 592 * 593 * Constructors may be used in such expressions, but function calls may 594 * not." 595 * 596 * Section 4.3.3 (Constant Expressions) of the GLSL 1.20.8 spec says: 597 * 598 * "A constant expression is one of 599 * 600 * ... 601 * 602 * - a built-in function call whose arguments are all constant 603 * expressions, with the exception of the texture lookup 604 * functions, the noise functions, and ftransform. The built-in 605 * functions dFdx, dFdy, and fwidth must return 0 when evaluated 606 * inside an initializer with an argument that is a constant 607 * expression." 608 * 609 * Section 5.10 (Constant Expressions) of the GLSL ES 1.00.17 spec says: 610 * 611 * "A constant expression is one of 612 * 613 * ... 614 * 615 * - a built-in function call whose arguments are all constant 616 * expressions, with the exception of the texture lookup 617 * functions." 618 * 619 * Section 4.3.3 (Constant Expressions) of the GLSL ES 3.00.4 spec says: 620 * 621 * "A constant expression is one of 622 * 623 * ... 624 * 625 * - a built-in function call whose arguments are all constant 626 * expressions, with the exception of the texture lookup 627 * functions. The built-in functions dFdx, dFdy, and fwidth must 628 * return 0 when evaluated inside an initializer with an argument 629 * that is a constant expression." 630 * 631 * If the function call is a constant expression, don't generate any 632 * instructions; just generate an ir_constant. 633 */ 634 if (state->is_version(120, 100) || 635 state->consts->AllowGLSLBuiltinConstantExpression) { 636 ir_constant *value = sig->constant_expression_value(ctx, 637 actual_parameters, 638 NULL); 639 if (value != NULL) { 640 return value; 641 } 642 } 643 644 ir_dereference_variable *deref = NULL; 645 if (!sig->return_type->is_void()) { 646 /* Create a new temporary to hold the return value. */ 647 char *const name = ir_variable::temporaries_allocate_names 648 ? ralloc_asprintf(ctx, "%s_retval", sig->function_name()) 649 : NULL; 650 651 ir_variable *var; 652 653 var = new(ctx) ir_variable(sig->return_type, name, ir_var_temporary); 654 instructions->push_tail(var); 655 656 ralloc_free(name); 657 658 deref = new(ctx) ir_dereference_variable(var); 659 } 660 661 ir_call *call = new(ctx) ir_call(sig, deref, 662 actual_parameters, sub_var, array_idx); 663 instructions->push_tail(call); 664 665 /* Also emit any necessary out-parameter conversions. */ 666 instructions->append_list(&post_call_conversions); 667 668 return deref ? deref->clone(ctx, NULL) : NULL; 669} 670 671/** 672 * Given a function name and parameter list, find the matching signature. 673 */ 674static ir_function_signature * 675match_function_by_name(const char *name, 676 exec_list *actual_parameters, 677 struct _mesa_glsl_parse_state *state) 678{ 679 ir_function *f = state->symbols->get_function(name); 680 ir_function_signature *local_sig = NULL; 681 ir_function_signature *sig = NULL; 682 683 /* Is the function hidden by a record type constructor? */ 684 if (state->symbols->get_type(name)) 685 return sig; /* no match */ 686 687 /* Is the function hidden by a variable (impossible in 1.10)? */ 688 if (!state->symbols->separate_function_namespace 689 && state->symbols->get_variable(name)) 690 return sig; /* no match */ 691 692 if (f != NULL) { 693 /* In desktop GL, the presence of a user-defined signature hides any 694 * built-in signatures, so we must ignore them. In contrast, in ES2 695 * user-defined signatures add new overloads, so we must consider them. 696 */ 697 bool allow_builtins = state->es_shader || !f->has_user_signature(); 698 699 /* Look for a match in the local shader. If exact, we're done. */ 700 bool is_exact = false; 701 sig = local_sig = f->matching_signature(state, actual_parameters, 702 allow_builtins, &is_exact); 703 if (is_exact) 704 return sig; 705 706 if (!allow_builtins) 707 return sig; 708 } 709 710 /* Local shader has no exact candidates; check the built-ins. */ 711 sig = _mesa_glsl_find_builtin_function(state, name, actual_parameters); 712 713 /* if _mesa_glsl_find_builtin_function failed, fall back to the result 714 * of choose_best_inexact_overload() instead. This should only affect 715 * GLES. 716 */ 717 return sig ? sig : local_sig; 718} 719 720static ir_function_signature * 721match_subroutine_by_name(const char *name, 722 exec_list *actual_parameters, 723 struct _mesa_glsl_parse_state *state, 724 ir_variable **var_r) 725{ 726 void *ctx = state; 727 ir_function_signature *sig = NULL; 728 ir_function *f, *found = NULL; 729 const char *new_name; 730 ir_variable *var; 731 bool is_exact = false; 732 733 new_name = 734 ralloc_asprintf(ctx, "%s_%s", 735 _mesa_shader_stage_to_subroutine_prefix(state->stage), 736 name); 737 var = state->symbols->get_variable(new_name); 738 if (!var) 739 return NULL; 740 741 for (int i = 0; i < state->num_subroutine_types; i++) { 742 f = state->subroutine_types[i]; 743 if (strcmp(f->name, var->type->without_array()->name)) 744 continue; 745 found = f; 746 break; 747 } 748 749 if (!found) 750 return NULL; 751 *var_r = var; 752 sig = found->matching_signature(state, actual_parameters, 753 false, &is_exact); 754 return sig; 755} 756 757static ir_rvalue * 758generate_array_index(void *mem_ctx, exec_list *instructions, 759 struct _mesa_glsl_parse_state *state, YYLTYPE loc, 760 const ast_expression *array, ast_expression *idx, 761 const char **function_name, exec_list *actual_parameters) 762{ 763 if (array->oper == ast_array_index) { 764 /* This handles arrays of arrays */ 765 ir_rvalue *outer_array = generate_array_index(mem_ctx, instructions, 766 state, loc, 767 array->subexpressions[0], 768 array->subexpressions[1], 769 function_name, 770 actual_parameters); 771 ir_rvalue *outer_array_idx = idx->hir(instructions, state); 772 773 YYLTYPE index_loc = idx->get_location(); 774 return _mesa_ast_array_index_to_hir(mem_ctx, state, outer_array, 775 outer_array_idx, loc, 776 index_loc); 777 } else { 778 ir_variable *sub_var = NULL; 779 *function_name = array->primary_expression.identifier; 780 781 if (!match_subroutine_by_name(*function_name, actual_parameters, 782 state, &sub_var)) { 783 _mesa_glsl_error(&loc, state, "Unknown subroutine `%s'", 784 *function_name); 785 *function_name = NULL; /* indicate error condition to caller */ 786 return NULL; 787 } 788 789 ir_rvalue *outer_array_idx = idx->hir(instructions, state); 790 return new(mem_ctx) ir_dereference_array(sub_var, outer_array_idx); 791 } 792} 793 794static bool 795function_exists(_mesa_glsl_parse_state *state, 796 struct glsl_symbol_table *symbols, const char *name) 797{ 798 ir_function *f = symbols->get_function(name); 799 if (f != NULL) { 800 foreach_in_list(ir_function_signature, sig, &f->signatures) { 801 if (sig->is_builtin() && !sig->is_builtin_available(state)) 802 continue; 803 return true; 804 } 805 } 806 return false; 807} 808 809static void 810print_function_prototypes(_mesa_glsl_parse_state *state, YYLTYPE *loc, 811 ir_function *f) 812{ 813 if (f == NULL) 814 return; 815 816 foreach_in_list(ir_function_signature, sig, &f->signatures) { 817 if (sig->is_builtin() && !sig->is_builtin_available(state)) 818 continue; 819 820 char *str = prototype_string(sig->return_type, f->name, 821 &sig->parameters); 822 _mesa_glsl_error(loc, state, " %s", str); 823 ralloc_free(str); 824 } 825} 826 827/** 828 * Raise a "no matching function" error, listing all possible overloads the 829 * compiler considered so developers can figure out what went wrong. 830 */ 831static void 832no_matching_function_error(const char *name, 833 YYLTYPE *loc, 834 exec_list *actual_parameters, 835 _mesa_glsl_parse_state *state) 836{ 837 gl_shader *sh = _mesa_glsl_get_builtin_function_shader(); 838 839 if (!function_exists(state, state->symbols, name) 840 && (!state->uses_builtin_functions 841 || !function_exists(state, sh->symbols, name))) { 842 _mesa_glsl_error(loc, state, "no function with name '%s'", name); 843 } else { 844 char *str = prototype_string(NULL, name, actual_parameters); 845 _mesa_glsl_error(loc, state, 846 "no matching function for call to `%s';" 847 " candidates are:", 848 str); 849 ralloc_free(str); 850 851 print_function_prototypes(state, loc, 852 state->symbols->get_function(name)); 853 854 if (state->uses_builtin_functions) { 855 print_function_prototypes(state, loc, 856 sh->symbols->get_function(name)); 857 } 858 } 859} 860 861/** 862 * Perform automatic type conversion of constructor parameters 863 * 864 * This implements the rules in the "Conversion and Scalar Constructors" 865 * section (GLSL 1.10 section 5.4.1), not the "Implicit Conversions" rules. 866 */ 867static ir_rvalue * 868convert_component(ir_rvalue *src, const glsl_type *desired_type) 869{ 870 void *ctx = ralloc_parent(src); 871 const unsigned a = desired_type->base_type; 872 const unsigned b = src->type->base_type; 873 ir_expression *result = NULL; 874 875 if (src->type->is_error()) 876 return src; 877 878 assert(a <= GLSL_TYPE_IMAGE); 879 assert(b <= GLSL_TYPE_IMAGE); 880 881 if (a == b) 882 return src; 883 884 switch (a) { 885 case GLSL_TYPE_UINT: 886 switch (b) { 887 case GLSL_TYPE_INT: 888 result = new(ctx) ir_expression(ir_unop_i2u, src); 889 break; 890 case GLSL_TYPE_FLOAT: 891 result = new(ctx) ir_expression(ir_unop_f2u, src); 892 break; 893 case GLSL_TYPE_BOOL: 894 result = new(ctx) ir_expression(ir_unop_i2u, 895 new(ctx) ir_expression(ir_unop_b2i, 896 src)); 897 break; 898 case GLSL_TYPE_DOUBLE: 899 result = new(ctx) ir_expression(ir_unop_d2u, src); 900 break; 901 case GLSL_TYPE_UINT64: 902 result = new(ctx) ir_expression(ir_unop_u642u, src); 903 break; 904 case GLSL_TYPE_INT64: 905 result = new(ctx) ir_expression(ir_unop_i642u, src); 906 break; 907 case GLSL_TYPE_SAMPLER: 908 result = new(ctx) ir_expression(ir_unop_unpack_sampler_2x32, src); 909 break; 910 case GLSL_TYPE_IMAGE: 911 result = new(ctx) ir_expression(ir_unop_unpack_image_2x32, src); 912 break; 913 } 914 break; 915 case GLSL_TYPE_INT: 916 switch (b) { 917 case GLSL_TYPE_UINT: 918 result = new(ctx) ir_expression(ir_unop_u2i, src); 919 break; 920 case GLSL_TYPE_FLOAT: 921 result = new(ctx) ir_expression(ir_unop_f2i, src); 922 break; 923 case GLSL_TYPE_BOOL: 924 result = new(ctx) ir_expression(ir_unop_b2i, src); 925 break; 926 case GLSL_TYPE_DOUBLE: 927 result = new(ctx) ir_expression(ir_unop_d2i, src); 928 break; 929 case GLSL_TYPE_UINT64: 930 result = new(ctx) ir_expression(ir_unop_u642i, src); 931 break; 932 case GLSL_TYPE_INT64: 933 result = new(ctx) ir_expression(ir_unop_i642i, src); 934 break; 935 } 936 break; 937 case GLSL_TYPE_FLOAT: 938 switch (b) { 939 case GLSL_TYPE_UINT: 940 result = new(ctx) ir_expression(ir_unop_u2f, desired_type, src, NULL); 941 break; 942 case GLSL_TYPE_INT: 943 result = new(ctx) ir_expression(ir_unop_i2f, desired_type, src, NULL); 944 break; 945 case GLSL_TYPE_BOOL: 946 result = new(ctx) ir_expression(ir_unop_b2f, desired_type, src, NULL); 947 break; 948 case GLSL_TYPE_DOUBLE: 949 result = new(ctx) ir_expression(ir_unop_d2f, desired_type, src, NULL); 950 break; 951 case GLSL_TYPE_UINT64: 952 result = new(ctx) ir_expression(ir_unop_u642f, desired_type, src, NULL); 953 break; 954 case GLSL_TYPE_INT64: 955 result = new(ctx) ir_expression(ir_unop_i642f, desired_type, src, NULL); 956 break; 957 } 958 break; 959 case GLSL_TYPE_BOOL: 960 switch (b) { 961 case GLSL_TYPE_UINT: 962 result = new(ctx) ir_expression(ir_unop_i2b, 963 new(ctx) ir_expression(ir_unop_u2i, 964 src)); 965 break; 966 case GLSL_TYPE_INT: 967 result = new(ctx) ir_expression(ir_unop_i2b, desired_type, src, NULL); 968 break; 969 case GLSL_TYPE_FLOAT: 970 result = new(ctx) ir_expression(ir_unop_f2b, desired_type, src, NULL); 971 break; 972 case GLSL_TYPE_DOUBLE: 973 result = new(ctx) ir_expression(ir_unop_d2b, desired_type, src, NULL); 974 break; 975 case GLSL_TYPE_UINT64: 976 result = new(ctx) ir_expression(ir_unop_i642b, 977 new(ctx) ir_expression(ir_unop_u642i64, 978 src)); 979 break; 980 case GLSL_TYPE_INT64: 981 result = new(ctx) ir_expression(ir_unop_i642b, desired_type, src, NULL); 982 break; 983 } 984 break; 985 case GLSL_TYPE_DOUBLE: 986 switch (b) { 987 case GLSL_TYPE_INT: 988 result = new(ctx) ir_expression(ir_unop_i2d, src); 989 break; 990 case GLSL_TYPE_UINT: 991 result = new(ctx) ir_expression(ir_unop_u2d, src); 992 break; 993 case GLSL_TYPE_BOOL: 994 result = new(ctx) ir_expression(ir_unop_f2d, 995 new(ctx) ir_expression(ir_unop_b2f, 996 src)); 997 break; 998 case GLSL_TYPE_FLOAT: 999 result = new(ctx) ir_expression(ir_unop_f2d, desired_type, src, NULL); 1000 break; 1001 case GLSL_TYPE_UINT64: 1002 result = new(ctx) ir_expression(ir_unop_u642d, desired_type, src, NULL); 1003 break; 1004 case GLSL_TYPE_INT64: 1005 result = new(ctx) ir_expression(ir_unop_i642d, desired_type, src, NULL); 1006 break; 1007 } 1008 break; 1009 case GLSL_TYPE_UINT64: 1010 switch (b) { 1011 case GLSL_TYPE_INT: 1012 result = new(ctx) ir_expression(ir_unop_i2u64, src); 1013 break; 1014 case GLSL_TYPE_UINT: 1015 result = new(ctx) ir_expression(ir_unop_u2u64, src); 1016 break; 1017 case GLSL_TYPE_BOOL: 1018 result = new(ctx) ir_expression(ir_unop_i642u64, 1019 new(ctx) ir_expression(ir_unop_b2i64, 1020 src)); 1021 break; 1022 case GLSL_TYPE_FLOAT: 1023 result = new(ctx) ir_expression(ir_unop_f2u64, src); 1024 break; 1025 case GLSL_TYPE_DOUBLE: 1026 result = new(ctx) ir_expression(ir_unop_d2u64, src); 1027 break; 1028 case GLSL_TYPE_INT64: 1029 result = new(ctx) ir_expression(ir_unop_i642u64, src); 1030 break; 1031 } 1032 break; 1033 case GLSL_TYPE_INT64: 1034 switch (b) { 1035 case GLSL_TYPE_INT: 1036 result = new(ctx) ir_expression(ir_unop_i2i64, src); 1037 break; 1038 case GLSL_TYPE_UINT: 1039 result = new(ctx) ir_expression(ir_unop_u2i64, src); 1040 break; 1041 case GLSL_TYPE_BOOL: 1042 result = new(ctx) ir_expression(ir_unop_b2i64, src); 1043 break; 1044 case GLSL_TYPE_FLOAT: 1045 result = new(ctx) ir_expression(ir_unop_f2i64, src); 1046 break; 1047 case GLSL_TYPE_DOUBLE: 1048 result = new(ctx) ir_expression(ir_unop_d2i64, src); 1049 break; 1050 case GLSL_TYPE_UINT64: 1051 result = new(ctx) ir_expression(ir_unop_u642i64, src); 1052 break; 1053 } 1054 break; 1055 case GLSL_TYPE_SAMPLER: 1056 switch (b) { 1057 case GLSL_TYPE_UINT: 1058 result = new(ctx) 1059 ir_expression(ir_unop_pack_sampler_2x32, desired_type, src); 1060 break; 1061 } 1062 break; 1063 case GLSL_TYPE_IMAGE: 1064 switch (b) { 1065 case GLSL_TYPE_UINT: 1066 result = new(ctx) 1067 ir_expression(ir_unop_pack_image_2x32, desired_type, src); 1068 break; 1069 } 1070 break; 1071 } 1072 1073 assert(result != NULL); 1074 assert(result->type == desired_type); 1075 1076 /* Try constant folding; it may fold in the conversion we just added. */ 1077 ir_constant *const constant = result->constant_expression_value(ctx); 1078 return (constant != NULL) ? (ir_rvalue *) constant : (ir_rvalue *) result; 1079} 1080 1081 1082/** 1083 * Perform automatic type and constant conversion of constructor parameters 1084 * 1085 * This implements the rules in the "Implicit Conversions" rules, not the 1086 * "Conversion and Scalar Constructors". 1087 * 1088 * After attempting the implicit conversion, an attempt to convert into a 1089 * constant valued expression is also done. 1090 * 1091 * The \c from \c ir_rvalue is converted "in place". 1092 * 1093 * \param from Operand that is being converted 1094 * \param to Base type the operand will be converted to 1095 * \param state GLSL compiler state 1096 * 1097 * \return 1098 * If the attempt to convert into a constant expression succeeds, \c true is 1099 * returned. Otherwise \c false is returned. 1100 */ 1101static bool 1102implicitly_convert_component(ir_rvalue * &from, const glsl_base_type to, 1103 struct _mesa_glsl_parse_state *state) 1104{ 1105 void *mem_ctx = state; 1106 ir_rvalue *result = from; 1107 1108 if (to != from->type->base_type) { 1109 const glsl_type *desired_type = 1110 glsl_type::get_instance(to, 1111 from->type->vector_elements, 1112 from->type->matrix_columns); 1113 1114 if (from->type->can_implicitly_convert_to(desired_type, state)) { 1115 /* Even though convert_component() implements the constructor 1116 * conversion rules (not the implicit conversion rules), its safe 1117 * to use it here because we already checked that the implicit 1118 * conversion is legal. 1119 */ 1120 result = convert_component(from, desired_type); 1121 } 1122 } 1123 1124 ir_rvalue *const constant = result->constant_expression_value(mem_ctx); 1125 1126 if (constant != NULL) 1127 result = constant; 1128 1129 if (from != result) { 1130 from->replace_with(result); 1131 from = result; 1132 } 1133 1134 return constant != NULL; 1135} 1136 1137 1138/** 1139 * Dereference a specific component from a scalar, vector, or matrix 1140 */ 1141static ir_rvalue * 1142dereference_component(ir_rvalue *src, unsigned component) 1143{ 1144 void *ctx = ralloc_parent(src); 1145 assert(component < src->type->components()); 1146 1147 /* If the source is a constant, just create a new constant instead of a 1148 * dereference of the existing constant. 1149 */ 1150 ir_constant *constant = src->as_constant(); 1151 if (constant) 1152 return new(ctx) ir_constant(constant, component); 1153 1154 if (src->type->is_scalar()) { 1155 return src; 1156 } else if (src->type->is_vector()) { 1157 return new(ctx) ir_swizzle(src, component, 0, 0, 0, 1); 1158 } else { 1159 assert(src->type->is_matrix()); 1160 1161 /* Dereference a row of the matrix, then call this function again to get 1162 * a specific element from that row. 1163 */ 1164 const int c = component / src->type->column_type()->vector_elements; 1165 const int r = component % src->type->column_type()->vector_elements; 1166 ir_constant *const col_index = new(ctx) ir_constant(c); 1167 ir_dereference *const col = new(ctx) ir_dereference_array(src, 1168 col_index); 1169 1170 col->type = src->type->column_type(); 1171 1172 return dereference_component(col, r); 1173 } 1174 1175 assert(!"Should not get here."); 1176 return NULL; 1177} 1178 1179 1180static ir_rvalue * 1181process_vec_mat_constructor(exec_list *instructions, 1182 const glsl_type *constructor_type, 1183 YYLTYPE *loc, exec_list *parameters, 1184 struct _mesa_glsl_parse_state *state) 1185{ 1186 void *ctx = state; 1187 1188 /* The ARB_shading_language_420pack spec says: 1189 * 1190 * "If an initializer is a list of initializers enclosed in curly braces, 1191 * the variable being declared must be a vector, a matrix, an array, or a 1192 * structure. 1193 * 1194 * int i = { 1 }; // illegal, i is not an aggregate" 1195 */ 1196 if (constructor_type->vector_elements <= 1) { 1197 _mesa_glsl_error(loc, state, "aggregates can only initialize vectors, " 1198 "matrices, arrays, and structs"); 1199 return ir_rvalue::error_value(ctx); 1200 } 1201 1202 exec_list actual_parameters; 1203 const unsigned parameter_count = 1204 process_parameters(instructions, &actual_parameters, parameters, state); 1205 1206 if (parameter_count == 0 1207 || (constructor_type->is_vector() && 1208 constructor_type->vector_elements != parameter_count) 1209 || (constructor_type->is_matrix() && 1210 constructor_type->matrix_columns != parameter_count)) { 1211 _mesa_glsl_error(loc, state, "%s constructor must have %u parameters", 1212 constructor_type->is_vector() ? "vector" : "matrix", 1213 constructor_type->vector_elements); 1214 return ir_rvalue::error_value(ctx); 1215 } 1216 1217 bool all_parameters_are_constant = true; 1218 1219 /* Type cast each parameter and, if possible, fold constants. */ 1220 foreach_in_list_safe(ir_rvalue, ir, &actual_parameters) { 1221 /* Apply implicit conversions (not the scalar constructor rules, see the 1222 * spec quote above!) and attempt to convert the parameter to a constant 1223 * valued expression. After doing so, track whether or not all the 1224 * parameters to the constructor are trivially constant valued 1225 * expressions. 1226 */ 1227 all_parameters_are_constant &= 1228 implicitly_convert_component(ir, constructor_type->base_type, state); 1229 1230 if (constructor_type->is_matrix()) { 1231 if (ir->type != constructor_type->column_type()) { 1232 _mesa_glsl_error(loc, state, "type error in matrix constructor: " 1233 "expected: %s, found %s", 1234 constructor_type->column_type()->name, 1235 ir->type->name); 1236 return ir_rvalue::error_value(ctx); 1237 } 1238 } else if (ir->type != constructor_type->get_scalar_type()) { 1239 _mesa_glsl_error(loc, state, "type error in vector constructor: " 1240 "expected: %s, found %s", 1241 constructor_type->get_scalar_type()->name, 1242 ir->type->name); 1243 return ir_rvalue::error_value(ctx); 1244 } 1245 } 1246 1247 if (all_parameters_are_constant) 1248 return new(ctx) ir_constant(constructor_type, &actual_parameters); 1249 1250 ir_variable *var = new(ctx) ir_variable(constructor_type, "vec_mat_ctor", 1251 ir_var_temporary); 1252 instructions->push_tail(var); 1253 1254 int i = 0; 1255 1256 foreach_in_list(ir_rvalue, rhs, &actual_parameters) { 1257 ir_instruction *assignment = NULL; 1258 1259 if (var->type->is_matrix()) { 1260 ir_rvalue *lhs = 1261 new(ctx) ir_dereference_array(var, new(ctx) ir_constant(i)); 1262 assignment = new(ctx) ir_assignment(lhs, rhs); 1263 } else { 1264 /* use writemask rather than index for vector */ 1265 assert(var->type->is_vector()); 1266 assert(i < 4); 1267 ir_dereference *lhs = new(ctx) ir_dereference_variable(var); 1268 assignment = new(ctx) ir_assignment(lhs, rhs, 1u << i); 1269 } 1270 1271 instructions->push_tail(assignment); 1272 1273 i++; 1274 } 1275 1276 return new(ctx) ir_dereference_variable(var); 1277} 1278 1279 1280static ir_rvalue * 1281process_array_constructor(exec_list *instructions, 1282 const glsl_type *constructor_type, 1283 YYLTYPE *loc, exec_list *parameters, 1284 struct _mesa_glsl_parse_state *state) 1285{ 1286 void *ctx = state; 1287 /* Array constructors come in two forms: sized and unsized. Sized array 1288 * constructors look like 'vec4[2](a, b)', where 'a' and 'b' are vec4 1289 * variables. In this case the number of parameters must exactly match the 1290 * specified size of the array. 1291 * 1292 * Unsized array constructors look like 'vec4[](a, b)', where 'a' and 'b' 1293 * are vec4 variables. In this case the size of the array being constructed 1294 * is determined by the number of parameters. 1295 * 1296 * From page 52 (page 58 of the PDF) of the GLSL 1.50 spec: 1297 * 1298 * "There must be exactly the same number of arguments as the size of 1299 * the array being constructed. If no size is present in the 1300 * constructor, then the array is explicitly sized to the number of 1301 * arguments provided. The arguments are assigned in order, starting at 1302 * element 0, to the elements of the constructed array. Each argument 1303 * must be the same type as the element type of the array, or be a type 1304 * that can be converted to the element type of the array according to 1305 * Section 4.1.10 "Implicit Conversions."" 1306 */ 1307 exec_list actual_parameters; 1308 const unsigned parameter_count = 1309 process_parameters(instructions, &actual_parameters, parameters, state); 1310 bool is_unsized_array = constructor_type->is_unsized_array(); 1311 1312 if ((parameter_count == 0) || 1313 (!is_unsized_array && (constructor_type->length != parameter_count))) { 1314 const unsigned min_param = is_unsized_array 1315 ? 1 : constructor_type->length; 1316 1317 _mesa_glsl_error(loc, state, "array constructor must have %s %u " 1318 "parameter%s", 1319 is_unsized_array ? "at least" : "exactly", 1320 min_param, (min_param <= 1) ? "" : "s"); 1321 return ir_rvalue::error_value(ctx); 1322 } 1323 1324 if (is_unsized_array) { 1325 constructor_type = 1326 glsl_type::get_array_instance(constructor_type->fields.array, 1327 parameter_count); 1328 assert(constructor_type != NULL); 1329 assert(constructor_type->length == parameter_count); 1330 } 1331 1332 bool all_parameters_are_constant = true; 1333 const glsl_type *element_type = constructor_type->fields.array; 1334 1335 /* Type cast each parameter and, if possible, fold constants. */ 1336 foreach_in_list_safe(ir_rvalue, ir, &actual_parameters) { 1337 /* Apply implicit conversions (not the scalar constructor rules, see the 1338 * spec quote above!) and attempt to convert the parameter to a constant 1339 * valued expression. After doing so, track whether or not all the 1340 * parameters to the constructor are trivially constant valued 1341 * expressions. 1342 */ 1343 all_parameters_are_constant &= 1344 implicitly_convert_component(ir, element_type->base_type, state); 1345 1346 if (constructor_type->fields.array->is_unsized_array()) { 1347 /* As the inner parameters of the constructor are created without 1348 * knowledge of each other we need to check to make sure unsized 1349 * parameters of unsized constructors all end up with the same size. 1350 * 1351 * e.g we make sure to fail for a constructor like this: 1352 * vec4[][] a = vec4[][](vec4[](vec4(0.0), vec4(1.0)), 1353 * vec4[](vec4(0.0), vec4(1.0), vec4(1.0)), 1354 * vec4[](vec4(0.0), vec4(1.0))); 1355 */ 1356 if (element_type->is_unsized_array()) { 1357 /* This is the first parameter so just get the type */ 1358 element_type = ir->type; 1359 } else if (element_type != ir->type) { 1360 _mesa_glsl_error(loc, state, "type error in array constructor: " 1361 "expected: %s, found %s", 1362 element_type->name, 1363 ir->type->name); 1364 return ir_rvalue::error_value(ctx); 1365 } 1366 } else if (ir->type != constructor_type->fields.array) { 1367 _mesa_glsl_error(loc, state, "type error in array constructor: " 1368 "expected: %s, found %s", 1369 constructor_type->fields.array->name, 1370 ir->type->name); 1371 return ir_rvalue::error_value(ctx); 1372 } else { 1373 element_type = ir->type; 1374 } 1375 } 1376 1377 if (constructor_type->fields.array->is_unsized_array()) { 1378 constructor_type = 1379 glsl_type::get_array_instance(element_type, 1380 parameter_count); 1381 assert(constructor_type != NULL); 1382 assert(constructor_type->length == parameter_count); 1383 } 1384 1385 if (all_parameters_are_constant) 1386 return new(ctx) ir_constant(constructor_type, &actual_parameters); 1387 1388 ir_variable *var = new(ctx) ir_variable(constructor_type, "array_ctor", 1389 ir_var_temporary); 1390 instructions->push_tail(var); 1391 1392 int i = 0; 1393 foreach_in_list(ir_rvalue, rhs, &actual_parameters) { 1394 ir_rvalue *lhs = new(ctx) ir_dereference_array(var, 1395 new(ctx) ir_constant(i)); 1396 1397 ir_instruction *assignment = new(ctx) ir_assignment(lhs, rhs); 1398 instructions->push_tail(assignment); 1399 1400 i++; 1401 } 1402 1403 return new(ctx) ir_dereference_variable(var); 1404} 1405 1406 1407/** 1408 * Determine if a list consists of a single scalar r-value 1409 */ 1410static bool 1411single_scalar_parameter(exec_list *parameters) 1412{ 1413 const ir_rvalue *const p = (ir_rvalue *) parameters->get_head_raw(); 1414 assert(((ir_rvalue *)p)->as_rvalue() != NULL); 1415 1416 return (p->type->is_scalar() && p->next->is_tail_sentinel()); 1417} 1418 1419 1420/** 1421 * Generate inline code for a vector constructor 1422 * 1423 * The generated constructor code will consist of a temporary variable 1424 * declaration of the same type as the constructor. A sequence of assignments 1425 * from constructor parameters to the temporary will follow. 1426 * 1427 * \return 1428 * An \c ir_dereference_variable of the temprorary generated in the constructor 1429 * body. 1430 */ 1431static ir_rvalue * 1432emit_inline_vector_constructor(const glsl_type *type, 1433 exec_list *instructions, 1434 exec_list *parameters, 1435 void *ctx) 1436{ 1437 assert(!parameters->is_empty()); 1438 1439 ir_variable *var = new(ctx) ir_variable(type, "vec_ctor", ir_var_temporary); 1440 instructions->push_tail(var); 1441 1442 /* There are three kinds of vector constructors. 1443 * 1444 * - Construct a vector from a single scalar by replicating that scalar to 1445 * all components of the vector. 1446 * 1447 * - Construct a vector from at least a matrix. This case should already 1448 * have been taken care of in ast_function_expression::hir by breaking 1449 * down the matrix into a series of column vectors. 1450 * 1451 * - Construct a vector from an arbirary combination of vectors and 1452 * scalars. The components of the constructor parameters are assigned 1453 * to the vector in order until the vector is full. 1454 */ 1455 const unsigned lhs_components = type->components(); 1456 if (single_scalar_parameter(parameters)) { 1457 ir_rvalue *first_param = (ir_rvalue *)parameters->get_head_raw(); 1458 ir_rvalue *rhs = new(ctx) ir_swizzle(first_param, 0, 0, 0, 0, 1459 lhs_components); 1460 ir_dereference_variable *lhs = new(ctx) ir_dereference_variable(var); 1461 const unsigned mask = (1U << lhs_components) - 1; 1462 1463 assert(rhs->type == lhs->type); 1464 1465 ir_instruction *inst = new(ctx) ir_assignment(lhs, rhs, mask); 1466 instructions->push_tail(inst); 1467 } else { 1468 unsigned base_component = 0; 1469 unsigned base_lhs_component = 0; 1470 ir_constant_data data; 1471 unsigned constant_mask = 0, constant_components = 0; 1472 1473 memset(&data, 0, sizeof(data)); 1474 1475 foreach_in_list(ir_rvalue, param, parameters) { 1476 unsigned rhs_components = param->type->components(); 1477 1478 /* Do not try to assign more components to the vector than it has! */ 1479 if ((rhs_components + base_lhs_component) > lhs_components) { 1480 rhs_components = lhs_components - base_lhs_component; 1481 } 1482 1483 const ir_constant *const c = param->as_constant(); 1484 if (c != NULL) { 1485 for (unsigned i = 0; i < rhs_components; i++) { 1486 switch (c->type->base_type) { 1487 case GLSL_TYPE_UINT: 1488 data.u[i + base_component] = c->get_uint_component(i); 1489 break; 1490 case GLSL_TYPE_INT: 1491 data.i[i + base_component] = c->get_int_component(i); 1492 break; 1493 case GLSL_TYPE_FLOAT: 1494 data.f[i + base_component] = c->get_float_component(i); 1495 break; 1496 case GLSL_TYPE_DOUBLE: 1497 data.d[i + base_component] = c->get_double_component(i); 1498 break; 1499 case GLSL_TYPE_BOOL: 1500 data.b[i + base_component] = c->get_bool_component(i); 1501 break; 1502 case GLSL_TYPE_UINT64: 1503 data.u64[i + base_component] = c->get_uint64_component(i); 1504 break; 1505 case GLSL_TYPE_INT64: 1506 data.i64[i + base_component] = c->get_int64_component(i); 1507 break; 1508 default: 1509 assert(!"Should not get here."); 1510 break; 1511 } 1512 } 1513 1514 /* Mask of fields to be written in the assignment. */ 1515 constant_mask |= ((1U << rhs_components) - 1) << base_lhs_component; 1516 constant_components += rhs_components; 1517 1518 base_component += rhs_components; 1519 } 1520 /* Advance the component index by the number of components 1521 * that were just assigned. 1522 */ 1523 base_lhs_component += rhs_components; 1524 } 1525 1526 if (constant_mask != 0) { 1527 ir_dereference *lhs = new(ctx) ir_dereference_variable(var); 1528 const glsl_type *rhs_type = 1529 glsl_type::get_instance(var->type->base_type, 1530 constant_components, 1531 1); 1532 ir_rvalue *rhs = new(ctx) ir_constant(rhs_type, &data); 1533 1534 ir_instruction *inst = 1535 new(ctx) ir_assignment(lhs, rhs, constant_mask); 1536 instructions->push_tail(inst); 1537 } 1538 1539 base_component = 0; 1540 foreach_in_list(ir_rvalue, param, parameters) { 1541 unsigned rhs_components = param->type->components(); 1542 1543 /* Do not try to assign more components to the vector than it has! */ 1544 if ((rhs_components + base_component) > lhs_components) { 1545 rhs_components = lhs_components - base_component; 1546 } 1547 1548 /* If we do not have any components left to copy, break out of the 1549 * loop. This can happen when initializing a vec4 with a mat3 as the 1550 * mat3 would have been broken into a series of column vectors. 1551 */ 1552 if (rhs_components == 0) { 1553 break; 1554 } 1555 1556 const ir_constant *const c = param->as_constant(); 1557 if (c == NULL) { 1558 /* Mask of fields to be written in the assignment. */ 1559 const unsigned write_mask = ((1U << rhs_components) - 1) 1560 << base_component; 1561 1562 ir_dereference *lhs = new(ctx) ir_dereference_variable(var); 1563 1564 /* Generate a swizzle so that LHS and RHS sizes match. */ 1565 ir_rvalue *rhs = 1566 new(ctx) ir_swizzle(param, 0, 1, 2, 3, rhs_components); 1567 1568 ir_instruction *inst = 1569 new(ctx) ir_assignment(lhs, rhs, write_mask); 1570 instructions->push_tail(inst); 1571 } 1572 1573 /* Advance the component index by the number of components that were 1574 * just assigned. 1575 */ 1576 base_component += rhs_components; 1577 } 1578 } 1579 return new(ctx) ir_dereference_variable(var); 1580} 1581 1582 1583/** 1584 * Generate assignment of a portion of a vector to a portion of a matrix column 1585 * 1586 * \param src_base First component of the source to be used in assignment 1587 * \param column Column of destination to be assiged 1588 * \param row_base First component of the destination column to be assigned 1589 * \param count Number of components to be assigned 1590 * 1591 * \note 1592 * \c src_base + \c count must be less than or equal to the number of 1593 * components in the source vector. 1594 */ 1595static ir_instruction * 1596assign_to_matrix_column(ir_variable *var, unsigned column, unsigned row_base, 1597 ir_rvalue *src, unsigned src_base, unsigned count, 1598 void *mem_ctx) 1599{ 1600 ir_constant *col_idx = new(mem_ctx) ir_constant(column); 1601 ir_dereference *column_ref = new(mem_ctx) ir_dereference_array(var, 1602 col_idx); 1603 1604 assert(column_ref->type->components() >= (row_base + count)); 1605 assert(src->type->components() >= (src_base + count)); 1606 1607 /* Generate a swizzle that extracts the number of components from the source 1608 * that are to be assigned to the column of the matrix. 1609 */ 1610 if (count < src->type->vector_elements) { 1611 src = new(mem_ctx) ir_swizzle(src, 1612 src_base + 0, src_base + 1, 1613 src_base + 2, src_base + 3, 1614 count); 1615 } 1616 1617 /* Mask of fields to be written in the assignment. */ 1618 const unsigned write_mask = ((1U << count) - 1) << row_base; 1619 1620 return new(mem_ctx) ir_assignment(column_ref, src, write_mask); 1621} 1622 1623 1624/** 1625 * Generate inline code for a matrix constructor 1626 * 1627 * The generated constructor code will consist of a temporary variable 1628 * declaration of the same type as the constructor. A sequence of assignments 1629 * from constructor parameters to the temporary will follow. 1630 * 1631 * \return 1632 * An \c ir_dereference_variable of the temprorary generated in the constructor 1633 * body. 1634 */ 1635static ir_rvalue * 1636emit_inline_matrix_constructor(const glsl_type *type, 1637 exec_list *instructions, 1638 exec_list *parameters, 1639 void *ctx) 1640{ 1641 assert(!parameters->is_empty()); 1642 1643 ir_variable *var = new(ctx) ir_variable(type, "mat_ctor", ir_var_temporary); 1644 instructions->push_tail(var); 1645 1646 /* There are three kinds of matrix constructors. 1647 * 1648 * - Construct a matrix from a single scalar by replicating that scalar to 1649 * along the diagonal of the matrix and setting all other components to 1650 * zero. 1651 * 1652 * - Construct a matrix from an arbirary combination of vectors and 1653 * scalars. The components of the constructor parameters are assigned 1654 * to the matrix in column-major order until the matrix is full. 1655 * 1656 * - Construct a matrix from a single matrix. The source matrix is copied 1657 * to the upper left portion of the constructed matrix, and the remaining 1658 * elements take values from the identity matrix. 1659 */ 1660 ir_rvalue *const first_param = (ir_rvalue *) parameters->get_head_raw(); 1661 if (single_scalar_parameter(parameters)) { 1662 /* Assign the scalar to the X component of a vec4, and fill the remaining 1663 * components with zero. 1664 */ 1665 glsl_base_type param_base_type = first_param->type->base_type; 1666 assert(first_param->type->is_float() || first_param->type->is_double()); 1667 ir_variable *rhs_var = 1668 new(ctx) ir_variable(glsl_type::get_instance(param_base_type, 4, 1), 1669 "mat_ctor_vec", 1670 ir_var_temporary); 1671 instructions->push_tail(rhs_var); 1672 1673 ir_constant_data zero; 1674 for (unsigned i = 0; i < 4; i++) 1675 if (first_param->type->is_float()) 1676 zero.f[i] = 0.0; 1677 else 1678 zero.d[i] = 0.0; 1679 1680 ir_instruction *inst = 1681 new(ctx) ir_assignment(new(ctx) ir_dereference_variable(rhs_var), 1682 new(ctx) ir_constant(rhs_var->type, &zero)); 1683 instructions->push_tail(inst); 1684 1685 ir_dereference *const rhs_ref = 1686 new(ctx) ir_dereference_variable(rhs_var); 1687 1688 inst = new(ctx) ir_assignment(rhs_ref, first_param, 0x01); 1689 instructions->push_tail(inst); 1690 1691 /* Assign the temporary vector to each column of the destination matrix 1692 * with a swizzle that puts the X component on the diagonal of the 1693 * matrix. In some cases this may mean that the X component does not 1694 * get assigned into the column at all (i.e., when the matrix has more 1695 * columns than rows). 1696 */ 1697 static const unsigned rhs_swiz[4][4] = { 1698 { 0, 1, 1, 1 }, 1699 { 1, 0, 1, 1 }, 1700 { 1, 1, 0, 1 }, 1701 { 1, 1, 1, 0 } 1702 }; 1703 1704 const unsigned cols_to_init = MIN2(type->matrix_columns, 1705 type->vector_elements); 1706 for (unsigned i = 0; i < cols_to_init; i++) { 1707 ir_constant *const col_idx = new(ctx) ir_constant(i); 1708 ir_rvalue *const col_ref = new(ctx) ir_dereference_array(var, 1709 col_idx); 1710 1711 ir_rvalue *const rhs_ref = new(ctx) ir_dereference_variable(rhs_var); 1712 ir_rvalue *const rhs = new(ctx) ir_swizzle(rhs_ref, rhs_swiz[i], 1713 type->vector_elements); 1714 1715 inst = new(ctx) ir_assignment(col_ref, rhs); 1716 instructions->push_tail(inst); 1717 } 1718 1719 for (unsigned i = cols_to_init; i < type->matrix_columns; i++) { 1720 ir_constant *const col_idx = new(ctx) ir_constant(i); 1721 ir_rvalue *const col_ref = new(ctx) ir_dereference_array(var, 1722 col_idx); 1723 1724 ir_rvalue *const rhs_ref = new(ctx) ir_dereference_variable(rhs_var); 1725 ir_rvalue *const rhs = new(ctx) ir_swizzle(rhs_ref, 1, 1, 1, 1, 1726 type->vector_elements); 1727 1728 inst = new(ctx) ir_assignment(col_ref, rhs); 1729 instructions->push_tail(inst); 1730 } 1731 } else if (first_param->type->is_matrix()) { 1732 /* From page 50 (56 of the PDF) of the GLSL 1.50 spec: 1733 * 1734 * "If a matrix is constructed from a matrix, then each component 1735 * (column i, row j) in the result that has a corresponding 1736 * component (column i, row j) in the argument will be initialized 1737 * from there. All other components will be initialized to the 1738 * identity matrix. If a matrix argument is given to a matrix 1739 * constructor, it is an error to have any other arguments." 1740 */ 1741 assert(first_param->next->is_tail_sentinel()); 1742 ir_rvalue *const src_matrix = first_param; 1743 1744 /* If the source matrix is smaller, pre-initialize the relavent parts of 1745 * the destination matrix to the identity matrix. 1746 */ 1747 if ((src_matrix->type->matrix_columns < var->type->matrix_columns) || 1748 (src_matrix->type->vector_elements < var->type->vector_elements)) { 1749 1750 /* If the source matrix has fewer rows, every column of the 1751 * destination must be initialized. Otherwise only the columns in 1752 * the destination that do not exist in the source must be 1753 * initialized. 1754 */ 1755 unsigned col = 1756 (src_matrix->type->vector_elements < var->type->vector_elements) 1757 ? 0 : src_matrix->type->matrix_columns; 1758 1759 const glsl_type *const col_type = var->type->column_type(); 1760 for (/* empty */; col < var->type->matrix_columns; col++) { 1761 ir_constant_data ident; 1762 1763 if (!col_type->is_double()) { 1764 ident.f[0] = 0.0f; 1765 ident.f[1] = 0.0f; 1766 ident.f[2] = 0.0f; 1767 ident.f[3] = 0.0f; 1768 ident.f[col] = 1.0f; 1769 } else { 1770 ident.d[0] = 0.0; 1771 ident.d[1] = 0.0; 1772 ident.d[2] = 0.0; 1773 ident.d[3] = 0.0; 1774 ident.d[col] = 1.0; 1775 } 1776 1777 ir_rvalue *const rhs = new(ctx) ir_constant(col_type, &ident); 1778 1779 ir_rvalue *const lhs = 1780 new(ctx) ir_dereference_array(var, new(ctx) ir_constant(col)); 1781 1782 ir_instruction *inst = new(ctx) ir_assignment(lhs, rhs); 1783 instructions->push_tail(inst); 1784 } 1785 } 1786 1787 /* Assign columns from the source matrix to the destination matrix. 1788 * 1789 * Since the parameter will be used in the RHS of multiple assignments, 1790 * generate a temporary and copy the paramter there. 1791 */ 1792 ir_variable *const rhs_var = 1793 new(ctx) ir_variable(first_param->type, "mat_ctor_mat", 1794 ir_var_temporary); 1795 instructions->push_tail(rhs_var); 1796 1797 ir_dereference *const rhs_var_ref = 1798 new(ctx) ir_dereference_variable(rhs_var); 1799 ir_instruction *const inst = 1800 new(ctx) ir_assignment(rhs_var_ref, first_param); 1801 instructions->push_tail(inst); 1802 1803 const unsigned last_row = MIN2(src_matrix->type->vector_elements, 1804 var->type->vector_elements); 1805 const unsigned last_col = MIN2(src_matrix->type->matrix_columns, 1806 var->type->matrix_columns); 1807 1808 unsigned swiz[4] = { 0, 0, 0, 0 }; 1809 for (unsigned i = 1; i < last_row; i++) 1810 swiz[i] = i; 1811 1812 const unsigned write_mask = (1U << last_row) - 1; 1813 1814 for (unsigned i = 0; i < last_col; i++) { 1815 ir_dereference *const lhs = 1816 new(ctx) ir_dereference_array(var, new(ctx) ir_constant(i)); 1817 ir_rvalue *const rhs_col = 1818 new(ctx) ir_dereference_array(rhs_var, new(ctx) ir_constant(i)); 1819 1820 /* If one matrix has columns that are smaller than the columns of the 1821 * other matrix, wrap the column access of the larger with a swizzle 1822 * so that the LHS and RHS of the assignment have the same size (and 1823 * therefore have the same type). 1824 * 1825 * It would be perfectly valid to unconditionally generate the 1826 * swizzles, this this will typically result in a more compact IR 1827 * tree. 1828 */ 1829 ir_rvalue *rhs; 1830 if (lhs->type->vector_elements != rhs_col->type->vector_elements) { 1831 rhs = new(ctx) ir_swizzle(rhs_col, swiz, last_row); 1832 } else { 1833 rhs = rhs_col; 1834 } 1835 1836 ir_instruction *inst = 1837 new(ctx) ir_assignment(lhs, rhs, write_mask); 1838 instructions->push_tail(inst); 1839 } 1840 } else { 1841 const unsigned cols = type->matrix_columns; 1842 const unsigned rows = type->vector_elements; 1843 unsigned remaining_slots = rows * cols; 1844 unsigned col_idx = 0; 1845 unsigned row_idx = 0; 1846 1847 foreach_in_list(ir_rvalue, rhs, parameters) { 1848 unsigned rhs_components = rhs->type->components(); 1849 unsigned rhs_base = 0; 1850 1851 if (remaining_slots == 0) 1852 break; 1853 1854 /* Since the parameter might be used in the RHS of two assignments, 1855 * generate a temporary and copy the paramter there. 1856 */ 1857 ir_variable *rhs_var = 1858 new(ctx) ir_variable(rhs->type, "mat_ctor_vec", ir_var_temporary); 1859 instructions->push_tail(rhs_var); 1860 1861 ir_dereference *rhs_var_ref = 1862 new(ctx) ir_dereference_variable(rhs_var); 1863 ir_instruction *inst = new(ctx) ir_assignment(rhs_var_ref, rhs); 1864 instructions->push_tail(inst); 1865 1866 do { 1867 /* Assign the current parameter to as many components of the matrix 1868 * as it will fill. 1869 * 1870 * NOTE: A single vector parameter can span two matrix columns. A 1871 * single vec4, for example, can completely fill a mat2. 1872 */ 1873 unsigned count = MIN2(rows - row_idx, 1874 rhs_components - rhs_base); 1875 1876 rhs_var_ref = new(ctx) ir_dereference_variable(rhs_var); 1877 ir_instruction *inst = assign_to_matrix_column(var, col_idx, 1878 row_idx, 1879 rhs_var_ref, 1880 rhs_base, 1881 count, ctx); 1882 instructions->push_tail(inst); 1883 rhs_base += count; 1884 row_idx += count; 1885 remaining_slots -= count; 1886 1887 /* Sometimes, there is still data left in the parameters and 1888 * components left to be set in the destination but in other 1889 * column. 1890 */ 1891 if (row_idx >= rows) { 1892 row_idx = 0; 1893 col_idx++; 1894 } 1895 } while(remaining_slots > 0 && rhs_base < rhs_components); 1896 } 1897 } 1898 1899 return new(ctx) ir_dereference_variable(var); 1900} 1901 1902 1903static ir_rvalue * 1904emit_inline_record_constructor(const glsl_type *type, 1905 exec_list *instructions, 1906 exec_list *parameters, 1907 void *mem_ctx) 1908{ 1909 ir_variable *const var = 1910 new(mem_ctx) ir_variable(type, "record_ctor", ir_var_temporary); 1911 ir_dereference_variable *const d = 1912 new(mem_ctx) ir_dereference_variable(var); 1913 1914 instructions->push_tail(var); 1915 1916 exec_node *node = parameters->get_head_raw(); 1917 for (unsigned i = 0; i < type->length; i++) { 1918 assert(!node->is_tail_sentinel()); 1919 1920 ir_dereference *const lhs = 1921 new(mem_ctx) ir_dereference_record(d->clone(mem_ctx, NULL), 1922 type->fields.structure[i].name); 1923 1924 ir_rvalue *const rhs = ((ir_instruction *) node)->as_rvalue(); 1925 assert(rhs != NULL); 1926 1927 ir_instruction *const assign = new(mem_ctx) ir_assignment(lhs, rhs); 1928 1929 instructions->push_tail(assign); 1930 node = node->next; 1931 } 1932 1933 return d; 1934} 1935 1936 1937static ir_rvalue * 1938process_record_constructor(exec_list *instructions, 1939 const glsl_type *constructor_type, 1940 YYLTYPE *loc, exec_list *parameters, 1941 struct _mesa_glsl_parse_state *state) 1942{ 1943 void *ctx = state; 1944 /* From page 32 (page 38 of the PDF) of the GLSL 1.20 spec: 1945 * 1946 * "The arguments to the constructor will be used to set the structure's 1947 * fields, in order, using one argument per field. Each argument must 1948 * be the same type as the field it sets, or be a type that can be 1949 * converted to the field's type according to Section 4.1.10 “Implicit 1950 * Conversions.”" 1951 * 1952 * From page 35 (page 41 of the PDF) of the GLSL 4.20 spec: 1953 * 1954 * "In all cases, the innermost initializer (i.e., not a list of 1955 * initializers enclosed in curly braces) applied to an object must 1956 * have the same type as the object being initialized or be a type that 1957 * can be converted to the object's type according to section 4.1.10 1958 * "Implicit Conversions". In the latter case, an implicit conversion 1959 * will be done on the initializer before the assignment is done." 1960 */ 1961 exec_list actual_parameters; 1962 1963 const unsigned parameter_count = 1964 process_parameters(instructions, &actual_parameters, parameters, 1965 state); 1966 1967 if (parameter_count != constructor_type->length) { 1968 _mesa_glsl_error(loc, state, 1969 "%s parameters in constructor for `%s'", 1970 parameter_count > constructor_type->length 1971 ? "too many": "insufficient", 1972 constructor_type->name); 1973 return ir_rvalue::error_value(ctx); 1974 } 1975 1976 bool all_parameters_are_constant = true; 1977 1978 int i = 0; 1979 /* Type cast each parameter and, if possible, fold constants. */ 1980 foreach_in_list_safe(ir_rvalue, ir, &actual_parameters) { 1981 1982 const glsl_struct_field *struct_field = 1983 &constructor_type->fields.structure[i]; 1984 1985 /* Apply implicit conversions (not the scalar constructor rules, see the 1986 * spec quote above!) and attempt to convert the parameter to a constant 1987 * valued expression. After doing so, track whether or not all the 1988 * parameters to the constructor are trivially constant valued 1989 * expressions. 1990 */ 1991 all_parameters_are_constant &= 1992 implicitly_convert_component(ir, struct_field->type->base_type, 1993 state); 1994 1995 if (ir->type != struct_field->type) { 1996 _mesa_glsl_error(loc, state, 1997 "parameter type mismatch in constructor for `%s.%s' " 1998 "(%s vs %s)", 1999 constructor_type->name, 2000 struct_field->name, 2001 ir->type->name, 2002 struct_field->type->name); 2003 return ir_rvalue::error_value(ctx); 2004 } 2005 2006 i++; 2007 } 2008 2009 if (all_parameters_are_constant) { 2010 return new(ctx) ir_constant(constructor_type, &actual_parameters); 2011 } else { 2012 return emit_inline_record_constructor(constructor_type, instructions, 2013 &actual_parameters, state); 2014 } 2015} 2016 2017ir_rvalue * 2018ast_function_expression::handle_method(exec_list *instructions, 2019 struct _mesa_glsl_parse_state *state) 2020{ 2021 const ast_expression *field = subexpressions[0]; 2022 ir_rvalue *op; 2023 ir_rvalue *result; 2024 void *ctx = state; 2025 /* Handle "method calls" in GLSL 1.20 - namely, array.length() */ 2026 YYLTYPE loc = get_location(); 2027 state->check_version(120, 300, &loc, "methods not supported"); 2028 2029 const char *method; 2030 method = field->primary_expression.identifier; 2031 2032 /* This would prevent to raise "uninitialized variable" warnings when 2033 * calling array.length. 2034 */ 2035 field->subexpressions[0]->set_is_lhs(true); 2036 op = field->subexpressions[0]->hir(instructions, state); 2037 if (strcmp(method, "length") == 0) { 2038 if (!this->expressions.is_empty()) { 2039 _mesa_glsl_error(&loc, state, "length method takes no arguments"); 2040 goto fail; 2041 } 2042 2043 if (op->type->is_array()) { 2044 if (op->type->is_unsized_array()) { 2045 if (!state->has_shader_storage_buffer_objects()) { 2046 _mesa_glsl_error(&loc, state, 2047 "length called on unsized array" 2048 " only available with" 2049 " ARB_shader_storage_buffer_object"); 2050 goto fail; 2051 } else if (op->variable_referenced()->is_in_shader_storage_block()) { 2052 /* Calculate length of an unsized array in run-time */ 2053 result = new(ctx) 2054 ir_expression(ir_unop_ssbo_unsized_array_length, op); 2055 } else { 2056 /* When actual size is known at link-time, this will be 2057 * replaced with a constant expression. 2058 */ 2059 result = new (ctx) 2060 ir_expression(ir_unop_implicitly_sized_array_length, op); 2061 } 2062 } else { 2063 result = new(ctx) ir_constant(op->type->array_size()); 2064 } 2065 } else if (op->type->is_vector()) { 2066 if (state->has_420pack()) { 2067 /* .length() returns int. */ 2068 result = new(ctx) ir_constant((int) op->type->vector_elements); 2069 } else { 2070 _mesa_glsl_error(&loc, state, "length method on matrix only" 2071 " available with ARB_shading_language_420pack"); 2072 goto fail; 2073 } 2074 } else if (op->type->is_matrix()) { 2075 if (state->has_420pack()) { 2076 /* .length() returns int. */ 2077 result = new(ctx) ir_constant((int) op->type->matrix_columns); 2078 } else { 2079 _mesa_glsl_error(&loc, state, "length method on matrix only" 2080 " available with ARB_shading_language_420pack"); 2081 goto fail; 2082 } 2083 } else { 2084 _mesa_glsl_error(&loc, state, "length called on scalar."); 2085 goto fail; 2086 } 2087 } else { 2088 _mesa_glsl_error(&loc, state, "unknown method: `%s'", method); 2089 goto fail; 2090 } 2091 return result; 2092 fail: 2093 return ir_rvalue::error_value(ctx); 2094} 2095 2096static inline bool is_valid_constructor(const glsl_type *type, 2097 struct _mesa_glsl_parse_state *state) 2098{ 2099 return type->is_numeric() || type->is_boolean() || 2100 (state->has_bindless() && (type->is_sampler() || type->is_image())); 2101} 2102 2103ir_rvalue * 2104ast_function_expression::hir(exec_list *instructions, 2105 struct _mesa_glsl_parse_state *state) 2106{ 2107 void *ctx = state; 2108 /* There are three sorts of function calls. 2109 * 2110 * 1. constructors - The first subexpression is an ast_type_specifier. 2111 * 2. methods - Only the .length() method of array types. 2112 * 3. functions - Calls to regular old functions. 2113 * 2114 */ 2115 if (is_constructor()) { 2116 const ast_type_specifier *type = 2117 (ast_type_specifier *) subexpressions[0]; 2118 YYLTYPE loc = type->get_location(); 2119 const char *name; 2120 2121 const glsl_type *const constructor_type = type->glsl_type(& name, state); 2122 2123 /* constructor_type can be NULL if a variable with the same name as the 2124 * structure has come into scope. 2125 */ 2126 if (constructor_type == NULL) { 2127 _mesa_glsl_error(& loc, state, "unknown type `%s' (structure name " 2128 "may be shadowed by a variable with the same name)", 2129 type->type_name); 2130 return ir_rvalue::error_value(ctx); 2131 } 2132 2133 2134 /* Constructors for opaque types are illegal. 2135 * 2136 * From section 4.1.7 of the ARB_bindless_texture spec: 2137 * 2138 * "Samplers are represented using 64-bit integer handles, and may be " 2139 * converted to and from 64-bit integers using constructors." 2140 * 2141 * From section 4.1.X of the ARB_bindless_texture spec: 2142 * 2143 * "Images are represented using 64-bit integer handles, and may be 2144 * converted to and from 64-bit integers using constructors." 2145 */ 2146 if (constructor_type->contains_atomic() || 2147 (!state->has_bindless() && constructor_type->contains_opaque())) { 2148 _mesa_glsl_error(& loc, state, "cannot construct %s type `%s'", 2149 state->has_bindless() ? "atomic" : "opaque", 2150 constructor_type->name); 2151 return ir_rvalue::error_value(ctx); 2152 } 2153 2154 if (constructor_type->is_subroutine()) { 2155 _mesa_glsl_error(& loc, state, 2156 "subroutine name cannot be a constructor `%s'", 2157 constructor_type->name); 2158 return ir_rvalue::error_value(ctx); 2159 } 2160 2161 if (constructor_type->is_array()) { 2162 if (!state->check_version(state->allow_glsl_120_subset_in_110 ? 110 : 120, 2163 300, &loc, "array constructors forbidden")) { 2164 return ir_rvalue::error_value(ctx); 2165 } 2166 2167 return process_array_constructor(instructions, constructor_type, 2168 & loc, &this->expressions, state); 2169 } 2170 2171 2172 /* There are two kinds of constructor calls. Constructors for arrays and 2173 * structures must have the exact number of arguments with matching types 2174 * in the correct order. These constructors follow essentially the same 2175 * type matching rules as functions. 2176 * 2177 * Constructors for built-in language types, such as mat4 and vec2, are 2178 * free form. The only requirements are that the parameters must provide 2179 * enough values of the correct scalar type and that no arguments are 2180 * given past the last used argument. 2181 * 2182 * When using the C-style initializer syntax from GLSL 4.20, constructors 2183 * must have the exact number of arguments with matching types in the 2184 * correct order. 2185 */ 2186 if (constructor_type->is_struct()) { 2187 return process_record_constructor(instructions, constructor_type, 2188 &loc, &this->expressions, 2189 state); 2190 } 2191 2192 if (!is_valid_constructor(constructor_type, state)) 2193 return ir_rvalue::error_value(ctx); 2194 2195 /* Total number of components of the type being constructed. */ 2196 const unsigned type_components = constructor_type->components(); 2197 2198 /* Number of components from parameters that have actually been 2199 * consumed. This is used to perform several kinds of error checking. 2200 */ 2201 unsigned components_used = 0; 2202 2203 unsigned matrix_parameters = 0; 2204 unsigned nonmatrix_parameters = 0; 2205 exec_list actual_parameters; 2206 2207 foreach_list_typed(ast_node, ast, link, &this->expressions) { 2208 ir_rvalue *result = ast->hir(instructions, state); 2209 2210 /* From page 50 (page 56 of the PDF) of the GLSL 1.50 spec: 2211 * 2212 * "It is an error to provide extra arguments beyond this 2213 * last used argument." 2214 */ 2215 if (components_used >= type_components) { 2216 _mesa_glsl_error(& loc, state, "too many parameters to `%s' " 2217 "constructor", 2218 constructor_type->name); 2219 return ir_rvalue::error_value(ctx); 2220 } 2221 2222 if (!is_valid_constructor(result->type, state)) { 2223 _mesa_glsl_error(& loc, state, "cannot construct `%s' from a " 2224 "non-numeric data type", 2225 constructor_type->name); 2226 return ir_rvalue::error_value(ctx); 2227 } 2228 2229 /* Count the number of matrix and nonmatrix parameters. This 2230 * is used below to enforce some of the constructor rules. 2231 */ 2232 if (result->type->is_matrix()) 2233 matrix_parameters++; 2234 else 2235 nonmatrix_parameters++; 2236 2237 actual_parameters.push_tail(result); 2238 components_used += result->type->components(); 2239 } 2240 2241 /* From page 28 (page 34 of the PDF) of the GLSL 1.10 spec: 2242 * 2243 * "It is an error to construct matrices from other matrices. This 2244 * is reserved for future use." 2245 */ 2246 if (matrix_parameters > 0 2247 && constructor_type->is_matrix() 2248 && !state->check_version(120, 100, &loc, 2249 "cannot construct `%s' from a matrix", 2250 constructor_type->name)) { 2251 return ir_rvalue::error_value(ctx); 2252 } 2253 2254 /* From page 50 (page 56 of the PDF) of the GLSL 1.50 spec: 2255 * 2256 * "If a matrix argument is given to a matrix constructor, it is 2257 * an error to have any other arguments." 2258 */ 2259 if ((matrix_parameters > 0) 2260 && ((matrix_parameters + nonmatrix_parameters) > 1) 2261 && constructor_type->is_matrix()) { 2262 _mesa_glsl_error(& loc, state, "for matrix `%s' constructor, " 2263 "matrix must be only parameter", 2264 constructor_type->name); 2265 return ir_rvalue::error_value(ctx); 2266 } 2267 2268 /* From page 28 (page 34 of the PDF) of the GLSL 1.10 spec: 2269 * 2270 * "In these cases, there must be enough components provided in the 2271 * arguments to provide an initializer for every component in the 2272 * constructed value." 2273 */ 2274 if (components_used < type_components && components_used != 1 2275 && matrix_parameters == 0) { 2276 _mesa_glsl_error(& loc, state, "too few components to construct " 2277 "`%s'", 2278 constructor_type->name); 2279 return ir_rvalue::error_value(ctx); 2280 } 2281 2282 /* Matrices can never be consumed as is by any constructor but matrix 2283 * constructors. If the constructor type is not matrix, always break the 2284 * matrix up into a series of column vectors. 2285 */ 2286 if (!constructor_type->is_matrix()) { 2287 foreach_in_list_safe(ir_rvalue, matrix, &actual_parameters) { 2288 if (!matrix->type->is_matrix()) 2289 continue; 2290 2291 /* Create a temporary containing the matrix. */ 2292 ir_variable *var = new(ctx) ir_variable(matrix->type, "matrix_tmp", 2293 ir_var_temporary); 2294 instructions->push_tail(var); 2295 instructions->push_tail( 2296 new(ctx) ir_assignment(new(ctx) ir_dereference_variable(var), 2297 matrix)); 2298 var->constant_value = matrix->constant_expression_value(ctx); 2299 2300 /* Replace the matrix with dereferences of its columns. */ 2301 for (int i = 0; i < matrix->type->matrix_columns; i++) { 2302 matrix->insert_before( 2303 new (ctx) ir_dereference_array(var, 2304 new(ctx) ir_constant(i))); 2305 } 2306 matrix->remove(); 2307 } 2308 } 2309 2310 bool all_parameters_are_constant = true; 2311 2312 /* Type cast each parameter and, if possible, fold constants.*/ 2313 foreach_in_list_safe(ir_rvalue, ir, &actual_parameters) { 2314 const glsl_type *desired_type; 2315 2316 /* From section 5.4.1 of the ARB_bindless_texture spec: 2317 * 2318 * "In the following four constructors, the low 32 bits of the sampler 2319 * type correspond to the .x component of the uvec2 and the high 32 2320 * bits correspond to the .y component." 2321 * 2322 * uvec2(any sampler type) // Converts a sampler type to a 2323 * // pair of 32-bit unsigned integers 2324 * any sampler type(uvec2) // Converts a pair of 32-bit unsigned integers to 2325 * // a sampler type 2326 * uvec2(any image type) // Converts an image type to a 2327 * // pair of 32-bit unsigned integers 2328 * any image type(uvec2) // Converts a pair of 32-bit unsigned integers to 2329 * // an image type 2330 */ 2331 if (ir->type->is_sampler() || ir->type->is_image()) { 2332 /* Convert a sampler/image type to a pair of 32-bit unsigned 2333 * integers as defined by ARB_bindless_texture. 2334 */ 2335 if (constructor_type != glsl_type::uvec2_type) { 2336 _mesa_glsl_error(&loc, state, "sampler and image types can only " 2337 "be converted to a pair of 32-bit unsigned " 2338 "integers"); 2339 } 2340 desired_type = glsl_type::uvec2_type; 2341 } else if (constructor_type->is_sampler() || 2342 constructor_type->is_image()) { 2343 /* Convert a pair of 32-bit unsigned integers to a sampler or image 2344 * type as defined by ARB_bindless_texture. 2345 */ 2346 if (ir->type != glsl_type::uvec2_type) { 2347 _mesa_glsl_error(&loc, state, "sampler and image types can only " 2348 "be converted from a pair of 32-bit unsigned " 2349 "integers"); 2350 } 2351 desired_type = constructor_type; 2352 } else { 2353 desired_type = 2354 glsl_type::get_instance(constructor_type->base_type, 2355 ir->type->vector_elements, 2356 ir->type->matrix_columns); 2357 } 2358 2359 ir_rvalue *result = convert_component(ir, desired_type); 2360 2361 /* Attempt to convert the parameter to a constant valued expression. 2362 * After doing so, track whether or not all the parameters to the 2363 * constructor are trivially constant valued expressions. 2364 */ 2365 ir_rvalue *const constant = result->constant_expression_value(ctx); 2366 2367 if (constant != NULL) 2368 result = constant; 2369 else 2370 all_parameters_are_constant = false; 2371 2372 if (result != ir) { 2373 ir->replace_with(result); 2374 } 2375 } 2376 2377 /* If all of the parameters are trivially constant, create a 2378 * constant representing the complete collection of parameters. 2379 */ 2380 if (all_parameters_are_constant) { 2381 return new(ctx) ir_constant(constructor_type, &actual_parameters); 2382 } else if (constructor_type->is_scalar()) { 2383 return dereference_component((ir_rvalue *) 2384 actual_parameters.get_head_raw(), 2385 0); 2386 } else if (constructor_type->is_vector()) { 2387 return emit_inline_vector_constructor(constructor_type, 2388 instructions, 2389 &actual_parameters, 2390 ctx); 2391 } else { 2392 assert(constructor_type->is_matrix()); 2393 return emit_inline_matrix_constructor(constructor_type, 2394 instructions, 2395 &actual_parameters, 2396 ctx); 2397 } 2398 } else if (subexpressions[0]->oper == ast_field_selection) { 2399 return handle_method(instructions, state); 2400 } else { 2401 const ast_expression *id = subexpressions[0]; 2402 const char *func_name = NULL; 2403 YYLTYPE loc = get_location(); 2404 exec_list actual_parameters; 2405 ir_variable *sub_var = NULL; 2406 ir_rvalue *array_idx = NULL; 2407 2408 process_parameters(instructions, &actual_parameters, &this->expressions, 2409 state); 2410 2411 if (id->oper == ast_array_index) { 2412 array_idx = generate_array_index(ctx, instructions, state, loc, 2413 id->subexpressions[0], 2414 id->subexpressions[1], &func_name, 2415 &actual_parameters); 2416 } else if (id->oper == ast_identifier) { 2417 func_name = id->primary_expression.identifier; 2418 } else { 2419 _mesa_glsl_error(&loc, state, "function name is not an identifier"); 2420 } 2421 2422 /* an error was emitted earlier */ 2423 if (!func_name) 2424 return ir_rvalue::error_value(ctx); 2425 2426 ir_function_signature *sig = 2427 match_function_by_name(func_name, &actual_parameters, state); 2428 2429 ir_rvalue *value = NULL; 2430 if (sig == NULL) { 2431 sig = match_subroutine_by_name(func_name, &actual_parameters, 2432 state, &sub_var); 2433 } 2434 2435 if (sig == NULL) { 2436 no_matching_function_error(func_name, &loc, 2437 &actual_parameters, state); 2438 value = ir_rvalue::error_value(ctx); 2439 } else if (!verify_parameter_modes(state, sig, 2440 actual_parameters, 2441 this->expressions)) { 2442 /* an error has already been emitted */ 2443 value = ir_rvalue::error_value(ctx); 2444 } else if (sig->is_builtin() && strcmp(func_name, "ftransform") == 0) { 2445 /* ftransform refers to global variables, and we don't have any code 2446 * for remapping the variable references in the built-in shader. 2447 */ 2448 ir_variable *mvp = 2449 state->symbols->get_variable("gl_ModelViewProjectionMatrix"); 2450 ir_variable *vtx = state->symbols->get_variable("gl_Vertex"); 2451 value = new(ctx) ir_expression(ir_binop_mul, glsl_type::vec4_type, 2452 new(ctx) ir_dereference_variable(mvp), 2453 new(ctx) ir_dereference_variable(vtx)); 2454 } else { 2455 bool is_begin_interlock = false; 2456 bool is_end_interlock = false; 2457 if (sig->is_builtin() && 2458 state->stage == MESA_SHADER_FRAGMENT && 2459 state->ARB_fragment_shader_interlock_enable) { 2460 is_begin_interlock = strcmp(func_name, "beginInvocationInterlockARB") == 0; 2461 is_end_interlock = strcmp(func_name, "endInvocationInterlockARB") == 0; 2462 } 2463 2464 if (sig->is_builtin() && 2465 ((state->stage == MESA_SHADER_TESS_CTRL && 2466 strcmp(func_name, "barrier") == 0) || 2467 is_begin_interlock || is_end_interlock)) { 2468 if (state->current_function == NULL || 2469 strcmp(state->current_function->function_name(), "main") != 0) { 2470 _mesa_glsl_error(&loc, state, 2471 "%s() may only be used in main()", func_name); 2472 } 2473 2474 if (state->found_return) { 2475 _mesa_glsl_error(&loc, state, 2476 "%s() may not be used after return", func_name); 2477 } 2478 2479 if (instructions != &state->current_function->body) { 2480 _mesa_glsl_error(&loc, state, 2481 "%s() may not be used in control flow", func_name); 2482 } 2483 } 2484 2485 /* There can be only one begin/end interlock pair in the function. */ 2486 if (is_begin_interlock) { 2487 if (state->found_begin_interlock) 2488 _mesa_glsl_error(&loc, state, 2489 "beginInvocationInterlockARB may not be used twice"); 2490 state->found_begin_interlock = true; 2491 } else if (is_end_interlock) { 2492 if (!state->found_begin_interlock) 2493 _mesa_glsl_error(&loc, state, 2494 "endInvocationInterlockARB may not be used " 2495 "before beginInvocationInterlockARB"); 2496 if (state->found_end_interlock) 2497 _mesa_glsl_error(&loc, state, 2498 "endInvocationInterlockARB may not be used twice"); 2499 state->found_end_interlock = true; 2500 } 2501 2502 value = generate_call(instructions, sig, &actual_parameters, sub_var, 2503 array_idx, state); 2504 if (!value) { 2505 ir_variable *const tmp = new(ctx) ir_variable(glsl_type::void_type, 2506 "void_var", 2507 ir_var_temporary); 2508 instructions->push_tail(tmp); 2509 value = new(ctx) ir_dereference_variable(tmp); 2510 } 2511 } 2512 2513 return value; 2514 } 2515 2516 unreachable("not reached"); 2517} 2518 2519bool 2520ast_function_expression::has_sequence_subexpression() const 2521{ 2522 foreach_list_typed(const ast_node, ast, link, &this->expressions) { 2523 if (ast->has_sequence_subexpression()) 2524 return true; 2525 } 2526 2527 return false; 2528} 2529 2530ir_rvalue * 2531ast_aggregate_initializer::hir(exec_list *instructions, 2532 struct _mesa_glsl_parse_state *state) 2533{ 2534 void *ctx = state; 2535 YYLTYPE loc = this->get_location(); 2536 2537 if (!this->constructor_type) { 2538 _mesa_glsl_error(&loc, state, "type of C-style initializer unknown"); 2539 return ir_rvalue::error_value(ctx); 2540 } 2541 const glsl_type *const constructor_type = this->constructor_type; 2542 2543 if (!state->has_420pack()) { 2544 _mesa_glsl_error(&loc, state, "C-style initialization requires the " 2545 "GL_ARB_shading_language_420pack extension"); 2546 return ir_rvalue::error_value(ctx); 2547 } 2548 2549 if (constructor_type->is_array()) { 2550 return process_array_constructor(instructions, constructor_type, &loc, 2551 &this->expressions, state); 2552 } 2553 2554 if (constructor_type->is_struct()) { 2555 return process_record_constructor(instructions, constructor_type, &loc, 2556 &this->expressions, state); 2557 } 2558 2559 return process_vec_mat_constructor(instructions, constructor_type, &loc, 2560 &this->expressions, state); 2561} 2562