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 /** 25 * \file linker.cpp 26 * GLSL linker implementation 27 * 28 * Given a set of shaders that are to be linked to generate a final program, 29 * there are three distinct stages. 30 * 31 * In the first stage shaders are partitioned into groups based on the shader 32 * type. All shaders of a particular type (e.g., vertex shaders) are linked 33 * together. 34 * 35 * - Undefined references in each shader are resolve to definitions in 36 * another shader. 37 * - Types and qualifiers of uniforms, outputs, and global variables defined 38 * in multiple shaders with the same name are verified to be the same. 39 * - Initializers for uniforms and global variables defined 40 * in multiple shaders with the same name are verified to be the same. 41 * 42 * The result, in the terminology of the GLSL spec, is a set of shader 43 * executables for each processing unit. 44 * 45 * After the first stage is complete, a series of semantic checks are performed 46 * on each of the shader executables. 47 * 48 * - Each shader executable must define a \c main function. 49 * - Each vertex shader executable must write to \c gl_Position. 50 * - Each fragment shader executable must write to either \c gl_FragData or 51 * \c gl_FragColor. 52 * 53 * In the final stage individual shader executables are linked to create a 54 * complete exectuable. 55 * 56 * - Types of uniforms defined in multiple shader stages with the same name 57 * are verified to be the same. 58 * - Initializers for uniforms defined in multiple shader stages with the 59 * same name are verified to be the same. 60 * - Types and qualifiers of outputs defined in one stage are verified to 61 * be the same as the types and qualifiers of inputs defined with the same 62 * name in a later stage. 63 * 64 * \author Ian Romanick <ian.d.romanick (at) intel.com> 65 */ 66 #include <cstddef> 67 #include <cstdlib> 68 #include <cstdio> 69 #include <cstdarg> 70 #include <climits> 71 72 #include <pixelflinger2/pixelflinger2_interface.h> 73 74 extern "C" { 75 #include <hieralloc.h> 76 } 77 78 #include "main/core.h" 79 #include "glsl_symbol_table.h" 80 #include "ir.h" 81 #include "program.h" 82 #include "program/hash_table.h" 83 #include "linker.h" 84 #include "ir_optimization.h" 85 86 #include "main/shaderobj.h" 87 88 /** 89 * Visitor that determines whether or not a variable is ever written. 90 */ 91 class find_assignment_visitor : public ir_hierarchical_visitor { 92 public: 93 find_assignment_visitor(const char *name) 94 : name(name), found(false) 95 { 96 /* empty */ 97 } 98 99 virtual ir_visitor_status visit_enter(ir_assignment *ir) 100 { 101 ir_variable *const var = ir->lhs->variable_referenced(); 102 103 if (strcmp(name, var->name) == 0) { 104 found = true; 105 return visit_stop; 106 } 107 108 return visit_continue_with_parent; 109 } 110 111 using ir_hierarchical_visitor::visit_enter; 112 virtual ir_visitor_status visit_enter(ir_call *ir) 113 { 114 exec_list_iterator sig_iter = ir->get_callee()->parameters.iterator(); 115 foreach_iter(exec_list_iterator, iter, *ir) { 116 ir_rvalue *param_rval = (ir_rvalue *)iter.get(); 117 ir_variable *sig_param = (ir_variable *)sig_iter.get(); 118 119 if (sig_param->mode == ir_var_out || 120 sig_param->mode == ir_var_inout) { 121 ir_variable *var = param_rval->variable_referenced(); 122 if (var && strcmp(name, var->name) == 0) { 123 found = true; 124 return visit_stop; 125 } 126 } 127 sig_iter.next(); 128 } 129 130 return visit_continue_with_parent; 131 } 132 133 bool variable_found() 134 { 135 return found; 136 } 137 138 private: 139 const char *name; /**< Find writes to a variable with this name. */ 140 bool found; /**< Was a write to the variable found? */ 141 }; 142 143 144 /** 145 * Visitor that determines whether or not a variable is ever read. 146 */ 147 class find_deref_visitor : public ir_hierarchical_visitor { 148 public: 149 find_deref_visitor(const char *name) 150 : name(name), found(false) 151 { 152 /* empty */ 153 } 154 155 using ir_hierarchical_visitor::visit; 156 virtual ir_visitor_status visit(ir_dereference_variable *ir) 157 { 158 if (strcmp(this->name, ir->var->name) == 0) { 159 this->found = true; 160 return visit_stop; 161 } 162 163 return visit_continue; 164 } 165 166 bool variable_found() const 167 { 168 return this->found; 169 } 170 171 private: 172 const char *name; /**< Find writes to a variable with this name. */ 173 bool found; /**< Was a write to the variable found? */ 174 }; 175 176 177 void 178 linker_error_printf(gl_shader_program *prog, const char *fmt, ...) 179 { 180 va_list ap; 181 182 prog->InfoLog = hieralloc_strdup_append(prog->InfoLog, "error: "); 183 va_start(ap, fmt); 184 prog->InfoLog = hieralloc_vasprintf_append(prog->InfoLog, fmt, ap); 185 va_end(ap); 186 } 187 188 189 void 190 invalidate_variable_locations(gl_shader *sh, enum ir_variable_mode mode, 191 int generic_base) 192 { 193 foreach_list(node, sh->ir) { 194 ir_variable *const var = ((ir_instruction *) node)->as_variable(); 195 196 if ((var == NULL) || (var->mode != (unsigned) mode)) 197 continue; 198 199 /* Only assign locations for generic attributes / varyings / etc. 200 */ 201 if ((var->location >= generic_base) && !var->explicit_location) 202 var->location = -1; 203 } 204 } 205 206 207 /** 208 * Determine the number of attribute slots required for a particular type 209 * 210 * This code is here because it implements the language rules of a specific 211 * GLSL version. Since it's a property of the language and not a property of 212 * types in general, it doesn't really belong in glsl_type. 213 */ 214 unsigned 215 count_attribute_slots(const glsl_type *t) 216 { 217 /* From page 31 (page 37 of the PDF) of the GLSL 1.50 spec: 218 * 219 * "A scalar input counts the same amount against this limit as a vec4, 220 * so applications may want to consider packing groups of four 221 * unrelated float inputs together into a vector to better utilize the 222 * capabilities of the underlying hardware. A matrix input will use up 223 * multiple locations. The number of locations used will equal the 224 * number of columns in the matrix." 225 * 226 * The spec does not explicitly say how arrays are counted. However, it 227 * should be safe to assume the total number of slots consumed by an array 228 * is the number of entries in the array multiplied by the number of slots 229 * consumed by a single element of the array. 230 */ 231 232 if (t->is_array()) 233 return t->array_size() * count_attribute_slots(t->element_type()); 234 235 if (t->is_matrix()) 236 return t->matrix_columns; 237 238 return 1; 239 } 240 241 242 /** 243 * Verify that a vertex shader executable meets all semantic requirements 244 * 245 * \param shader Vertex shader executable to be verified 246 */ 247 bool 248 validate_vertex_shader_executable(struct gl_shader_program *prog, 249 struct gl_shader *shader) 250 { 251 if (shader == NULL) 252 return true; 253 254 find_assignment_visitor find("gl_Position"); 255 find.run(shader->ir); 256 if (!find.variable_found()) { 257 linker_error_printf(prog, 258 "vertex shader does not write to `gl_Position'\n"); 259 return false; 260 } 261 262 return true; 263 } 264 265 266 /** 267 * Verify that a fragment shader executable meets all semantic requirements 268 * 269 * \param shader Fragment shader executable to be verified 270 */ 271 bool 272 validate_fragment_shader_executable(struct gl_shader_program *prog, 273 struct gl_shader *shader) 274 { 275 if (shader == NULL) 276 return true; 277 278 find_assignment_visitor frag_color("gl_FragColor"); 279 find_assignment_visitor frag_data("gl_FragData"); 280 281 frag_color.run(shader->ir); 282 frag_data.run(shader->ir); 283 284 if (frag_color.variable_found() && frag_data.variable_found()) { 285 linker_error_printf(prog, "fragment shader writes to both " 286 "`gl_FragColor' and `gl_FragData'\n"); 287 return false; 288 } 289 290 return true; 291 } 292 293 294 /** 295 * Generate a string describing the mode of a variable 296 */ 297 static const char * 298 mode_string(const ir_variable *var) 299 { 300 switch (var->mode) { 301 case ir_var_auto: 302 return (var->read_only) ? "global constant" : "global variable"; 303 304 case ir_var_uniform: return "uniform"; 305 case ir_var_in: return "shader input"; 306 case ir_var_out: return "shader output"; 307 case ir_var_inout: return "shader inout"; 308 309 case ir_var_temporary: 310 default: 311 assert(!"Should not get here."); 312 return "invalid variable"; 313 } 314 } 315 316 317 /** 318 * Perform validation of global variables used across multiple shaders 319 */ 320 bool 321 cross_validate_globals(struct gl_shader_program *prog, 322 struct gl_shader **shader_list, 323 unsigned num_shaders, 324 bool uniforms_only) 325 { 326 /* Examine all of the uniforms in all of the shaders and cross validate 327 * them. 328 */ 329 glsl_symbol_table variables(prog); 330 for (unsigned i = 0; i < num_shaders; i++) { 331 if (shader_list[i] == NULL) 332 continue; 333 334 foreach_list(node, shader_list[i]->ir) { 335 ir_variable *const var = ((ir_instruction *) node)->as_variable(); 336 337 if (var == NULL) 338 continue; 339 340 if (uniforms_only && (var->mode != ir_var_uniform)) 341 continue; 342 343 /* Don't cross validate temporaries that are at global scope. These 344 * will eventually get pulled into the shaders 'main'. 345 */ 346 if (var->mode == ir_var_temporary) 347 continue; 348 349 /* If a global with this name has already been seen, verify that the 350 * new instance has the same type. In addition, if the globals have 351 * initializers, the values of the initializers must be the same. 352 */ 353 ir_variable *const existing = variables.get_variable(var->name); 354 if (existing != NULL) { 355 if (var->type != existing->type) { 356 /* Consider the types to be "the same" if both types are arrays 357 * of the same type and one of the arrays is implicitly sized. 358 * In addition, set the type of the linked variable to the 359 * explicitly sized array. 360 */ 361 if (var->type->is_array() 362 && existing->type->is_array() 363 && (var->type->fields.array == existing->type->fields.array) 364 && ((var->type->length == 0) 365 || (existing->type->length == 0))) { 366 if (existing->type->length == 0) { 367 existing->type = var->type; 368 existing->max_array_access = 369 MAX2(existing->max_array_access, 370 var->max_array_access); 371 } 372 } else { 373 linker_error_printf(prog, "%s `%s' declared as type " 374 "`%s' and type `%s'\n", 375 mode_string(var), 376 var->name, var->type->name, 377 existing->type->name); 378 return false; 379 } 380 } 381 382 if (var->explicit_location) { 383 if (existing->explicit_location 384 && (var->location != existing->location)) { 385 linker_error_printf(prog, "explicit locations for %s " 386 "`%s' have differing values\n", 387 mode_string(var), var->name); 388 return false; 389 } 390 391 existing->location = var->location; 392 existing->explicit_location = true; 393 } 394 395 /* FINISHME: Handle non-constant initializers. 396 */ 397 if (var->constant_value != NULL) { 398 if (existing->constant_value != NULL) { 399 if (!var->constant_value->has_value(existing->constant_value)) { 400 linker_error_printf(prog, "initializers for %s " 401 "`%s' have differing values\n", 402 mode_string(var), var->name); 403 return false; 404 } 405 } else 406 /* If the first-seen instance of a particular uniform did not 407 * have an initializer but a later instance does, copy the 408 * initializer to the version stored in the symbol table. 409 */ 410 /* FINISHME: This is wrong. The constant_value field should 411 * FINISHME: not be modified! Imagine a case where a shader 412 * FINISHME: without an initializer is linked in two different 413 * FINISHME: programs with shaders that have differing 414 * FINISHME: initializers. Linking with the first will 415 * FINISHME: modify the shader, and linking with the second 416 * FINISHME: will fail. 417 */ 418 existing->constant_value = 419 var->constant_value->clone(hieralloc_parent(existing), NULL); 420 } 421 422 if (existing->invariant != var->invariant) { 423 linker_error_printf(prog, "declarations for %s `%s' have " 424 "mismatching invariant qualifiers\n", 425 mode_string(var), var->name); 426 return false; 427 } 428 } else 429 variables.add_variable(var); 430 } 431 } 432 433 return true; 434 } 435 436 437 /** 438 * Perform validation of uniforms used across multiple shader stages 439 */ 440 bool 441 cross_validate_uniforms(struct gl_shader_program *prog) 442 { 443 return cross_validate_globals(prog, prog->_LinkedShaders, 444 MESA_SHADER_TYPES, true); 445 } 446 447 448 /** 449 * Validate that outputs from one stage match inputs of another 450 */ 451 bool 452 cross_validate_outputs_to_inputs(struct gl_shader_program *prog, 453 gl_shader *producer, gl_shader *consumer) 454 { 455 glsl_symbol_table parameters(prog); 456 /* FINISHME: Figure these out dynamically. */ 457 const char *const producer_stage = "vertex"; 458 const char *const consumer_stage = "fragment"; 459 460 /* Find all shader outputs in the "producer" stage. 461 */ 462 foreach_list(node, producer->ir) { 463 ir_variable *const var = ((ir_instruction *) node)->as_variable(); 464 465 /* FINISHME: For geometry shaders, this should also look for inout 466 * FINISHME: variables. 467 */ 468 if ((var == NULL) || (var->mode != ir_var_out)) 469 continue; 470 471 parameters.add_variable(var); 472 } 473 474 475 /* Find all shader inputs in the "consumer" stage. Any variables that have 476 * matching outputs already in the symbol table must have the same type and 477 * qualifiers. 478 */ 479 foreach_list(node, consumer->ir) { 480 ir_variable *const input = ((ir_instruction *) node)->as_variable(); 481 482 /* FINISHME: For geometry shaders, this should also look for inout 483 * FINISHME: variables. 484 */ 485 if ((input == NULL) || (input->mode != ir_var_in)) 486 continue; 487 488 ir_variable *const output = parameters.get_variable(input->name); 489 if (output != NULL) { 490 /* Check that the types match between stages. 491 */ 492 if (input->type != output->type) { 493 /* There is a bit of a special case for gl_TexCoord. This 494 * built-in is unsized by default. Appliations that variable 495 * access it must redeclare it with a size. There is some 496 * language in the GLSL spec that implies the fragment shader 497 * and vertex shader do not have to agree on this size. Other 498 * driver behave this way, and one or two applications seem to 499 * rely on it. 500 * 501 * Neither declaration needs to be modified here because the array 502 * sizes are fixed later when update_array_sizes is called. 503 * 504 * From page 48 (page 54 of the PDF) of the GLSL 1.10 spec: 505 * 506 * "Unlike user-defined varying variables, the built-in 507 * varying variables don't have a strict one-to-one 508 * correspondence between the vertex language and the 509 * fragment language." 510 */ 511 if (!output->type->is_array() 512 || (strncmp("gl_", output->name, 3) != 0)) { 513 linker_error_printf(prog, 514 "%s shader output `%s' declared as " 515 "type `%s', but %s shader input declared " 516 "as type `%s'\n", 517 producer_stage, output->name, 518 output->type->name, 519 consumer_stage, input->type->name); 520 return false; 521 } 522 } 523 524 /* Check that all of the qualifiers match between stages. 525 */ 526 if (input->centroid != output->centroid) { 527 linker_error_printf(prog, 528 "%s shader output `%s' %s centroid qualifier, " 529 "but %s shader input %s centroid qualifier\n", 530 producer_stage, 531 output->name, 532 (output->centroid) ? "has" : "lacks", 533 consumer_stage, 534 (input->centroid) ? "has" : "lacks"); 535 return false; 536 } 537 538 if (input->invariant != output->invariant) { 539 linker_error_printf(prog, 540 "%s shader output `%s' %s invariant qualifier, " 541 "but %s shader input %s invariant qualifier\n", 542 producer_stage, 543 output->name, 544 (output->invariant) ? "has" : "lacks", 545 consumer_stage, 546 (input->invariant) ? "has" : "lacks"); 547 return false; 548 } 549 550 if (input->interpolation != output->interpolation) { 551 linker_error_printf(prog, 552 "%s shader output `%s' specifies %s " 553 "interpolation qualifier, " 554 "but %s shader input specifies %s " 555 "interpolation qualifier\n", 556 producer_stage, 557 output->name, 558 output->interpolation_string(), 559 consumer_stage, 560 input->interpolation_string()); 561 return false; 562 } 563 } 564 } 565 566 return true; 567 } 568 569 570 /** 571 * Populates a shaders symbol table with all global declarations 572 */ 573 static void 574 populate_symbol_table(gl_shader *sh) 575 { 576 sh->symbols = new(sh) glsl_symbol_table(sh); 577 578 foreach_list(node, sh->ir) { 579 ir_instruction *const inst = (ir_instruction *) node; 580 ir_variable *var; 581 ir_function *func; 582 583 if ((func = inst->as_function()) != NULL) { 584 sh->symbols->add_function(func); 585 } else if ((var = inst->as_variable()) != NULL) { 586 sh->symbols->add_variable(var); 587 } 588 } 589 } 590 591 592 /** 593 * Remap variables referenced in an instruction tree 594 * 595 * This is used when instruction trees are cloned from one shader and placed in 596 * another. These trees will contain references to \c ir_variable nodes that 597 * do not exist in the target shader. This function finds these \c ir_variable 598 * references and replaces the references with matching variables in the target 599 * shader. 600 * 601 * If there is no matching variable in the target shader, a clone of the 602 * \c ir_variable is made and added to the target shader. The new variable is 603 * added to \b both the instruction stream and the symbol table. 604 * 605 * \param inst IR tree that is to be processed. 606 * \param symbols Symbol table containing global scope symbols in the 607 * linked shader. 608 * \param instructions Instruction stream where new variable declarations 609 * should be added. 610 */ 611 void 612 remap_variables(ir_instruction *inst, struct gl_shader *target, 613 hash_table *temps) 614 { 615 class remap_visitor : public ir_hierarchical_visitor { 616 public: 617 remap_visitor(struct gl_shader *target, 618 hash_table *temps) 619 { 620 this->target = target; 621 this->symbols = target->symbols; 622 this->instructions = target->ir; 623 this->temps = temps; 624 } 625 626 using ir_hierarchical_visitor::visit; 627 virtual ir_visitor_status visit(ir_dereference_variable *ir) 628 { 629 if (ir->var->mode == ir_var_temporary) { 630 ir_variable *var = (ir_variable *) hash_table_find(temps, ir->var); 631 632 assert(var != NULL); 633 ir->var = var; 634 return visit_continue; 635 } 636 637 ir_variable *const existing = 638 this->symbols->get_variable(ir->var->name); 639 if (existing != NULL) 640 ir->var = existing; 641 else { 642 ir_variable *copy = ir->var->clone(this->target, NULL); 643 644 this->symbols->add_variable(copy); 645 this->instructions->push_head(copy); 646 ir->var = copy; 647 } 648 649 return visit_continue; 650 } 651 652 private: 653 struct gl_shader *target; 654 glsl_symbol_table *symbols; 655 exec_list *instructions; 656 hash_table *temps; 657 }; 658 659 remap_visitor v(target, temps); 660 661 inst->accept(&v); 662 } 663 664 665 /** 666 * Move non-declarations from one instruction stream to another 667 * 668 * The intended usage pattern of this function is to pass the pointer to the 669 * head sentinel of a list (i.e., a pointer to the list cast to an \c exec_node 670 * pointer) for \c last and \c false for \c make_copies on the first 671 * call. Successive calls pass the return value of the previous call for 672 * \c last and \c true for \c make_copies. 673 * 674 * \param instructions Source instruction stream 675 * \param last Instruction after which new instructions should be 676 * inserted in the target instruction stream 677 * \param make_copies Flag selecting whether instructions in \c instructions 678 * should be copied (via \c ir_instruction::clone) into the 679 * target list or moved. 680 * 681 * \return 682 * The new "last" instruction in the target instruction stream. This pointer 683 * is suitable for use as the \c last parameter of a later call to this 684 * function. 685 */ 686 exec_node * 687 move_non_declarations(exec_list *instructions, exec_node *last, 688 bool make_copies, gl_shader *target) 689 { 690 hash_table *temps = NULL; 691 692 if (make_copies) 693 temps = hash_table_ctor(0, hash_table_pointer_hash, 694 hash_table_pointer_compare); 695 696 foreach_list_safe(node, instructions) { 697 ir_instruction *inst = (ir_instruction *) node; 698 699 if (inst->as_function()) 700 continue; 701 702 ir_variable *var = inst->as_variable(); 703 if ((var != NULL) && (var->mode != ir_var_temporary)) 704 continue; 705 706 assert(inst->as_assignment() 707 || ((var != NULL) && (var->mode == ir_var_temporary))); 708 709 if (make_copies) { 710 inst = inst->clone(target, NULL); 711 712 if (var != NULL) 713 hash_table_insert(temps, inst, var); 714 else 715 remap_variables(inst, target, temps); 716 } else { 717 inst->remove(); 718 } 719 720 last->insert_after(inst); 721 last = inst; 722 } 723 724 if (make_copies) 725 hash_table_dtor(temps); 726 727 return last; 728 } 729 730 /** 731 * Get the function signature for main from a shader 732 */ 733 static ir_function_signature * 734 get_main_function_signature(gl_shader *sh) 735 { 736 ir_function *const f = sh->symbols->get_function("main"); 737 if (f != NULL) { 738 exec_list void_parameters; 739 740 /* Look for the 'void main()' signature and ensure that it's defined. 741 * This keeps the linker from accidentally pick a shader that just 742 * contains a prototype for main. 743 * 744 * We don't have to check for multiple definitions of main (in multiple 745 * shaders) because that would have already been caught above. 746 */ 747 ir_function_signature *sig = f->matching_signature(&void_parameters); 748 if ((sig != NULL) && sig->is_defined) { 749 return sig; 750 } 751 } 752 753 return NULL; 754 } 755 756 757 /** 758 * Combine a group of shaders for a single stage to generate a linked shader 759 * 760 * \note 761 * If this function is supplied a single shader, it is cloned, and the new 762 * shader is returned. 763 */ 764 static struct gl_shader * 765 link_intrastage_shaders(void *mem_ctx, 766 const struct gl_context *ctx, 767 struct gl_shader_program *prog, 768 struct gl_shader **shader_list, 769 unsigned num_shaders) 770 { 771 /* Check that global variables defined in multiple shaders are consistent. 772 */ 773 if (!cross_validate_globals(prog, shader_list, num_shaders, false)) 774 return NULL; 775 776 /* Check that there is only a single definition of each function signature 777 * across all shaders. 778 */ 779 for (unsigned i = 0; i < (num_shaders - 1); i++) { 780 foreach_list(node, shader_list[i]->ir) { 781 ir_function *const f = ((ir_instruction *) node)->as_function(); 782 783 if (f == NULL) 784 continue; 785 786 for (unsigned j = i + 1; j < num_shaders; j++) { 787 ir_function *const other = 788 shader_list[j]->symbols->get_function(f->name); 789 790 /* If the other shader has no function (and therefore no function 791 * signatures) with the same name, skip to the next shader. 792 */ 793 if (other == NULL) 794 continue; 795 796 foreach_iter (exec_list_iterator, iter, *f) { 797 ir_function_signature *sig = 798 (ir_function_signature *) iter.get(); 799 800 if (!sig->is_defined || sig->is_builtin) 801 continue; 802 803 ir_function_signature *other_sig = 804 other->exact_matching_signature(& sig->parameters); 805 806 if ((other_sig != NULL) && other_sig->is_defined 807 && !other_sig->is_builtin) { 808 linker_error_printf(prog, 809 "function `%s' is multiply defined", 810 f->name); 811 return NULL; 812 } 813 } 814 } 815 } 816 } 817 818 /* Find the shader that defines main, and make a clone of it. 819 * 820 * Starting with the clone, search for undefined references. If one is 821 * found, find the shader that defines it. Clone the reference and add 822 * it to the shader. Repeat until there are no undefined references or 823 * until a reference cannot be resolved. 824 */ 825 gl_shader *main = NULL; 826 for (unsigned i = 0; i < num_shaders; i++) { 827 if (get_main_function_signature(shader_list[i]) != NULL) { 828 main = shader_list[i]; 829 break; 830 } 831 } 832 833 if (main == NULL) { 834 linker_error_printf(prog, "%s shader lacks `main'\n", 835 (shader_list[0]->Type == GL_VERTEX_SHADER) 836 ? "vertex" : "fragment"); 837 return NULL; 838 } 839 840 gl_shader *linked = _mesa_new_shader(prog, 0, main->Type); 841 linked->ir = new(linked) exec_list; 842 clone_ir_list(mem_ctx, linked->ir, main->ir); 843 844 populate_symbol_table(linked); 845 846 /* The a pointer to the main function in the final linked shader (i.e., the 847 * copy of the original shader that contained the main function). 848 */ 849 ir_function_signature *const main_sig = get_main_function_signature(linked); 850 851 /* Move any instructions other than variable declarations or function 852 * declarations into main. 853 */ 854 exec_node *insertion_point = 855 move_non_declarations(linked->ir, (exec_node *) &main_sig->body, false, 856 linked); 857 858 for (unsigned i = 0; i < num_shaders; i++) { 859 if (shader_list[i] == main) 860 continue; 861 862 insertion_point = move_non_declarations(shader_list[i]->ir, 863 insertion_point, true, linked); 864 } 865 866 /* Resolve initializers for global variables in the linked shader. 867 */ 868 unsigned num_linking_shaders = num_shaders; 869 for (unsigned i = 0; i < num_shaders; i++) 870 num_linking_shaders += shader_list[i]->num_builtins_to_link; 871 872 gl_shader **linking_shaders = 873 (gl_shader **) calloc(num_linking_shaders, sizeof(gl_shader *)); 874 875 memcpy(linking_shaders, shader_list, 876 sizeof(linking_shaders[0]) * num_shaders); 877 878 unsigned idx = num_shaders; 879 for (unsigned i = 0; i < num_shaders; i++) { 880 memcpy(&linking_shaders[idx], shader_list[i]->builtins_to_link, 881 sizeof(linking_shaders[0]) * shader_list[i]->num_builtins_to_link); 882 idx += shader_list[i]->num_builtins_to_link; 883 } 884 885 assert(idx == num_linking_shaders); 886 887 if (!link_function_calls(prog, linked, linking_shaders, 888 num_linking_shaders)) { 889 _mesa_delete_shader(ctx, linked); 890 linked = NULL; 891 } 892 893 free(linking_shaders); 894 895 /* Make a pass over all global variables to ensure that arrays with 896 * unspecified sizes have a size specified. The size is inferred from the 897 * max_array_access field. 898 */ 899 if (linked != NULL) { 900 foreach_list(node, linked->ir) { 901 ir_variable *const var = ((ir_instruction *) node)->as_variable(); 902 903 if (var == NULL) 904 continue; 905 906 if ((var->mode != ir_var_auto) && (var->mode != ir_var_temporary)) 907 continue; 908 909 if (!var->type->is_array() || (var->type->length != 0)) 910 continue; 911 912 const glsl_type *type = 913 glsl_type::get_array_instance(var->type->fields.array, 914 var->max_array_access); 915 916 assert(type != NULL); 917 var->type = type; 918 } 919 } 920 921 return linked; 922 } 923 924 925 struct uniform_node { 926 exec_node link; 927 struct gl_uniform *u; 928 unsigned slots; 929 }; 930 931 /** 932 * Update the sizes of linked shader uniform arrays to the maximum 933 * array index used. 934 * 935 * From page 81 (page 95 of the PDF) of the OpenGL 2.1 spec: 936 * 937 * If one or more elements of an array are active, 938 * GetActiveUniform will return the name of the array in name, 939 * subject to the restrictions listed above. The type of the array 940 * is returned in type. The size parameter contains the highest 941 * array element index used, plus one. The compiler or linker 942 * determines the highest index used. There will be only one 943 * active uniform reported by the GL per uniform array. 944 945 */ 946 static void 947 update_array_sizes(struct gl_shader_program *prog) 948 { 949 for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) { 950 if (prog->_LinkedShaders[i] == NULL) 951 continue; 952 953 foreach_list(node, prog->_LinkedShaders[i]->ir) { 954 ir_variable *const var = ((ir_instruction *) node)->as_variable(); 955 956 if ((var == NULL) || (var->mode != ir_var_uniform && 957 var->mode != ir_var_in && 958 var->mode != ir_var_out) || 959 !var->type->is_array()) 960 continue; 961 962 unsigned int size = var->max_array_access; 963 for (unsigned j = 0; j < MESA_SHADER_TYPES; j++) { 964 if (prog->_LinkedShaders[j] == NULL) 965 continue; 966 967 foreach_list(node2, prog->_LinkedShaders[j]->ir) { 968 ir_variable *other_var = ((ir_instruction *) node2)->as_variable(); 969 if (!other_var) 970 continue; 971 972 if (strcmp(var->name, other_var->name) == 0 && 973 other_var->max_array_access > size) { 974 size = other_var->max_array_access; 975 } 976 } 977 } 978 979 if (size + 1 != var->type->fields.array->length) { 980 var->type = glsl_type::get_array_instance(var->type->fields.array, 981 size + 1); 982 /* FINISHME: We should update the types of array 983 * dereferences of this variable now. 984 */ 985 } 986 } 987 } 988 } 989 990 static int // returns location assigned 991 add_uniform(void *mem_ctx, exec_list *uniforms, struct hash_table *ht, 992 const char *name, const glsl_type *type, GLenum shader_type, 993 unsigned *next_shader_pos, unsigned *total_uniforms, unsigned *next_sampler_pos, unsigned * samplers_used) 994 { 995 int index = -1; 996 if (type->is_record()) { 997 for (unsigned int i = 0; i < type->length; i++) { 998 const glsl_type *field_type = type->fields.structure[i].type; 999 char *field_name = hieralloc_asprintf(mem_ctx, "%s.%s", name, 1000 type->fields.structure[i].name); 1001 1002 int firstIndex = add_uniform(mem_ctx, uniforms, ht, field_name, field_type, 1003 shader_type, next_shader_pos, total_uniforms, next_sampler_pos, samplers_used); 1004 if (i == 0) 1005 index = firstIndex; 1006 } 1007 } else { 1008 uniform_node *n = (uniform_node *) hash_table_find(ht, name); 1009 unsigned int vec4_slots; 1010 const glsl_type *array_elem_type = NULL; 1011 1012 if (type->is_array()) { 1013 array_elem_type = type->fields.array; 1014 /* Array of structures. */ 1015 if (array_elem_type->is_record()) { 1016 for (unsigned int i = 0; i < type->length; i++) { 1017 char *elem_name = hieralloc_asprintf(mem_ctx, "%s[%d]", name, i); 1018 int firstIndex = add_uniform(mem_ctx, uniforms, ht, elem_name, array_elem_type, 1019 shader_type, next_shader_pos, total_uniforms, next_sampler_pos, samplers_used); 1020 if (i == 0) 1021 index = firstIndex; 1022 } 1023 return index; 1024 } 1025 } 1026 1027 /* Fix the storage size of samplers at 1 vec4 each. Be sure to pad out 1028 * vectors to vec4 slots. 1029 */ 1030 if (type->is_array()) { 1031 if (array_elem_type->is_sampler()) 1032 vec4_slots = type->length; 1033 else 1034 vec4_slots = type->length * array_elem_type->matrix_columns; 1035 } else if (type->is_sampler()) 1036 vec4_slots = 1; 1037 else 1038 vec4_slots = type->matrix_columns; 1039 1040 if (n == NULL) { 1041 n = (uniform_node *) calloc(1, sizeof(struct uniform_node)); 1042 n->u = (gl_uniform *) calloc(1, sizeof(struct gl_uniform)); 1043 n->slots = vec4_slots; 1044 1045 n->u->Name = strdup(name); 1046 n->u->Type = type; 1047 n->u->Pos = *next_shader_pos; 1048 (*total_uniforms)++; 1049 1050 if (type->is_sampler() || (array_elem_type && array_elem_type->is_sampler())) 1051 { 1052 n->u->Pos = *next_sampler_pos; 1053 *next_sampler_pos += vec4_slots; 1054 } 1055 else 1056 (*next_shader_pos) += vec4_slots; 1057 hash_table_insert(ht, n, name); 1058 uniforms->push_tail(&n->link); 1059 } 1060 1061 if (type->is_sampler() || (array_elem_type && array_elem_type->is_sampler())) 1062 (*samplers_used) |= 1 << n->u->Pos; 1063 index = n->u->Pos; 1064 } 1065 return index; 1066 } 1067 1068 void 1069 assign_uniform_locations(struct gl_shader_program *prog) 1070 { 1071 /* */ 1072 exec_list uniforms; 1073 unsigned total_uniforms = 0; 1074 unsigned next_sampler_pos = 0; // all shaders in prog share same sampler location 1075 hash_table *ht = hash_table_ctor(32, hash_table_string_hash, 1076 hash_table_string_compare); 1077 void *mem_ctx = hieralloc_new(prog); 1078 1079 unsigned next_position = 0; // also number of slots for uniforms 1080 1081 for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) { 1082 if (prog->_LinkedShaders[i] == NULL) 1083 continue; 1084 1085 prog->_LinkedShaders[i]->SamplersUsed = 0; 1086 foreach_list(node, prog->_LinkedShaders[i]->ir) { 1087 ir_variable *const var = ((ir_instruction *) node)->as_variable(); 1088 1089 if ((var == NULL) || (var->mode != ir_var_uniform)) 1090 continue; 1091 1092 if (strncmp(var->name, "gl_", 3) == 0) { 1093 /* At the moment, we don't allocate uniform locations for 1094 * builtin uniforms. It's permitted by spec, and we'll 1095 * likely switch to doing that at some point, but not yet. 1096 */ 1097 continue; 1098 } 1099 1100 var->location = add_uniform(mem_ctx, &uniforms, ht, var->name, var->type, 1101 prog->_LinkedShaders[i]->Type, 1102 &next_position, &total_uniforms, &next_sampler_pos, &prog->_LinkedShaders[i]->SamplersUsed); 1103 } 1104 } 1105 1106 gl_uniform_list *ul = hieralloc_zero(prog, gl_uniform_list); 1107 1108 ul->Size = total_uniforms; 1109 ul->NumUniforms = total_uniforms; 1110 ul->Uniforms = (gl_uniform *)hieralloc_zero_size(ul, total_uniforms * sizeof(gl_uniform)); 1111 1112 unsigned idx = 0; 1113 uniform_node *next; 1114 for (uniform_node *node = (uniform_node *) uniforms.head 1115 ; node->link.next != NULL 1116 ; node = next) { 1117 next = (uniform_node *) node->link.next; 1118 1119 node->link.remove(); 1120 memcpy(&ul->Uniforms[idx], node->u, sizeof(gl_uniform)); 1121 idx++; 1122 1123 free(node->u); 1124 free(node); 1125 } 1126 1127 hash_table_dtor(ht); 1128 1129 prog->Uniforms = ul; 1130 prog->Uniforms->Slots = next_position; 1131 prog->Uniforms->SamplerSlots = next_sampler_pos; 1132 1133 hieralloc_free(mem_ctx); 1134 } 1135 1136 1137 /** 1138 * Find a contiguous set of available bits in a bitmask 1139 * 1140 * \param used_mask Bits representing used (1) and unused (0) locations 1141 * \param needed_count Number of contiguous bits needed. 1142 * 1143 * \return 1144 * Base location of the available bits on success or -1 on failure. 1145 */ 1146 int 1147 find_available_slots(unsigned used_mask, unsigned needed_count) 1148 { 1149 unsigned needed_mask = (1 << needed_count) - 1; 1150 const int max_bit_to_test = (8 * sizeof(used_mask)) - needed_count; 1151 1152 /* The comparison to 32 is redundant, but without it GCC emits "warning: 1153 * cannot optimize possibly infinite loops" for the loop below. 1154 */ 1155 if ((needed_count == 0) || (max_bit_to_test < 0) || (max_bit_to_test > 32)) 1156 return -1; 1157 1158 for (int i = 0; i <= max_bit_to_test; i++) { 1159 if ((needed_mask & ~used_mask) == needed_mask) 1160 return i; 1161 1162 needed_mask <<= 1; 1163 } 1164 1165 return -1; 1166 } 1167 1168 1169 bool 1170 assign_attribute_locations(gl_shader_program *prog, unsigned max_attribute_index) 1171 { 1172 /* Mark invalid attribute locations as being used. 1173 */ 1174 unsigned used_locations = (max_attribute_index >= 32) 1175 ? ~0 : ~((1 << max_attribute_index) - 1); 1176 1177 gl_shader *const sh = prog->_LinkedShaders[0]; 1178 assert(sh->Type == GL_VERTEX_SHADER); 1179 prog->VaryingSlots = 0; 1180 /* Operate in a total of four passes. 1181 * 1182 * 1. Invalidate the location assignments for all vertex shader inputs, 1183 * except for explicit_location and glBindAttribLocation 1184 * 1185 * 2. Assign locations for inputs that have user-defined (via 1186 * glBindVertexAttribLocation) locatoins. 1187 * 1188 * 3. Sort the attributes without assigned locations by number of slots 1189 * required in decreasing order. Fragmentation caused by attribute 1190 * locations assigned by the application may prevent large attributes 1191 * from having enough contiguous space. 1192 * 1193 * 4. Assign locations to any inputs without assigned locations. 1194 */ 1195 if (prog->Attributes != NULL) { 1196 // declare attributes if they haven't been already by BindAttribLocation 1197 gl_program_parameter_list * attributes = prog->Attributes; 1198 foreach_list(node, sh->ir) { 1199 ir_variable *const var = ((ir_instruction *) node)->as_variable(); 1200 if ((var == NULL) || (var->mode != ir_var_in)) 1201 continue; 1202 if (_mesa_get_parameter(attributes, var->name) < 0) 1203 _mesa_add_parameter(attributes, var->name); 1204 } 1205 1206 for (unsigned i = 0; i < attributes->NumParameters; i++) { 1207 gl_program_parameter * param = attributes->Parameters + i; 1208 ir_variable * const var = sh->symbols->get_variable(param->Name); 1209 if (!var || ir_var_in != var->mode) 1210 continue; 1211 1212 if (param->BindLocation >= 0 && !var->explicit_location) 1213 var->location = param->Location = param->BindLocation; 1214 else if (var->explicit_location) 1215 param->Location = var->location; 1216 else 1217 var->location = -1; 1218 const unsigned slots = count_attribute_slots(var->type); 1219 param->Slots = slots; 1220 if (0 > var->location) 1221 continue; 1222 /* From page 61 of the OpenGL 4.0 spec: 1223 * 1224 * "LinkProgram will fail if the attribute bindings assigned by 1225 * BindAttribLocation do not leave not enough space to assign a 1226 * location for an active matrix attribute or an active attribute 1227 * array, both of which require multiple contiguous generic 1228 * attributes." 1229 * 1230 * Previous versions of the spec contain similar language but omit the 1231 * bit about attribute arrays. 1232 * 1233 * Page 61 of the OpenGL 4.0 spec also says: 1234 * 1235 * "It is possible for an application to bind more than one 1236 * attribute name to the same location. This is referred to as 1237 * aliasing. This will only work if only one of the aliased 1238 * attributes is active in the executable program, or if no path 1239 * through the shader consumes more than one attribute of a set 1240 * of attributes aliased to the same location. A link error can 1241 * occur if the linker determines that every path through the 1242 * shader consumes multiple aliased attributes, but 1243 * implementations are not required to generate an error in this 1244 * case." 1245 * 1246 * These two paragraphs are either somewhat contradictory, or I don't 1247 * fully understand one or both of them. 1248 */ 1249 /* FINISHME: The code as currently written does not support attribute 1250 * FINISHME: location aliasing (see comment above). 1251 */ 1252 const int attr = param->Location; 1253 /* Mask representing the contiguous slots that will be used by this 1254 * attribute. 1255 */ 1256 const unsigned use_mask = (1 << slots) - 1; 1257 /* Generate a link error if the set of bits requested for this 1258 * attribute overlaps any previously allocated bits. 1259 */ 1260 if ((use_mask << attr) & used_locations) { 1261 linker_error_printf(prog, 1262 "insufficient contiguous attribute locations " 1263 "available for vertex shader input `%s'", 1264 var->name); 1265 return false; 1266 } 1267 1268 used_locations |= (use_mask << attr); 1269 } 1270 } 1271 1272 /* Temporary storage for the set of attributes that need locations assigned. 1273 */ 1274 struct temp_attr { 1275 unsigned slots; 1276 ir_variable *var; 1277 1278 /* Used below in the call to qsort. */ 1279 static int compare(const void *a, const void *b) 1280 { 1281 const temp_attr *const l = (const temp_attr *) a; 1282 const temp_attr *const r = (const temp_attr *) b; 1283 1284 /* Reversed because we want a descending order sort below. */ 1285 return r->slots - l->slots; 1286 } 1287 } to_assign[16]; 1288 1289 unsigned num_attr = 0; 1290 1291 foreach_list(node, sh->ir) { 1292 ir_variable *const var = ((ir_instruction *) node)->as_variable(); 1293 if ((var == NULL) || (var->mode != ir_var_in)) 1294 continue; 1295 if (var->explicit_location) { 1296 const unsigned slots = count_attribute_slots(var->type); 1297 const unsigned use_mask = (1 << slots) - 1; 1298 const int attr = var->location/* - VERT_ATTRIB_GENERIC0*/; 1299 1300 if ((var->location >= (int)(max_attribute_index/* + VERT_ATTRIB_GENERIC0*/)) 1301 || (var->location < 0)) { 1302 linker_error_printf(prog, 1303 "invalid explicit location %d specified for " 1304 "`%s'\n", 1305 (var->location < 0) ? var->location : attr, 1306 var->name); 1307 return false; 1308 } else if (var->location >= 0/*VERT_ATTRIB_GENERIC0*/) { 1309 used_locations |= (use_mask << attr); 1310 } 1311 } 1312 1313 /* The location was explicitly assigned, nothing to do here. 1314 */ 1315 if (var->location != -1) 1316 continue; 1317 1318 to_assign[num_attr].slots = count_attribute_slots(var->type); 1319 to_assign[num_attr].var = var; 1320 num_attr++; 1321 } 1322 1323 /* If all of the attributes were assigned locations by the application (or 1324 * are built-in attributes with fixed locations), return early. This should 1325 * be the common case. 1326 */ 1327 if (num_attr == 0) 1328 return true; 1329 1330 qsort(to_assign, num_attr, sizeof(to_assign[0]), temp_attr::compare); 1331 1332 /* VERT_ATTRIB_GENERIC0 is a psdueo-alias for VERT_ATTRIB_POS. It can only 1333 * be explicitly assigned by via glBindAttribLocation. Mark it as reserved 1334 * to prevent it from being automatically allocated below. 1335 */ 1336 find_deref_visitor find("gl_Vertex"); 1337 find.run(sh->ir); 1338 if (find.variable_found()) 1339 used_locations |= (1 << 0); 1340 1341 for (unsigned i = 0; i < num_attr; i++) { 1342 /* Mask representing the contiguous slots that will be used by this 1343 * attribute. 1344 */ 1345 const unsigned use_mask = (1 << to_assign[i].slots) - 1; 1346 1347 int location = find_available_slots(used_locations, to_assign[i].slots); 1348 1349 if (location < 0) { 1350 linker_error_printf(prog, 1351 "insufficient contiguous attribute locations " 1352 "available for vertex shader input `%s'", 1353 to_assign[i].var->name); 1354 return false; 1355 } 1356 1357 to_assign[i].var->location = /*VERT_ATTRIB_GENERIC0 +*/ location; 1358 used_locations |= (use_mask << location); 1359 int paramIndex = _mesa_get_parameter(prog->Attributes, to_assign[i].var->name); 1360 if (0 <= paramIndex) 1361 prog->Attributes->Parameters[paramIndex].Location = location; 1362 } 1363 1364 return true; 1365 } 1366 1367 1368 /** 1369 * Demote shader inputs and outputs that are not used in other stages 1370 */ 1371 void 1372 demote_shader_inputs_and_outputs(gl_shader *sh, enum ir_variable_mode mode) 1373 { 1374 foreach_list(node, sh->ir) { 1375 ir_variable *const var = ((ir_instruction *) node)->as_variable(); 1376 1377 if ((var == NULL) || (var->mode != int(mode))) 1378 continue; 1379 1380 /* A shader 'in' or 'out' variable is only really an input or output if 1381 * its value is used by other shader stages. This will cause the variable 1382 * to have a location assigned. 1383 */ 1384 if (var->location == -1) { 1385 var->mode = ir_var_auto; 1386 } 1387 } 1388 } 1389 1390 void 1391 assign_varying_locations(struct gl_shader_program *prog, 1392 gl_shader *producer, gl_shader *consumer) 1393 { 1394 prog->VaryingSlots = 0; 1395 prog->UsesFragCoord = false; 1396 prog->UsesPointCoord = false; 1397 /* FINISHME: Set dynamically when geometry shader support is added. */ 1398 unsigned output_index = offsetof(VertexOutput,varyings) / sizeof(Vector4); /*VERT_RESULT_VAR0*/; 1399 unsigned input_index = offsetof(VertexOutput,varyings) / sizeof(Vector4); 1400 1401 /* Operate in a total of three passes. 1402 * 1403 * 1. Assign locations for any matching inputs and outputs. 1404 * 1405 * 2. Mark output variables in the producer that do not have locations as 1406 * not being outputs. This lets the optimizer eliminate them. 1407 * 1408 * 3. Mark input variables in the consumer that do not have locations as 1409 * not being inputs. This lets the optimizer eliminate them. 1410 */ 1411 foreach_list(node, producer->ir) { 1412 ir_variable *const var = ((ir_instruction *) node)->as_variable(); 1413 if (!var || ir_var_out != var->mode) 1414 continue; 1415 if (!strcmp("gl_Position", var->name)) 1416 var->location = offsetof(VertexOutput,position) / sizeof(Vector4); 1417 else if (!strcmp("gl_PointSize", var->name)) 1418 var->location = offsetof(VertexOutput,pointSize) / sizeof(Vector4); 1419 else 1420 var->location = -1; 1421 } 1422 foreach_list(node, consumer->ir) { 1423 ir_variable *const var = ((ir_instruction *) node)->as_variable(); 1424 if (!var || ir_var_in != var->mode) 1425 continue; 1426 if (!strcmp("gl_FragCoord", var->name)) 1427 { 1428 var->location = offsetof(VertexOutput,position)/sizeof(Vector4); 1429 prog->UsesFragCoord = true; 1430 } 1431 else if (!strcmp("gl_FrontFacing", var->name)) 1432 var->location = offsetof(VertexOutput,frontFacingPointCoord)/sizeof(Vector4); 1433 else if (!strcmp("gl_PointCoord", var->name)) 1434 { 1435 var->location = offsetof(VertexOutput,frontFacingPointCoord)/sizeof(Vector4); 1436 prog->UsesPointCoord = true; 1437 } 1438 else 1439 var->location = -1; 1440 } 1441 1442 foreach_list(node, producer->ir) { 1443 ir_variable *const output_var = ((ir_instruction *) node)->as_variable(); 1444 1445 if ((output_var == NULL) || (output_var->mode != ir_var_out)) 1446 continue; 1447 int paramIndex = _mesa_get_parameter(prog->Varying, output_var->name); 1448 if (paramIndex < 0) 1449 paramIndex = _mesa_add_parameter(prog->Varying, output_var->name); 1450 gl_program_parameter * param = prog->Varying->Parameters + paramIndex; 1451 if (output_var->location != -1) 1452 { 1453 param->BindLocation = output_var->location; 1454 continue; 1455 } 1456 1457 ir_variable *const input_var = 1458 consumer->symbols->get_variable(output_var->name); 1459 1460 if ((input_var == NULL) || (input_var->mode != ir_var_in)) 1461 continue; 1462 1463 assert(input_var->location == -1); 1464 1465 param->BindLocation = output_var->location = output_index; 1466 param->Location = input_var->location = input_index; 1467 1468 /* FINISHME: Support for "varying" records in GLSL 1.50. */ 1469 assert(!output_var->type->is_record()); 1470 1471 if (output_var->type->is_array()) { 1472 const unsigned slots = output_var->type->length 1473 * output_var->type->fields.array->matrix_columns; 1474 1475 output_index += slots; 1476 input_index += slots; 1477 prog->VaryingSlots += slots; 1478 } else { 1479 const unsigned slots = output_var->type->matrix_columns; 1480 1481 output_index += slots; 1482 input_index += slots; 1483 prog->VaryingSlots += slots; 1484 } 1485 } 1486 1487 foreach_list(node, consumer->ir) { 1488 ir_variable *const var = ((ir_instruction *) node)->as_variable(); 1489 1490 if ((var == NULL) || (var->mode != ir_var_in)) 1491 continue; 1492 int paramIndex = _mesa_get_parameter(prog->Varying, var->name); 1493 if (paramIndex < 0) 1494 paramIndex = _mesa_add_parameter(prog->Varying, var->name); 1495 gl_program_parameter * param = prog->Varying->Parameters + paramIndex; 1496 1497 if (var->location == -1) { 1498 if (prog->Version <= 120) { 1499 /* On page 25 (page 31 of the PDF) of the GLSL 1.20 spec: 1500 * 1501 * Only those varying variables used (i.e. read) in 1502 * the fragment shader executable must be written to 1503 * by the vertex shader executable; declaring 1504 * superfluous varying variables in a vertex shader is 1505 * permissible. 1506 * 1507 * We interpret this text as meaning that the VS must 1508 * write the variable for the FS to read it. See 1509 * "glsl1-varying read but not written" in piglit. 1510 */ 1511 1512 linker_error_printf(prog, "fragment shader varying %s not written " 1513 "by vertex shader\n.", var->name); 1514 prog->LinkStatus = false; 1515 } 1516 1517 /* An 'in' variable is only really a shader input if its 1518 * value is written by the previous stage. 1519 */ 1520 var->mode = ir_var_auto; 1521 } 1522 else 1523 param->Location = var->location; 1524 } 1525 } 1526 1527 1528 void 1529 link_shaders(const struct gl_context *ctx, struct gl_shader_program *prog) 1530 { 1531 //void *mem_ctx = hieralloc_init("temporary linker context"); 1532 void * mem_ctx = prog; // need linked & cloned ir to persist 1533 1534 prog->LinkStatus = false; 1535 prog->Validated = false; 1536 prog->_Used = false; 1537 1538 if (prog->InfoLog != NULL) 1539 hieralloc_free(prog->InfoLog); 1540 1541 prog->InfoLog = hieralloc_strdup(prog, ""); 1542 1543 /* Separate the shaders into groups based on their type. 1544 */ 1545 struct gl_shader **vert_shader_list; 1546 unsigned num_vert_shaders = 0; 1547 struct gl_shader **frag_shader_list; 1548 unsigned num_frag_shaders = 0; 1549 1550 vert_shader_list = (struct gl_shader **) 1551 calloc(2 * prog->NumShaders, sizeof(struct gl_shader *)); 1552 frag_shader_list = &vert_shader_list[prog->NumShaders]; 1553 1554 unsigned min_version = UINT_MAX; 1555 unsigned max_version = 0; 1556 for (unsigned i = 0; i < prog->NumShaders; i++) { 1557 min_version = MIN2(min_version, prog->Shaders[i]->Version); 1558 max_version = MAX2(max_version, prog->Shaders[i]->Version); 1559 1560 switch (prog->Shaders[i]->Type) { 1561 case GL_VERTEX_SHADER: 1562 vert_shader_list[num_vert_shaders] = prog->Shaders[i]; 1563 num_vert_shaders++; 1564 break; 1565 case GL_FRAGMENT_SHADER: 1566 frag_shader_list[num_frag_shaders] = prog->Shaders[i]; 1567 num_frag_shaders++; 1568 break; 1569 case GL_GEOMETRY_SHADER: 1570 /* FINISHME: Support geometry shaders. */ 1571 assert(prog->Shaders[i]->Type != GL_GEOMETRY_SHADER); 1572 break; 1573 } 1574 } 1575 1576 /* Previous to GLSL version 1.30, different compilation units could mix and 1577 * match shading language versions. With GLSL 1.30 and later, the versions 1578 * of all shaders must match. 1579 */ 1580 assert(min_version >= 100); 1581 assert(max_version <= 130); 1582 if ((max_version >= 130 || min_version == 100) 1583 && min_version != max_version) { 1584 linker_error_printf(prog, "all shaders must use same shading " 1585 "language version\n"); 1586 goto done; 1587 } 1588 1589 prog->Version = max_version; 1590 1591 for (unsigned int i = 0; i < MESA_SHADER_TYPES; i++) { 1592 if (prog->_LinkedShaders[i] != NULL) 1593 _mesa_delete_shader(ctx, prog->_LinkedShaders[i]); 1594 1595 prog->_LinkedShaders[i] = NULL; 1596 } 1597 1598 /* Link all shaders for a particular stage and validate the result. 1599 */ 1600 if (num_vert_shaders > 0) { 1601 gl_shader *const sh = 1602 link_intrastage_shaders(mem_ctx, ctx, prog, vert_shader_list, 1603 num_vert_shaders); 1604 1605 if (sh == NULL) 1606 goto done; 1607 1608 if (!validate_vertex_shader_executable(prog, sh)) 1609 goto done; 1610 1611 _mesa_reference_shader(ctx, &prog->_LinkedShaders[MESA_SHADER_VERTEX], 1612 sh); 1613 } 1614 1615 if (num_frag_shaders > 0) { 1616 gl_shader *const sh = 1617 link_intrastage_shaders(mem_ctx, ctx, prog, frag_shader_list, 1618 num_frag_shaders); 1619 1620 if (sh == NULL) 1621 goto done; 1622 1623 if (!validate_fragment_shader_executable(prog, sh)) 1624 goto done; 1625 1626 _mesa_reference_shader(ctx, &prog->_LinkedShaders[MESA_SHADER_FRAGMENT], 1627 sh); 1628 } 1629 1630 /* Here begins the inter-stage linking phase. Some initial validation is 1631 * performed, then locations are assigned for uniforms, attributes, and 1632 * varyings. 1633 */ 1634 if (cross_validate_uniforms(prog)) { 1635 unsigned prev; 1636 1637 for (prev = 0; prev < MESA_SHADER_TYPES; prev++) { 1638 if (prog->_LinkedShaders[prev] != NULL) 1639 break; 1640 } 1641 1642 /* Validate the inputs of each stage with the output of the preceeding 1643 * stage. 1644 */ 1645 for (unsigned i = prev + 1; i < MESA_SHADER_TYPES; i++) { 1646 if (prog->_LinkedShaders[i] == NULL) 1647 continue; 1648 1649 if (!cross_validate_outputs_to_inputs(prog, 1650 prog->_LinkedShaders[prev], 1651 prog->_LinkedShaders[i])) 1652 goto done; 1653 1654 prev = i; 1655 } 1656 1657 prog->LinkStatus = true; 1658 } 1659 1660 /* Do common optimization before assigning storage for attributes, 1661 * uniforms, and varyings. Later optimization could possibly make 1662 * some of that unused. 1663 */ 1664 for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) { 1665 if (prog->_LinkedShaders[i] == NULL) 1666 continue; 1667 1668 while (do_common_optimization(prog->_LinkedShaders[i]->ir, true, 32)) 1669 ; 1670 } 1671 1672 update_array_sizes(prog); 1673 1674 assign_uniform_locations(prog); 1675 1676 if (prog->_LinkedShaders[MESA_SHADER_VERTEX] != NULL) { 1677 /* FINISHME: The value of the max_attribute_index parameter is 1678 * FINISHME: implementation dependent based on the value of 1679 * FINISHME: GL_MAX_VERTEX_ATTRIBS. GL_MAX_VERTEX_ATTRIBS must be 1680 * FINISHME: at least 16, so hardcode 16 for now. 1681 */ 1682 if (!assign_attribute_locations(prog, 16)) { 1683 prog->LinkStatus = false; 1684 goto done; 1685 } 1686 prog->AttributeSlots = 0; 1687 for (unsigned i = 0; i < prog->Attributes->NumParameters; i++) 1688 { 1689 const gl_program_parameter & param = prog->Attributes->Parameters[i]; 1690 if (param.Location + param.Slots > prog->AttributeSlots) 1691 prog->AttributeSlots = param.Location + param.Slots; 1692 } 1693 } 1694 1695 unsigned prev; 1696 for (prev = 0; prev < MESA_SHADER_TYPES; prev++) { 1697 if (prog->_LinkedShaders[prev] != NULL) 1698 break; 1699 } 1700 1701 for (unsigned i = prev + 1; i < MESA_SHADER_TYPES; i++) { 1702 if (prog->_LinkedShaders[i] == NULL) 1703 continue; 1704 1705 assign_varying_locations(prog, 1706 prog->_LinkedShaders[prev], 1707 prog->_LinkedShaders[i]); 1708 prev = i; 1709 } 1710 1711 if (prog->_LinkedShaders[MESA_SHADER_VERTEX] != NULL) { 1712 demote_shader_inputs_and_outputs(prog->_LinkedShaders[MESA_SHADER_VERTEX], 1713 ir_var_out); 1714 } 1715 1716 if (prog->_LinkedShaders[MESA_SHADER_GEOMETRY] != NULL) { 1717 gl_shader *const sh = prog->_LinkedShaders[MESA_SHADER_GEOMETRY]; 1718 1719 demote_shader_inputs_and_outputs(sh, ir_var_in); 1720 demote_shader_inputs_and_outputs(sh, ir_var_inout); 1721 demote_shader_inputs_and_outputs(sh, ir_var_out); 1722 } 1723 1724 if (prog->_LinkedShaders[MESA_SHADER_FRAGMENT] != NULL) { 1725 gl_shader *const sh = prog->_LinkedShaders[MESA_SHADER_FRAGMENT]; 1726 1727 demote_shader_inputs_and_outputs(sh, ir_var_in); 1728 1729 foreach_list(node, sh->ir) { 1730 ir_variable *const var = ((ir_instruction *) node)->as_variable(); 1731 if (!var || ir_var_out != var->mode) 1732 continue; 1733 if (!strcmp("gl_FragColor", var->name) || !strcmp("gl_FragData", var->name)) 1734 { 1735 int paramIndex = _mesa_get_parameter(prog->Varying, var->name); 1736 if (0 > paramIndex) 1737 paramIndex = _mesa_add_parameter(prog->Varying, var->name); 1738 var->location= offsetof(VertexOutput,fragColor)/sizeof(Vector4); 1739 prog->Varying->Parameters[paramIndex].Location = var->location; 1740 } 1741 else 1742 assert(0); 1743 } 1744 } 1745 1746 //prog->InputOuputBase = malloc(1024 * 8); 1747 //memset(prog->InputOuputBase, 0xdd, 1024 * 8); 1748 prog->InputOuputBase = hieralloc_realloc(prog, prog->InputOuputBase, char, 1749 (prog->Uniforms->Slots + prog->Uniforms->SamplerSlots) * sizeof(float) * 4 + sizeof(VertexInput) + sizeof(VertexOutput) + 16); 1750 prog->ValuesVertexInput = (float (*)[4])((((unsigned long)prog->InputOuputBase) + 15L) & (~15L)); 1751 prog->ValuesVertexOutput = (float (*)[4])((unsigned long)prog->ValuesVertexInput + sizeof(VertexInput)); 1752 prog->ValuesUniform = (float (*)[4])((unsigned long)prog->ValuesVertexOutput + sizeof(VertexOutput)); 1753 1754 // initialize uniforms to zero after link 1755 memset(prog->ValuesUniform, 0, sizeof(float) * 4 * (prog->Uniforms->Slots + prog->Uniforms->SamplerSlots)); 1756 1757 done: 1758 free(vert_shader_list); 1759 1760 for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) { 1761 if (prog->_LinkedShaders[i] == NULL) 1762 continue; 1763 1764 /* Retain any live IR, but trash the rest. */ 1765 reparent_ir(prog->_LinkedShaders[i]->ir, prog->_LinkedShaders[i]->ir); 1766 } 1767 1768 //hieralloc_free(mem_ctx); 1769 } 1770