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