1 /* 2 * Copyright 2011 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 "main/core.h" 25 #include "ir.h" 26 #include "linker.h" 27 #include "ir_uniform.h" 28 #include "glsl_symbol_table.h" 29 #include "program.h" 30 #include "util/string_to_uint_map.h" 31 #include "ir_array_refcount.h" 32 33 /** 34 * \file link_uniforms.cpp 35 * Assign locations for GLSL uniforms. 36 * 37 * \author Ian Romanick <ian.d.romanick (at) intel.com> 38 */ 39 40 /** 41 * Used by linker to indicate uniforms that have no location set. 42 */ 43 #define UNMAPPED_UNIFORM_LOC ~0u 44 45 /** 46 * Count the backing storage requirements for a type 47 */ 48 static unsigned 49 values_for_type(const glsl_type *type) 50 { 51 if (type->is_sampler()) { 52 return 1; 53 } else if (type->is_array() && type->fields.array->is_sampler()) { 54 return type->array_size(); 55 } else { 56 return type->component_slots(); 57 } 58 } 59 60 void 61 program_resource_visitor::process(const glsl_type *type, const char *name) 62 { 63 assert(type->without_array()->is_record() 64 || type->without_array()->is_interface()); 65 66 unsigned record_array_count = 1; 67 char *name_copy = ralloc_strdup(NULL, name); 68 enum glsl_interface_packing packing = type->get_interface_packing(); 69 70 recursion(type, &name_copy, strlen(name), false, NULL, packing, false, 71 record_array_count, NULL); 72 ralloc_free(name_copy); 73 } 74 75 void 76 program_resource_visitor::process(ir_variable *var) 77 { 78 unsigned record_array_count = 1; 79 const bool row_major = 80 var->data.matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR; 81 82 const enum glsl_interface_packing packing = var->get_interface_type() ? 83 var->get_interface_type_packing() : 84 var->type->get_interface_packing(); 85 86 const glsl_type *t = 87 var->data.from_named_ifc_block ? var->get_interface_type() : var->type; 88 const glsl_type *t_without_array = t->without_array(); 89 90 /* false is always passed for the row_major parameter to the other 91 * processing functions because no information is available to do 92 * otherwise. See the warning in linker.h. 93 */ 94 if (t_without_array->is_record() || 95 (t->is_array() && t->fields.array->is_array())) { 96 char *name = ralloc_strdup(NULL, var->name); 97 recursion(var->type, &name, strlen(name), row_major, NULL, packing, 98 false, record_array_count, NULL); 99 ralloc_free(name); 100 } else if (t_without_array->is_interface()) { 101 char *name = ralloc_strdup(NULL, t_without_array->name); 102 const glsl_struct_field *ifc_member = var->data.from_named_ifc_block ? 103 &t_without_array-> 104 fields.structure[t_without_array->field_index(var->name)] : NULL; 105 106 recursion(t, &name, strlen(name), row_major, NULL, packing, 107 false, record_array_count, ifc_member); 108 ralloc_free(name); 109 } else { 110 this->set_record_array_count(record_array_count); 111 this->visit_field(t, var->name, row_major, NULL, packing, false); 112 } 113 } 114 115 void 116 program_resource_visitor::recursion(const glsl_type *t, char **name, 117 size_t name_length, bool row_major, 118 const glsl_type *record_type, 119 const enum glsl_interface_packing packing, 120 bool last_field, 121 unsigned record_array_count, 122 const glsl_struct_field *named_ifc_member) 123 { 124 /* Records need to have each field processed individually. 125 * 126 * Arrays of records need to have each array element processed 127 * individually, then each field of the resulting array elements processed 128 * individually. 129 */ 130 if (t->is_interface() && named_ifc_member) { 131 ralloc_asprintf_rewrite_tail(name, &name_length, ".%s", 132 named_ifc_member->name); 133 recursion(named_ifc_member->type, name, name_length, row_major, NULL, 134 packing, false, record_array_count, NULL); 135 } else if (t->is_record() || t->is_interface()) { 136 if (record_type == NULL && t->is_record()) 137 record_type = t; 138 139 if (t->is_record()) 140 this->enter_record(t, *name, row_major, packing); 141 142 for (unsigned i = 0; i < t->length; i++) { 143 const char *field = t->fields.structure[i].name; 144 size_t new_length = name_length; 145 146 if (t->fields.structure[i].type->is_record()) 147 this->visit_field(&t->fields.structure[i]); 148 149 if (t->is_interface() && t->fields.structure[i].offset != -1) 150 this->set_buffer_offset(t->fields.structure[i].offset); 151 152 /* Append '.field' to the current variable name. */ 153 if (name_length == 0) { 154 ralloc_asprintf_rewrite_tail(name, &new_length, "%s", field); 155 } else { 156 ralloc_asprintf_rewrite_tail(name, &new_length, ".%s", field); 157 } 158 159 /* The layout of structures at the top level of the block is set 160 * during parsing. For matrices contained in multiple levels of 161 * structures in the block, the inner structures have no layout. 162 * These cases must potentially inherit the layout from the outer 163 * levels. 164 */ 165 bool field_row_major = row_major; 166 const enum glsl_matrix_layout matrix_layout = 167 glsl_matrix_layout(t->fields.structure[i].matrix_layout); 168 if (matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR) { 169 field_row_major = true; 170 } else if (matrix_layout == GLSL_MATRIX_LAYOUT_COLUMN_MAJOR) { 171 field_row_major = false; 172 } 173 174 recursion(t->fields.structure[i].type, name, new_length, 175 field_row_major, 176 record_type, 177 packing, 178 (i + 1) == t->length, record_array_count, NULL); 179 180 /* Only the first leaf-field of the record gets called with the 181 * record type pointer. 182 */ 183 record_type = NULL; 184 } 185 186 if (t->is_record()) { 187 (*name)[name_length] = '\0'; 188 this->leave_record(t, *name, row_major, packing); 189 } 190 } else if (t->without_array()->is_record() || 191 t->without_array()->is_interface() || 192 (t->is_array() && t->fields.array->is_array())) { 193 if (record_type == NULL && t->fields.array->is_record()) 194 record_type = t->fields.array; 195 196 unsigned length = t->length; 197 198 /* Shader storage block unsized arrays: add subscript [0] to variable 199 * names. 200 */ 201 if (t->is_unsized_array()) 202 length = 1; 203 204 record_array_count *= length; 205 206 for (unsigned i = 0; i < length; i++) { 207 size_t new_length = name_length; 208 209 /* Append the subscript to the current variable name */ 210 ralloc_asprintf_rewrite_tail(name, &new_length, "[%u]", i); 211 212 recursion(t->fields.array, name, new_length, row_major, 213 record_type, 214 packing, 215 (i + 1) == t->length, record_array_count, 216 named_ifc_member); 217 218 /* Only the first leaf-field of the record gets called with the 219 * record type pointer. 220 */ 221 record_type = NULL; 222 } 223 } else { 224 this->set_record_array_count(record_array_count); 225 this->visit_field(t, *name, row_major, record_type, packing, last_field); 226 } 227 } 228 229 void 230 program_resource_visitor::visit_field(const glsl_struct_field *) 231 { 232 } 233 234 void 235 program_resource_visitor::enter_record(const glsl_type *, const char *, bool, 236 const enum glsl_interface_packing) 237 { 238 } 239 240 void 241 program_resource_visitor::leave_record(const glsl_type *, const char *, bool, 242 const enum glsl_interface_packing) 243 { 244 } 245 246 void 247 program_resource_visitor::set_buffer_offset(unsigned) 248 { 249 } 250 251 void 252 program_resource_visitor::set_record_array_count(unsigned) 253 { 254 } 255 256 namespace { 257 258 /** 259 * Class to help calculate the storage requirements for a set of uniforms 260 * 261 * As uniforms are added to the active set the number of active uniforms and 262 * the storage requirements for those uniforms are accumulated. The active 263 * uniforms are added to the hash table supplied to the constructor. 264 * 265 * If the same uniform is added multiple times (i.e., once for each shader 266 * target), it will only be accounted once. 267 */ 268 class count_uniform_size : public program_resource_visitor { 269 public: 270 count_uniform_size(struct string_to_uint_map *map, 271 struct string_to_uint_map *hidden_map) 272 : num_active_uniforms(0), num_hidden_uniforms(0), num_values(0), 273 num_shader_samplers(0), num_shader_images(0), 274 num_shader_uniform_components(0), num_shader_subroutines(0), 275 is_buffer_block(false), is_shader_storage(false), map(map), 276 hidden_map(hidden_map) 277 { 278 /* empty */ 279 } 280 281 void start_shader() 282 { 283 this->num_shader_samplers = 0; 284 this->num_shader_images = 0; 285 this->num_shader_uniform_components = 0; 286 this->num_shader_subroutines = 0; 287 } 288 289 void process(ir_variable *var) 290 { 291 this->current_var = var; 292 this->is_buffer_block = var->is_in_buffer_block(); 293 this->is_shader_storage = var->is_in_shader_storage_block(); 294 if (var->is_interface_instance()) 295 program_resource_visitor::process(var->get_interface_type(), 296 var->get_interface_type()->name); 297 else 298 program_resource_visitor::process(var); 299 } 300 301 /** 302 * Total number of active uniforms counted 303 */ 304 unsigned num_active_uniforms; 305 306 unsigned num_hidden_uniforms; 307 308 /** 309 * Number of data values required to back the storage for the active uniforms 310 */ 311 unsigned num_values; 312 313 /** 314 * Number of samplers used 315 */ 316 unsigned num_shader_samplers; 317 318 /** 319 * Number of images used 320 */ 321 unsigned num_shader_images; 322 323 /** 324 * Number of uniforms used in the current shader 325 */ 326 unsigned num_shader_uniform_components; 327 328 /** 329 * Number of subroutine uniforms used 330 */ 331 unsigned num_shader_subroutines; 332 333 bool is_buffer_block; 334 bool is_shader_storage; 335 336 struct string_to_uint_map *map; 337 338 private: 339 virtual void visit_field(const glsl_type *type, const char *name, 340 bool /* row_major */, 341 const glsl_type * /* record_type */, 342 const enum glsl_interface_packing, 343 bool /* last_field */) 344 { 345 assert(!type->without_array()->is_record()); 346 assert(!type->without_array()->is_interface()); 347 assert(!(type->is_array() && type->fields.array->is_array())); 348 349 /* Count the number of samplers regardless of whether the uniform is 350 * already in the hash table. The hash table prevents adding the same 351 * uniform for multiple shader targets, but in this case we want to 352 * count it for each shader target. 353 */ 354 const unsigned values = values_for_type(type); 355 if (type->contains_subroutine()) { 356 this->num_shader_subroutines += values; 357 } else if (type->contains_sampler()) { 358 this->num_shader_samplers += values; 359 } else if (type->contains_image()) { 360 this->num_shader_images += values; 361 362 /* As drivers are likely to represent image uniforms as 363 * scalar indices, count them against the limit of uniform 364 * components in the default block. The spec allows image 365 * uniforms to use up no more than one scalar slot. 366 */ 367 if (!is_shader_storage) 368 this->num_shader_uniform_components += values; 369 } else { 370 /* Accumulate the total number of uniform slots used by this shader. 371 * Note that samplers do not count against this limit because they 372 * don't use any storage on current hardware. 373 */ 374 if (!is_buffer_block) 375 this->num_shader_uniform_components += values; 376 } 377 378 /* If the uniform is already in the map, there's nothing more to do. 379 */ 380 unsigned id; 381 if (this->map->get(id, name)) 382 return; 383 384 if (this->current_var->data.how_declared == ir_var_hidden) { 385 this->hidden_map->put(this->num_hidden_uniforms, name); 386 this->num_hidden_uniforms++; 387 } else { 388 this->map->put(this->num_active_uniforms-this->num_hidden_uniforms, 389 name); 390 } 391 392 /* Each leaf uniform occupies one entry in the list of active 393 * uniforms. 394 */ 395 this->num_active_uniforms++; 396 397 if(!is_gl_identifier(name) && !is_shader_storage && !is_buffer_block) 398 this->num_values += values; 399 } 400 401 struct string_to_uint_map *hidden_map; 402 403 /** 404 * Current variable being processed. 405 */ 406 ir_variable *current_var; 407 }; 408 409 } /* anonymous namespace */ 410 411 /** 412 * Class to help parcel out pieces of backing storage to uniforms 413 * 414 * Each uniform processed has some range of the \c gl_constant_value 415 * structures associated with it. The association is done by finding 416 * the uniform in the \c string_to_uint_map and using the value from 417 * the map to connect that slot in the \c gl_uniform_storage table 418 * with the next available slot in the \c gl_constant_value array. 419 * 420 * \warning 421 * This class assumes that every uniform that will be processed is 422 * already in the \c string_to_uint_map. In addition, it assumes that 423 * the \c gl_uniform_storage and \c gl_constant_value arrays are "big 424 * enough." 425 */ 426 class parcel_out_uniform_storage : public program_resource_visitor { 427 public: 428 parcel_out_uniform_storage(struct gl_shader_program *prog, 429 struct string_to_uint_map *map, 430 struct gl_uniform_storage *uniforms, 431 union gl_constant_value *values) 432 : prog(prog), map(map), uniforms(uniforms), values(values) 433 { 434 } 435 436 void start_shader(gl_shader_stage shader_type) 437 { 438 assert(shader_type < MESA_SHADER_STAGES); 439 this->shader_type = shader_type; 440 441 this->shader_samplers_used = 0; 442 this->shader_shadow_samplers = 0; 443 this->next_sampler = 0; 444 this->next_image = 0; 445 this->next_subroutine = 0; 446 this->record_array_count = 1; 447 memset(this->targets, 0, sizeof(this->targets)); 448 } 449 450 void set_and_process(ir_variable *var) 451 { 452 current_var = var; 453 field_counter = 0; 454 this->record_next_sampler = new string_to_uint_map; 455 456 buffer_block_index = -1; 457 if (var->is_in_buffer_block()) { 458 struct gl_uniform_block *blks = var->is_in_shader_storage_block() ? 459 prog->data->ShaderStorageBlocks : prog->data->UniformBlocks; 460 unsigned num_blks = var->is_in_shader_storage_block() ? 461 prog->data->NumShaderStorageBlocks : prog->data->NumUniformBlocks; 462 463 if (var->is_interface_instance() && var->type->is_array()) { 464 unsigned l = strlen(var->get_interface_type()->name); 465 466 for (unsigned i = 0; i < num_blks; i++) { 467 if (strncmp(var->get_interface_type()->name, blks[i].Name, l) 468 == 0 && blks[i].Name[l] == '[') { 469 buffer_block_index = i; 470 break; 471 } 472 } 473 } else { 474 for (unsigned i = 0; i < num_blks; i++) { 475 if (strcmp(var->get_interface_type()->name, blks[i].Name) == 0) { 476 buffer_block_index = i; 477 break; 478 } 479 } 480 } 481 assert(buffer_block_index != -1); 482 483 /* Uniform blocks that were specified with an instance name must be 484 * handled a little bit differently. The name of the variable is the 485 * name used to reference the uniform block instead of being the name 486 * of a variable within the block. Therefore, searching for the name 487 * within the block will fail. 488 */ 489 if (var->is_interface_instance()) { 490 ubo_byte_offset = 0; 491 process(var->get_interface_type(), 492 var->get_interface_type()->name); 493 } else { 494 const struct gl_uniform_block *const block = 495 &blks[buffer_block_index]; 496 497 assert(var->data.location != -1); 498 499 const struct gl_uniform_buffer_variable *const ubo_var = 500 &block->Uniforms[var->data.location]; 501 502 ubo_byte_offset = ubo_var->Offset; 503 process(var); 504 } 505 } else { 506 /* Store any explicit location and reset data location so we can 507 * reuse this variable for storing the uniform slot number. 508 */ 509 this->explicit_location = current_var->data.location; 510 current_var->data.location = -1; 511 512 process(var); 513 } 514 delete this->record_next_sampler; 515 } 516 517 int buffer_block_index; 518 int ubo_byte_offset; 519 gl_shader_stage shader_type; 520 521 private: 522 void handle_samplers(const glsl_type *base_type, 523 struct gl_uniform_storage *uniform, const char *name) 524 { 525 if (base_type->is_sampler()) { 526 uniform->opaque[shader_type].active = true; 527 528 /* Handle multiple samplers inside struct arrays */ 529 if (this->record_array_count > 1) { 530 unsigned inner_array_size = MAX2(1, uniform->array_elements); 531 char *name_copy = ralloc_strdup(NULL, name); 532 533 /* Remove all array subscripts from the sampler name */ 534 char *str_start; 535 const char *str_end; 536 while((str_start = strchr(name_copy, '[')) && 537 (str_end = strchr(name_copy, ']'))) { 538 memmove(str_start, str_end + 1, 1 + strlen(str_end + 1)); 539 } 540 541 unsigned index = 0; 542 if (this->record_next_sampler->get(index, name_copy)) { 543 /* In this case, we've already seen this uniform so we just use 544 * the next sampler index recorded the last time we visited. 545 */ 546 uniform->opaque[shader_type].index = index; 547 index = inner_array_size + uniform->opaque[shader_type].index; 548 this->record_next_sampler->put(index, name_copy); 549 550 ralloc_free(name_copy); 551 /* Return as everything else has already been initialised in a 552 * previous pass. 553 */ 554 return; 555 } else { 556 /* We've never seen this uniform before so we need to allocate 557 * enough indices to store it. 558 * 559 * Nested struct arrays behave like arrays of arrays so we need 560 * to increase the index by the total number of elements of the 561 * sampler in case there is more than one sampler inside the 562 * structs. This allows the offset to be easily calculated for 563 * indirect indexing. 564 */ 565 uniform->opaque[shader_type].index = this->next_sampler; 566 this->next_sampler += 567 inner_array_size * this->record_array_count; 568 569 /* Store the next index for future passes over the struct array 570 */ 571 index = uniform->opaque[shader_type].index + inner_array_size; 572 this->record_next_sampler->put(index, name_copy); 573 ralloc_free(name_copy); 574 } 575 } else { 576 /* Increment the sampler by 1 for non-arrays and by the number of 577 * array elements for arrays. 578 */ 579 uniform->opaque[shader_type].index = this->next_sampler; 580 this->next_sampler += MAX2(1, uniform->array_elements); 581 } 582 583 const gl_texture_index target = base_type->sampler_index(); 584 const unsigned shadow = base_type->sampler_shadow; 585 for (unsigned i = uniform->opaque[shader_type].index; 586 i < MIN2(this->next_sampler, MAX_SAMPLERS); 587 i++) { 588 this->targets[i] = target; 589 this->shader_samplers_used |= 1U << i; 590 this->shader_shadow_samplers |= shadow << i; 591 } 592 } 593 } 594 595 void handle_images(const glsl_type *base_type, 596 struct gl_uniform_storage *uniform) 597 { 598 if (base_type->is_image()) { 599 uniform->opaque[shader_type].index = this->next_image; 600 uniform->opaque[shader_type].active = true; 601 602 /* Set image access qualifiers */ 603 const GLenum access = 604 (current_var->data.image_read_only ? GL_READ_ONLY : 605 current_var->data.image_write_only ? GL_WRITE_ONLY : 606 GL_READ_WRITE); 607 608 const unsigned first = this->next_image; 609 610 /* Increment the image index by 1 for non-arrays and by the 611 * number of array elements for arrays. 612 */ 613 this->next_image += MAX2(1, uniform->array_elements); 614 615 for (unsigned i = first; i < MIN2(next_image, MAX_IMAGE_UNIFORMS); i++) 616 prog->_LinkedShaders[shader_type]->Program->sh.ImageAccess[i] = access; 617 } 618 } 619 620 void handle_subroutines(const glsl_type *base_type, 621 struct gl_uniform_storage *uniform) 622 { 623 if (base_type->is_subroutine()) { 624 uniform->opaque[shader_type].index = this->next_subroutine; 625 uniform->opaque[shader_type].active = true; 626 627 prog->_LinkedShaders[shader_type]->Program->sh.NumSubroutineUniforms++; 628 629 /* Increment the subroutine index by 1 for non-arrays and by the 630 * number of array elements for arrays. 631 */ 632 this->next_subroutine += MAX2(1, uniform->array_elements); 633 634 } 635 } 636 637 virtual void set_buffer_offset(unsigned offset) 638 { 639 this->ubo_byte_offset = offset; 640 } 641 642 virtual void set_record_array_count(unsigned record_array_count) 643 { 644 this->record_array_count = record_array_count; 645 } 646 647 virtual void enter_record(const glsl_type *type, const char *, 648 bool row_major, 649 const enum glsl_interface_packing packing) 650 { 651 assert(type->is_record()); 652 if (this->buffer_block_index == -1) 653 return; 654 if (packing == GLSL_INTERFACE_PACKING_STD430) 655 this->ubo_byte_offset = glsl_align( 656 this->ubo_byte_offset, type->std430_base_alignment(row_major)); 657 else 658 this->ubo_byte_offset = glsl_align( 659 this->ubo_byte_offset, type->std140_base_alignment(row_major)); 660 } 661 662 virtual void leave_record(const glsl_type *type, const char *, 663 bool row_major, 664 const enum glsl_interface_packing packing) 665 { 666 assert(type->is_record()); 667 if (this->buffer_block_index == -1) 668 return; 669 if (packing == GLSL_INTERFACE_PACKING_STD430) 670 this->ubo_byte_offset = glsl_align( 671 this->ubo_byte_offset, type->std430_base_alignment(row_major)); 672 else 673 this->ubo_byte_offset = glsl_align( 674 this->ubo_byte_offset, type->std140_base_alignment(row_major)); 675 } 676 677 virtual void visit_field(const glsl_type *type, const char *name, 678 bool row_major, const glsl_type * /* record_type */, 679 const enum glsl_interface_packing packing, 680 bool /* last_field */) 681 { 682 assert(!type->without_array()->is_record()); 683 assert(!type->without_array()->is_interface()); 684 assert(!(type->is_array() && type->fields.array->is_array())); 685 686 unsigned id; 687 bool found = this->map->get(id, name); 688 assert(found); 689 690 if (!found) 691 return; 692 693 const glsl_type *base_type; 694 if (type->is_array()) { 695 this->uniforms[id].array_elements = type->length; 696 base_type = type->fields.array; 697 } else { 698 this->uniforms[id].array_elements = 0; 699 base_type = type; 700 } 701 702 /* Initialise opaque data */ 703 this->uniforms[id].opaque[shader_type].index = ~0; 704 this->uniforms[id].opaque[shader_type].active = false; 705 706 /* This assigns uniform indices to sampler and image uniforms. */ 707 handle_samplers(base_type, &this->uniforms[id], name); 708 handle_images(base_type, &this->uniforms[id]); 709 handle_subroutines(base_type, &this->uniforms[id]); 710 711 /* For array of arrays or struct arrays the base location may have 712 * already been set so don't set it again. 713 */ 714 if (buffer_block_index == -1 && current_var->data.location == -1) { 715 current_var->data.location = id; 716 } 717 718 /* If there is already storage associated with this uniform or if the 719 * uniform is set as builtin, it means that it was set while processing 720 * an earlier shader stage. For example, we may be processing the 721 * uniform in the fragment shader, but the uniform was already processed 722 * in the vertex shader. 723 */ 724 if (this->uniforms[id].storage != NULL || this->uniforms[id].builtin) { 725 return; 726 } 727 728 /* Assign explicit locations. */ 729 if (current_var->data.explicit_location) { 730 /* Set sequential locations for struct fields. */ 731 if (current_var->type->without_array()->is_record() || 732 current_var->type->is_array_of_arrays()) { 733 const unsigned entries = MAX2(1, this->uniforms[id].array_elements); 734 this->uniforms[id].remap_location = 735 this->explicit_location + field_counter; 736 field_counter += entries; 737 } else { 738 this->uniforms[id].remap_location = this->explicit_location; 739 } 740 } else { 741 /* Initialize to to indicate that no location is set */ 742 this->uniforms[id].remap_location = UNMAPPED_UNIFORM_LOC; 743 } 744 745 this->uniforms[id].name = ralloc_strdup(this->uniforms, name); 746 this->uniforms[id].type = base_type; 747 this->uniforms[id].num_driver_storage = 0; 748 this->uniforms[id].driver_storage = NULL; 749 this->uniforms[id].atomic_buffer_index = -1; 750 this->uniforms[id].hidden = 751 current_var->data.how_declared == ir_var_hidden; 752 this->uniforms[id].builtin = is_gl_identifier(name); 753 754 this->uniforms[id].is_shader_storage = 755 current_var->is_in_shader_storage_block(); 756 757 /* Do not assign storage if the uniform is a builtin or buffer object */ 758 if (!this->uniforms[id].builtin && 759 !this->uniforms[id].is_shader_storage && 760 this->buffer_block_index == -1) 761 this->uniforms[id].storage = this->values; 762 763 if (this->buffer_block_index != -1) { 764 this->uniforms[id].block_index = this->buffer_block_index; 765 766 unsigned alignment = type->std140_base_alignment(row_major); 767 if (packing == GLSL_INTERFACE_PACKING_STD430) 768 alignment = type->std430_base_alignment(row_major); 769 this->ubo_byte_offset = glsl_align(this->ubo_byte_offset, alignment); 770 this->uniforms[id].offset = this->ubo_byte_offset; 771 if (packing == GLSL_INTERFACE_PACKING_STD430) 772 this->ubo_byte_offset += type->std430_size(row_major); 773 else 774 this->ubo_byte_offset += type->std140_size(row_major); 775 776 if (type->is_array()) { 777 if (packing == GLSL_INTERFACE_PACKING_STD430) 778 this->uniforms[id].array_stride = 779 type->without_array()->std430_array_stride(row_major); 780 else 781 this->uniforms[id].array_stride = 782 glsl_align(type->without_array()->std140_size(row_major), 783 16); 784 } else { 785 this->uniforms[id].array_stride = 0; 786 } 787 788 if (type->without_array()->is_matrix()) { 789 const glsl_type *matrix = type->without_array(); 790 const unsigned N = matrix->base_type == GLSL_TYPE_DOUBLE ? 8 : 4; 791 const unsigned items = 792 row_major ? matrix->matrix_columns : matrix->vector_elements; 793 794 assert(items <= 4); 795 if (packing == GLSL_INTERFACE_PACKING_STD430) 796 this->uniforms[id].matrix_stride = items < 3 ? items * N : 797 glsl_align(items * N, 16); 798 else 799 this->uniforms[id].matrix_stride = glsl_align(items * N, 16); 800 this->uniforms[id].row_major = row_major; 801 } else { 802 this->uniforms[id].matrix_stride = 0; 803 this->uniforms[id].row_major = false; 804 } 805 } else { 806 this->uniforms[id].block_index = -1; 807 this->uniforms[id].offset = -1; 808 this->uniforms[id].array_stride = -1; 809 this->uniforms[id].matrix_stride = -1; 810 this->uniforms[id].row_major = false; 811 } 812 813 if (!this->uniforms[id].builtin && 814 !this->uniforms[id].is_shader_storage && 815 this->buffer_block_index == -1) 816 this->values += values_for_type(type); 817 } 818 819 /** 820 * Current program being processed. 821 */ 822 struct gl_shader_program *prog; 823 824 struct string_to_uint_map *map; 825 826 struct gl_uniform_storage *uniforms; 827 unsigned next_sampler; 828 unsigned next_image; 829 unsigned next_subroutine; 830 831 /** 832 * Field counter is used to take care that uniform structures 833 * with explicit locations get sequential locations. 834 */ 835 unsigned field_counter; 836 837 /** 838 * Current variable being processed. 839 */ 840 ir_variable *current_var; 841 842 /* Used to store the explicit location from current_var so that we can 843 * reuse the location field for storing the uniform slot id. 844 */ 845 int explicit_location; 846 847 /* Stores total struct array elements including nested structs */ 848 unsigned record_array_count; 849 850 /* Map for temporarily storing next sampler index when handling samplers in 851 * struct arrays. 852 */ 853 struct string_to_uint_map *record_next_sampler; 854 855 public: 856 union gl_constant_value *values; 857 858 gl_texture_index targets[MAX_SAMPLERS]; 859 860 /** 861 * Mask of samplers used by the current shader stage. 862 */ 863 unsigned shader_samplers_used; 864 865 /** 866 * Mask of samplers used by the current shader stage for shadows. 867 */ 868 unsigned shader_shadow_samplers; 869 }; 870 871 static bool 872 variable_is_referenced(ir_array_refcount_visitor &v, ir_variable *var) 873 { 874 ir_array_refcount_entry *const entry = v.get_variable_entry(var); 875 876 return entry->is_referenced; 877 878 } 879 880 /** 881 * Walks the IR and update the references to uniform blocks in the 882 * ir_variables to point at linked shader's list (previously, they 883 * would point at the uniform block list in one of the pre-linked 884 * shaders). 885 */ 886 static void 887 link_update_uniform_buffer_variables(struct gl_linked_shader *shader, 888 unsigned stage) 889 { 890 ir_array_refcount_visitor v; 891 892 v.run(shader->ir); 893 894 foreach_in_list(ir_instruction, node, shader->ir) { 895 ir_variable *const var = node->as_variable(); 896 897 if (var == NULL || !var->is_in_buffer_block()) 898 continue; 899 900 assert(var->data.mode == ir_var_uniform || 901 var->data.mode == ir_var_shader_storage); 902 903 unsigned num_blocks = var->data.mode == ir_var_uniform ? 904 shader->Program->info.num_ubos : shader->Program->info.num_ssbos; 905 struct gl_uniform_block **blks = var->data.mode == ir_var_uniform ? 906 shader->Program->sh.UniformBlocks : 907 shader->Program->sh.ShaderStorageBlocks; 908 909 if (var->is_interface_instance()) { 910 const ir_array_refcount_entry *const entry = v.get_variable_entry(var); 911 912 if (entry->is_referenced) { 913 /* Since this is an interface instance, the instance type will be 914 * same as the array-stripped variable type. If the variable type 915 * is an array, then the block names will be suffixed with [0] 916 * through [n-1]. Unlike for non-interface instances, there will 917 * not be structure types here, so the only name sentinel that we 918 * have to worry about is [. 919 */ 920 assert(var->type->without_array() == var->get_interface_type()); 921 const char sentinel = var->type->is_array() ? '[' : '\0'; 922 923 const ptrdiff_t len = strlen(var->get_interface_type()->name); 924 for (unsigned i = 0; i < num_blocks; i++) { 925 const char *const begin = blks[i]->Name; 926 const char *const end = strchr(begin, sentinel); 927 928 if (end == NULL) 929 continue; 930 931 if (len != (end - begin)) 932 continue; 933 934 /* Even when a match is found, do not "break" here. This could 935 * be an array of instances, and all elements of the array need 936 * to be marked as referenced. 937 */ 938 if (strncmp(begin, var->get_interface_type()->name, len) == 0 && 939 (!var->type->is_array() || 940 entry->is_linearized_index_referenced(blks[i]->linearized_array_index))) { 941 blks[i]->stageref |= 1U << stage; 942 } 943 } 944 } 945 946 var->data.location = 0; 947 continue; 948 } 949 950 bool found = false; 951 char sentinel = '\0'; 952 953 if (var->type->is_record()) { 954 sentinel = '.'; 955 } else if (var->type->is_array() && (var->type->fields.array->is_array() 956 || var->type->without_array()->is_record())) { 957 sentinel = '['; 958 } 959 960 const unsigned l = strlen(var->name); 961 for (unsigned i = 0; i < num_blocks; i++) { 962 for (unsigned j = 0; j < blks[i]->NumUniforms; j++) { 963 if (sentinel) { 964 const char *begin = blks[i]->Uniforms[j].Name; 965 const char *end = strchr(begin, sentinel); 966 967 if (end == NULL) 968 continue; 969 970 if ((ptrdiff_t) l != (end - begin)) 971 continue; 972 973 found = strncmp(var->name, begin, l) == 0; 974 } else { 975 found = strcmp(var->name, blks[i]->Uniforms[j].Name) == 0; 976 } 977 978 if (found) { 979 var->data.location = j; 980 981 if (variable_is_referenced(v, var)) 982 blks[i]->stageref |= 1U << stage; 983 984 break; 985 } 986 } 987 988 if (found) 989 break; 990 } 991 assert(found); 992 } 993 } 994 995 /** 996 * Combine the hidden uniform hash map with the uniform hash map so that the 997 * hidden uniforms will be given indicies at the end of the uniform storage 998 * array. 999 */ 1000 static void 1001 assign_hidden_uniform_slot_id(const char *name, unsigned hidden_id, 1002 void *closure) 1003 { 1004 count_uniform_size *uniform_size = (count_uniform_size *) closure; 1005 unsigned hidden_uniform_start = uniform_size->num_active_uniforms - 1006 uniform_size->num_hidden_uniforms; 1007 1008 uniform_size->map->put(hidden_uniform_start + hidden_id, name); 1009 } 1010 1011 /** 1012 * Search through the list of empty blocks to find one that fits the current 1013 * uniform. 1014 */ 1015 static int 1016 find_empty_block(struct gl_shader_program *prog, 1017 struct gl_uniform_storage *uniform) 1018 { 1019 const unsigned entries = MAX2(1, uniform->array_elements); 1020 1021 foreach_list_typed(struct empty_uniform_block, block, link, 1022 &prog->EmptyUniformLocations) { 1023 /* Found a block with enough slots to fit the uniform */ 1024 if (block->slots == entries) { 1025 unsigned start = block->start; 1026 exec_node_remove(&block->link); 1027 ralloc_free(block); 1028 1029 return start; 1030 /* Found a block with more slots than needed. It can still be used. */ 1031 } else if (block->slots > entries) { 1032 unsigned start = block->start; 1033 block->start += entries; 1034 block->slots -= entries; 1035 1036 return start; 1037 } 1038 } 1039 1040 return -1; 1041 } 1042 1043 static void 1044 link_setup_uniform_remap_tables(struct gl_context *ctx, 1045 struct gl_shader_program *prog, 1046 unsigned num_explicit_uniform_locs) 1047 { 1048 unsigned total_entries = num_explicit_uniform_locs; 1049 unsigned empty_locs = 1050 prog->NumUniformRemapTable - num_explicit_uniform_locs; 1051 1052 /* Reserve all the explicit locations of the active uniforms. */ 1053 for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) { 1054 if (prog->data->UniformStorage[i].type->is_subroutine() || 1055 prog->data->UniformStorage[i].is_shader_storage) 1056 continue; 1057 1058 if (prog->data->UniformStorage[i].remap_location != 1059 UNMAPPED_UNIFORM_LOC) { 1060 /* How many new entries for this uniform? */ 1061 const unsigned entries = 1062 MAX2(1, prog->data->UniformStorage[i].array_elements); 1063 1064 /* Set remap table entries point to correct gl_uniform_storage. */ 1065 for (unsigned j = 0; j < entries; j++) { 1066 unsigned element_loc = 1067 prog->data->UniformStorage[i].remap_location + j; 1068 assert(prog->UniformRemapTable[element_loc] == 1069 INACTIVE_UNIFORM_EXPLICIT_LOCATION); 1070 prog->UniformRemapTable[element_loc] = 1071 &prog->data->UniformStorage[i]; 1072 } 1073 } 1074 } 1075 1076 /* Reserve locations for rest of the uniforms. */ 1077 for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) { 1078 1079 if (prog->data->UniformStorage[i].type->is_subroutine() || 1080 prog->data->UniformStorage[i].is_shader_storage) 1081 continue; 1082 1083 /* Built-in uniforms should not get any location. */ 1084 if (prog->data->UniformStorage[i].builtin) 1085 continue; 1086 1087 /* Explicit ones have been set already. */ 1088 if (prog->data->UniformStorage[i].remap_location != UNMAPPED_UNIFORM_LOC) 1089 continue; 1090 1091 /* how many new entries for this uniform? */ 1092 const unsigned entries = 1093 MAX2(1, prog->data->UniformStorage[i].array_elements); 1094 1095 /* Find UniformRemapTable for empty blocks where we can fit this uniform. */ 1096 int chosen_location = -1; 1097 1098 if (empty_locs) 1099 chosen_location = find_empty_block(prog, &prog->data->UniformStorage[i]); 1100 1101 /* Add new entries to the total amount of entries. */ 1102 total_entries += entries; 1103 1104 if (chosen_location != -1) { 1105 empty_locs -= entries; 1106 } else { 1107 chosen_location = prog->NumUniformRemapTable; 1108 1109 /* resize remap table to fit new entries */ 1110 prog->UniformRemapTable = 1111 reralloc(prog, 1112 prog->UniformRemapTable, 1113 gl_uniform_storage *, 1114 prog->NumUniformRemapTable + entries); 1115 prog->NumUniformRemapTable += entries; 1116 } 1117 1118 /* set pointers for this uniform */ 1119 for (unsigned j = 0; j < entries; j++) 1120 prog->UniformRemapTable[chosen_location + j] = 1121 &prog->data->UniformStorage[i]; 1122 1123 /* set the base location in remap table for the uniform */ 1124 prog->data->UniformStorage[i].remap_location = chosen_location; 1125 } 1126 1127 /* Verify that total amount of entries for explicit and implicit locations 1128 * is less than MAX_UNIFORM_LOCATIONS. 1129 */ 1130 1131 if (total_entries > ctx->Const.MaxUserAssignableUniformLocations) { 1132 linker_error(prog, "count of uniform locations > MAX_UNIFORM_LOCATIONS" 1133 "(%u > %u)", total_entries, 1134 ctx->Const.MaxUserAssignableUniformLocations); 1135 } 1136 1137 /* Reserve all the explicit locations of the active subroutine uniforms. */ 1138 for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) { 1139 if (!prog->data->UniformStorage[i].type->is_subroutine()) 1140 continue; 1141 1142 if (prog->data->UniformStorage[i].remap_location == UNMAPPED_UNIFORM_LOC) 1143 continue; 1144 1145 /* How many new entries for this uniform? */ 1146 const unsigned entries = 1147 MAX2(1, prog->data->UniformStorage[i].array_elements); 1148 1149 unsigned mask = prog->data->linked_stages; 1150 while (mask) { 1151 const int j = u_bit_scan(&mask); 1152 struct gl_program *p = prog->_LinkedShaders[j]->Program; 1153 1154 if (!prog->data->UniformStorage[i].opaque[j].active) 1155 continue; 1156 1157 /* Set remap table entries point to correct gl_uniform_storage. */ 1158 for (unsigned k = 0; k < entries; k++) { 1159 unsigned element_loc = 1160 prog->data->UniformStorage[i].remap_location + k; 1161 assert(p->sh.SubroutineUniformRemapTable[element_loc] == 1162 INACTIVE_UNIFORM_EXPLICIT_LOCATION); 1163 p->sh.SubroutineUniformRemapTable[element_loc] = 1164 &prog->data->UniformStorage[i]; 1165 } 1166 } 1167 } 1168 1169 /* reserve subroutine locations */ 1170 for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) { 1171 if (!prog->data->UniformStorage[i].type->is_subroutine()) 1172 continue; 1173 1174 if (prog->data->UniformStorage[i].remap_location != 1175 UNMAPPED_UNIFORM_LOC) 1176 continue; 1177 1178 const unsigned entries = 1179 MAX2(1, prog->data->UniformStorage[i].array_elements); 1180 1181 unsigned mask = prog->data->linked_stages; 1182 while (mask) { 1183 const int j = u_bit_scan(&mask); 1184 struct gl_program *p = prog->_LinkedShaders[j]->Program; 1185 1186 if (!prog->data->UniformStorage[i].opaque[j].active) 1187 continue; 1188 1189 p->sh.SubroutineUniformRemapTable = 1190 reralloc(p, 1191 p->sh.SubroutineUniformRemapTable, 1192 gl_uniform_storage *, 1193 p->sh.NumSubroutineUniformRemapTable + entries); 1194 1195 for (unsigned k = 0; k < entries; k++) { 1196 p->sh.SubroutineUniformRemapTable[p->sh.NumSubroutineUniformRemapTable + k] = 1197 &prog->data->UniformStorage[i]; 1198 } 1199 prog->data->UniformStorage[i].remap_location = 1200 p->sh.NumSubroutineUniformRemapTable; 1201 p->sh.NumSubroutineUniformRemapTable += entries; 1202 } 1203 } 1204 } 1205 1206 static void 1207 link_assign_uniform_storage(struct gl_context *ctx, 1208 struct gl_shader_program *prog, 1209 const unsigned num_data_slots, 1210 unsigned num_explicit_uniform_locs) 1211 { 1212 /* On the outside chance that there were no uniforms, bail out. 1213 */ 1214 if (prog->data->NumUniformStorage == 0) 1215 return; 1216 1217 unsigned int boolean_true = ctx->Const.UniformBooleanTrue; 1218 1219 prog->data->UniformStorage = rzalloc_array(prog, struct gl_uniform_storage, 1220 prog->data->NumUniformStorage); 1221 union gl_constant_value *data = rzalloc_array(prog->data->UniformStorage, 1222 union gl_constant_value, 1223 num_data_slots); 1224 #ifndef NDEBUG 1225 union gl_constant_value *data_end = &data[num_data_slots]; 1226 #endif 1227 1228 parcel_out_uniform_storage parcel(prog, prog->UniformHash, 1229 prog->data->UniformStorage, data); 1230 1231 for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { 1232 if (prog->_LinkedShaders[i] == NULL) 1233 continue; 1234 1235 parcel.start_shader((gl_shader_stage)i); 1236 1237 foreach_in_list(ir_instruction, node, prog->_LinkedShaders[i]->ir) { 1238 ir_variable *const var = node->as_variable(); 1239 1240 if ((var == NULL) || (var->data.mode != ir_var_uniform && 1241 var->data.mode != ir_var_shader_storage)) 1242 continue; 1243 1244 parcel.set_and_process(var); 1245 } 1246 1247 prog->_LinkedShaders[i]->Program->SamplersUsed = 1248 parcel.shader_samplers_used; 1249 prog->_LinkedShaders[i]->shadow_samplers = parcel.shader_shadow_samplers; 1250 1251 STATIC_ASSERT(sizeof(prog->_LinkedShaders[i]->Program->sh.SamplerTargets) == 1252 sizeof(parcel.targets)); 1253 memcpy(prog->_LinkedShaders[i]->Program->sh.SamplerTargets, 1254 parcel.targets, 1255 sizeof(prog->_LinkedShaders[i]->Program->sh.SamplerTargets)); 1256 } 1257 1258 #ifndef NDEBUG 1259 for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) { 1260 assert(prog->data->UniformStorage[i].storage != NULL || 1261 prog->data->UniformStorage[i].builtin || 1262 prog->data->UniformStorage[i].is_shader_storage || 1263 prog->data->UniformStorage[i].block_index != -1); 1264 } 1265 1266 assert(parcel.values == data_end); 1267 #endif 1268 1269 link_setup_uniform_remap_tables(ctx, prog, num_explicit_uniform_locs); 1270 1271 link_set_uniform_initializers(prog, boolean_true); 1272 } 1273 1274 void 1275 link_assign_uniform_locations(struct gl_shader_program *prog, 1276 struct gl_context *ctx, 1277 unsigned int num_explicit_uniform_locs) 1278 { 1279 ralloc_free(prog->data->UniformStorage); 1280 prog->data->UniformStorage = NULL; 1281 prog->data->NumUniformStorage = 0; 1282 1283 if (prog->UniformHash != NULL) { 1284 prog->UniformHash->clear(); 1285 } else { 1286 prog->UniformHash = new string_to_uint_map; 1287 } 1288 1289 /* First pass: Count the uniform resources used by the user-defined 1290 * uniforms. While this happens, each active uniform will have an index 1291 * assigned to it. 1292 * 1293 * Note: this is *NOT* the index that is returned to the application by 1294 * glGetUniformLocation. 1295 */ 1296 struct string_to_uint_map *hiddenUniforms = new string_to_uint_map; 1297 count_uniform_size uniform_size(prog->UniformHash, hiddenUniforms); 1298 for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { 1299 struct gl_linked_shader *sh = prog->_LinkedShaders[i]; 1300 1301 if (sh == NULL) 1302 continue; 1303 1304 link_update_uniform_buffer_variables(sh, i); 1305 1306 /* Reset various per-shader target counts. 1307 */ 1308 uniform_size.start_shader(); 1309 1310 foreach_in_list(ir_instruction, node, sh->ir) { 1311 ir_variable *const var = node->as_variable(); 1312 1313 if ((var == NULL) || (var->data.mode != ir_var_uniform && 1314 var->data.mode != ir_var_shader_storage)) 1315 continue; 1316 1317 uniform_size.process(var); 1318 } 1319 1320 sh->Program->info.num_textures = uniform_size.num_shader_samplers; 1321 sh->Program->info.num_images = uniform_size.num_shader_images; 1322 sh->num_uniform_components = uniform_size.num_shader_uniform_components; 1323 sh->num_combined_uniform_components = sh->num_uniform_components; 1324 1325 for (unsigned i = 0; i < sh->Program->info.num_ubos; i++) { 1326 sh->num_combined_uniform_components += 1327 sh->Program->sh.UniformBlocks[i]->UniformBufferSize / 4; 1328 } 1329 } 1330 1331 prog->data->NumUniformStorage = uniform_size.num_active_uniforms; 1332 prog->data->NumHiddenUniforms = uniform_size.num_hidden_uniforms; 1333 1334 /* assign hidden uniforms a slot id */ 1335 hiddenUniforms->iterate(assign_hidden_uniform_slot_id, &uniform_size); 1336 delete hiddenUniforms; 1337 1338 link_assign_uniform_storage(ctx, prog, uniform_size.num_values, 1339 num_explicit_uniform_locs); 1340 } 1341