1/* 2 * Copyright © 2018 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 DEALINGS 21 * IN THE SOFTWARE. 22 */ 23 24#include "nir.h" 25#include "gl_nir.h" 26#include "gl_nir_linker.h" 27#include "linker_util.h" 28#include "main/mtypes.h" 29#include "main/shaderobj.h" 30#include "ir_uniform.h" /* for gl_uniform_storage */ 31 32/** 33 * This file included general link methods, using NIR, instead of IR as 34 * the counter-part glsl/linker.cpp 35 */ 36 37static bool 38can_remove_uniform(nir_variable *var, UNUSED void *data) 39{ 40 /* Section 2.11.6 (Uniform Variables) of the OpenGL ES 3.0.3 spec 41 * says: 42 * 43 * "All members of a named uniform block declared with a shared or 44 * std140 layout qualifier are considered active, even if they are not 45 * referenced in any shader in the program. The uniform block itself is 46 * also considered active, even if no member of the block is 47 * referenced." 48 * 49 * Although the spec doesn't state it std430 layouts are expect to behave 50 * the same way. If the variable is in a uniform block with one of those 51 * layouts, do not eliminate it. 52 */ 53 if (nir_variable_is_in_block(var) && 54 (glsl_get_ifc_packing(var->interface_type) != 55 GLSL_INTERFACE_PACKING_PACKED)) 56 return false; 57 58 if (glsl_get_base_type(glsl_without_array(var->type)) == 59 GLSL_TYPE_SUBROUTINE) 60 return false; 61 62 /* Uniform initializers could get used by another stage */ 63 if (var->constant_initializer) 64 return false; 65 66 return true; 67} 68 69/** 70 * Built-in / reserved GL variables names start with "gl_" 71 */ 72static inline bool 73is_gl_identifier(const char *s) 74{ 75 return s && s[0] == 'g' && s[1] == 'l' && s[2] == '_'; 76} 77 78static bool 79inout_has_same_location(const nir_variable *var, unsigned stage) 80{ 81 if (!var->data.patch && 82 ((var->data.mode == nir_var_shader_out && 83 stage == MESA_SHADER_TESS_CTRL) || 84 (var->data.mode == nir_var_shader_in && 85 (stage == MESA_SHADER_TESS_CTRL || stage == MESA_SHADER_TESS_EVAL || 86 stage == MESA_SHADER_GEOMETRY)))) 87 return true; 88 else 89 return false; 90} 91 92/** 93 * Create gl_shader_variable from nir_variable. 94 */ 95static struct gl_shader_variable * 96create_shader_variable(struct gl_shader_program *shProg, 97 const nir_variable *in, 98 const char *name, const struct glsl_type *type, 99 const struct glsl_type *interface_type, 100 bool use_implicit_location, int location, 101 const struct glsl_type *outermost_struct_type) 102{ 103 /* Allocate zero-initialized memory to ensure that bitfield padding 104 * is zero. 105 */ 106 struct gl_shader_variable *out = rzalloc(shProg, 107 struct gl_shader_variable); 108 if (!out) 109 return NULL; 110 111 /* Since gl_VertexID may be lowered to gl_VertexIDMESA, but applications 112 * expect to see gl_VertexID in the program resource list. Pretend. 113 */ 114 if (in->data.mode == nir_var_system_value && 115 in->data.location == SYSTEM_VALUE_VERTEX_ID_ZERO_BASE) { 116 out->name = ralloc_strdup(shProg, "gl_VertexID"); 117 } else if ((in->data.mode == nir_var_shader_out && 118 in->data.location == VARYING_SLOT_TESS_LEVEL_OUTER) || 119 (in->data.mode == nir_var_system_value && 120 in->data.location == SYSTEM_VALUE_TESS_LEVEL_OUTER)) { 121 out->name = ralloc_strdup(shProg, "gl_TessLevelOuter"); 122 type = glsl_array_type(glsl_float_type(), 4, 0); 123 } else if ((in->data.mode == nir_var_shader_out && 124 in->data.location == VARYING_SLOT_TESS_LEVEL_INNER) || 125 (in->data.mode == nir_var_system_value && 126 in->data.location == SYSTEM_VALUE_TESS_LEVEL_INNER)) { 127 out->name = ralloc_strdup(shProg, "gl_TessLevelInner"); 128 type = glsl_array_type(glsl_float_type(), 2, 0); 129 } else { 130 out->name = ralloc_strdup(shProg, name); 131 } 132 133 if (!out->name) 134 return NULL; 135 136 /* The ARB_program_interface_query spec says: 137 * 138 * "Not all active variables are assigned valid locations; the 139 * following variables will have an effective location of -1: 140 * 141 * * uniforms declared as atomic counters; 142 * 143 * * members of a uniform block; 144 * 145 * * built-in inputs, outputs, and uniforms (starting with "gl_"); and 146 * 147 * * inputs or outputs not declared with a "location" layout 148 * qualifier, except for vertex shader inputs and fragment shader 149 * outputs." 150 */ 151 if (glsl_get_base_type(in->type) == GLSL_TYPE_ATOMIC_UINT || 152 is_gl_identifier(in->name) || 153 !(in->data.explicit_location || use_implicit_location)) { 154 out->location = -1; 155 } else { 156 out->location = location; 157 } 158 159 out->type = type; 160 out->outermost_struct_type = outermost_struct_type; 161 out->interface_type = interface_type; 162 out->component = in->data.location_frac; 163 out->index = in->data.index; 164 out->patch = in->data.patch; 165 out->mode = in->data.mode; 166 out->interpolation = in->data.interpolation; 167 out->precision = in->data.precision; 168 out->explicit_location = in->data.explicit_location; 169 170 return out; 171} 172 173static bool 174add_shader_variable(const struct gl_context *ctx, 175 struct gl_shader_program *shProg, 176 struct set *resource_set, 177 unsigned stage_mask, 178 GLenum programInterface, nir_variable *var, 179 const char *name, const struct glsl_type *type, 180 bool use_implicit_location, int location, 181 bool inouts_share_location, 182 const struct glsl_type *outermost_struct_type) 183{ 184 const struct glsl_type *interface_type = var->interface_type; 185 186 if (outermost_struct_type == NULL) { 187 if (var->data.from_named_ifc_block) { 188 const char *interface_name = glsl_get_type_name(interface_type); 189 190 if (glsl_type_is_array(interface_type)) { 191 /* Issue #16 of the ARB_program_interface_query spec says: 192 * 193 * "* If a variable is a member of an interface block without an 194 * instance name, it is enumerated using just the variable name. 195 * 196 * * If a variable is a member of an interface block with an 197 * instance name, it is enumerated as "BlockName.Member", where 198 * "BlockName" is the name of the interface block (not the 199 * instance name) and "Member" is the name of the variable." 200 * 201 * In particular, it indicates that it should be "BlockName", 202 * not "BlockName[array length]". The conformance suite and 203 * dEQP both require this behavior. 204 * 205 * Here, we unwrap the extra array level added by named interface 206 * block array lowering so we have the correct variable type. We 207 * also unwrap the interface type when constructing the name. 208 * 209 * We leave interface_type the same so that ES 3.x SSO pipeline 210 * validation can enforce the rules requiring array length to 211 * match on interface blocks. 212 */ 213 type = glsl_get_array_element(type); 214 215 interface_name = 216 glsl_get_type_name(glsl_get_array_element(interface_type)); 217 } 218 219 name = ralloc_asprintf(shProg, "%s.%s", interface_name, name); 220 } 221 } 222 223 switch (glsl_get_base_type(type)) { 224 case GLSL_TYPE_STRUCT: { 225 /* The ARB_program_interface_query spec says: 226 * 227 * "For an active variable declared as a structure, a separate entry 228 * will be generated for each active structure member. The name of 229 * each entry is formed by concatenating the name of the structure, 230 * the "." character, and the name of the structure member. If a 231 * structure member to enumerate is itself a structure or array, 232 * these enumeration rules are applied recursively." 233 */ 234 if (outermost_struct_type == NULL) 235 outermost_struct_type = type; 236 237 unsigned field_location = location; 238 for (unsigned i = 0; i < glsl_get_length(type); i++) { 239 const struct glsl_type *field_type = glsl_get_struct_field(type, i); 240 const struct glsl_struct_field *field = 241 glsl_get_struct_field_data(type, i); 242 243 char *field_name = ralloc_asprintf(shProg, "%s.%s", name, field->name); 244 if (!add_shader_variable(ctx, shProg, resource_set, 245 stage_mask, programInterface, 246 var, field_name, field_type, 247 use_implicit_location, field_location, 248 false, outermost_struct_type)) 249 return false; 250 251 field_location += glsl_count_attribute_slots(field_type, false); 252 } 253 return true; 254 } 255 256 case GLSL_TYPE_ARRAY: { 257 /* The ARB_program_interface_query spec says: 258 * 259 * "For an active variable declared as an array of basic types, a 260 * single entry will be generated, with its name string formed by 261 * concatenating the name of the array and the string "[0]"." 262 * 263 * "For an active variable declared as an array of an aggregate data 264 * type (structures or arrays), a separate entry will be generated 265 * for each active array element, unless noted immediately below. 266 * The name of each entry is formed by concatenating the name of 267 * the array, the "[" character, an integer identifying the element 268 * number, and the "]" character. These enumeration rules are 269 * applied recursively, treating each enumerated array element as a 270 * separate active variable." 271 */ 272 const struct glsl_type *array_type = glsl_get_array_element(type); 273 if (glsl_get_base_type(array_type) == GLSL_TYPE_STRUCT || 274 glsl_get_base_type(array_type) == GLSL_TYPE_ARRAY) { 275 unsigned elem_location = location; 276 unsigned stride = inouts_share_location ? 0 : 277 glsl_count_attribute_slots(array_type, false); 278 for (unsigned i = 0; i < glsl_get_length(type); i++) { 279 char *elem = ralloc_asprintf(shProg, "%s[%d]", name, i); 280 if (!add_shader_variable(ctx, shProg, resource_set, 281 stage_mask, programInterface, 282 var, elem, array_type, 283 use_implicit_location, elem_location, 284 false, outermost_struct_type)) 285 return false; 286 elem_location += stride; 287 } 288 return true; 289 } 290 } 291 FALLTHROUGH; 292 293 default: { 294 /* The ARB_program_interface_query spec says: 295 * 296 * "For an active variable declared as a single instance of a basic 297 * type, a single entry will be generated, using the variable name 298 * from the shader source." 299 */ 300 struct gl_shader_variable *sha_v = 301 create_shader_variable(shProg, var, name, type, interface_type, 302 use_implicit_location, location, 303 outermost_struct_type); 304 if (!sha_v) 305 return false; 306 307 return link_util_add_program_resource(shProg, resource_set, 308 programInterface, sha_v, stage_mask); 309 } 310 } 311} 312 313static bool 314add_vars_with_modes(const struct gl_context *ctx, 315 struct gl_shader_program *prog, struct set *resource_set, 316 nir_shader *nir, nir_variable_mode modes, 317 unsigned stage, GLenum programInterface) 318{ 319 nir_foreach_variable_with_modes(var, nir, modes) { 320 if (var->data.how_declared == nir_var_hidden) 321 continue; 322 323 int loc_bias = 0; 324 switch(var->data.mode) { 325 case nir_var_system_value: 326 case nir_var_shader_in: 327 if (programInterface != GL_PROGRAM_INPUT) 328 continue; 329 loc_bias = (stage == MESA_SHADER_VERTEX) ? VERT_ATTRIB_GENERIC0 330 : VARYING_SLOT_VAR0; 331 break; 332 case nir_var_shader_out: 333 if (programInterface != GL_PROGRAM_OUTPUT) 334 continue; 335 loc_bias = (stage == MESA_SHADER_FRAGMENT) ? FRAG_RESULT_DATA0 336 : VARYING_SLOT_VAR0; 337 break; 338 default: 339 continue; 340 } 341 342 if (var->data.patch) 343 loc_bias = VARYING_SLOT_PATCH0; 344 345 if (prog->data->spirv) { 346 struct gl_shader_variable *sh_var = 347 rzalloc(prog, struct gl_shader_variable); 348 349 /* In the ARB_gl_spirv spec, names are considered optional debug info, so 350 * the linker needs to work without them. Returning them is optional. 351 * For simplicity, we ignore names. 352 */ 353 sh_var->name = NULL; 354 sh_var->type = var->type; 355 sh_var->location = var->data.location - loc_bias; 356 sh_var->index = var->data.index; 357 358 if (!link_util_add_program_resource(prog, resource_set, 359 programInterface, 360 sh_var, 1 << stage)) { 361 return false; 362 } 363 } else { 364 /* Skip packed varyings, packed varyings are handled separately 365 * by add_packed_varyings in the GLSL IR 366 * build_program_resource_list() call. 367 * TODO: handle packed varyings here instead. We likely want a NIR 368 * based packing pass first. 369 */ 370 if (strncmp(var->name, "packed:", 7) == 0) 371 continue; 372 373 const bool vs_input_or_fs_output = 374 (stage == MESA_SHADER_VERTEX && 375 var->data.mode == nir_var_shader_in) || 376 (stage == MESA_SHADER_FRAGMENT && 377 var->data.mode == nir_var_shader_out); 378 379 if (!add_shader_variable(ctx, prog, resource_set, 380 1 << stage, programInterface, 381 var, var->name, var->type, 382 vs_input_or_fs_output, 383 var->data.location - loc_bias, 384 inout_has_same_location(var, stage), 385 NULL)) 386 return false; 387 } 388 } 389 390 return true; 391} 392 393static bool 394add_interface_variables(const struct gl_context *ctx, 395 struct gl_shader_program *prog, 396 struct set *resource_set, 397 unsigned stage, GLenum programInterface) 398{ 399 struct gl_linked_shader *sh = prog->_LinkedShaders[stage]; 400 if (!sh) 401 return true; 402 403 nir_shader *nir = sh->Program->nir; 404 assert(nir); 405 406 switch (programInterface) { 407 case GL_PROGRAM_INPUT: { 408 return add_vars_with_modes(ctx, prog, resource_set, 409 nir, nir_var_shader_in | nir_var_system_value, 410 stage, programInterface); 411 } 412 case GL_PROGRAM_OUTPUT: 413 return add_vars_with_modes(ctx, prog, resource_set, 414 nir, nir_var_shader_out, 415 stage, programInterface); 416 default: 417 assert("!Should not get here"); 418 break; 419 } 420 421 return false; 422} 423 424/* TODO: as we keep adding features, this method is becoming more and more 425 * similar to its GLSL counterpart at linker.cpp. Eventually it would be good 426 * to check if they could be refactored, and reduce code duplication somehow 427 */ 428void 429nir_build_program_resource_list(struct gl_context *ctx, 430 struct gl_shader_program *prog, 431 bool rebuild_resourse_list) 432{ 433 /* Rebuild resource list. */ 434 if (prog->data->ProgramResourceList && rebuild_resourse_list) { 435 ralloc_free(prog->data->ProgramResourceList); 436 prog->data->ProgramResourceList = NULL; 437 prog->data->NumProgramResourceList = 0; 438 } 439 440 int input_stage = MESA_SHADER_STAGES, output_stage = 0; 441 442 /* Determine first input and final output stage. These are used to 443 * detect which variables should be enumerated in the resource list 444 * for GL_PROGRAM_INPUT and GL_PROGRAM_OUTPUT. 445 */ 446 for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { 447 if (!prog->_LinkedShaders[i]) 448 continue; 449 if (input_stage == MESA_SHADER_STAGES) 450 input_stage = i; 451 output_stage = i; 452 } 453 454 /* Empty shader, no resources. */ 455 if (input_stage == MESA_SHADER_STAGES && output_stage == 0) 456 return; 457 458 struct set *resource_set = _mesa_pointer_set_create(NULL); 459 460 /* Add inputs and outputs to the resource list. */ 461 if (!add_interface_variables(ctx, prog, resource_set, input_stage, 462 GL_PROGRAM_INPUT)) { 463 return; 464 } 465 466 if (!add_interface_variables(ctx, prog, resource_set, output_stage, 467 GL_PROGRAM_OUTPUT)) { 468 return; 469 } 470 471 /* Add transform feedback varyings and buffers. */ 472 if (prog->last_vert_prog) { 473 struct gl_transform_feedback_info *linked_xfb = 474 prog->last_vert_prog->sh.LinkedTransformFeedback; 475 476 /* Add varyings. */ 477 if (linked_xfb->NumVarying > 0) { 478 for (int i = 0; i < linked_xfb->NumVarying; i++) { 479 if (!link_util_add_program_resource(prog, resource_set, 480 GL_TRANSFORM_FEEDBACK_VARYING, 481 &linked_xfb->Varyings[i], 0)) 482 return; 483 } 484 } 485 486 /* Add buffers. */ 487 for (unsigned i = 0; i < ctx->Const.MaxTransformFeedbackBuffers; i++) { 488 if ((linked_xfb->ActiveBuffers >> i) & 1) { 489 linked_xfb->Buffers[i].Binding = i; 490 if (!link_util_add_program_resource(prog, resource_set, 491 GL_TRANSFORM_FEEDBACK_BUFFER, 492 &linked_xfb->Buffers[i], 0)) 493 return; 494 } 495 } 496 } 497 498 /* Add uniforms 499 * 500 * Here, it is expected that nir_link_uniforms() has already been 501 * called, so that UniformStorage table is already available. 502 */ 503 int top_level_array_base_offset = -1; 504 int top_level_array_size_in_bytes = -1; 505 int second_element_offset = -1; 506 int block_index = -1; 507 for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) { 508 struct gl_uniform_storage *uniform = &prog->data->UniformStorage[i]; 509 510 if (uniform->hidden) { 511 for (int j = MESA_SHADER_VERTEX; j < MESA_SHADER_STAGES; j++) { 512 if (!uniform->opaque[j].active || 513 glsl_get_base_type(uniform->type) != GLSL_TYPE_SUBROUTINE) 514 continue; 515 516 GLenum type = 517 _mesa_shader_stage_to_subroutine_uniform((gl_shader_stage)j); 518 /* add shader subroutines */ 519 if (!link_util_add_program_resource(prog, resource_set, 520 type, uniform, 0)) 521 return; 522 } 523 524 continue; 525 } 526 527 if (!link_util_should_add_buffer_variable(prog, uniform, 528 top_level_array_base_offset, 529 top_level_array_size_in_bytes, 530 second_element_offset, block_index)) 531 continue; 532 533 534 if (prog->data->UniformStorage[i].offset >= second_element_offset) { 535 top_level_array_base_offset = 536 prog->data->UniformStorage[i].offset; 537 538 top_level_array_size_in_bytes = 539 prog->data->UniformStorage[i].top_level_array_size * 540 prog->data->UniformStorage[i].top_level_array_stride; 541 542 /* Set or reset the second element offset. For non arrays this 543 * will be set to -1. 544 */ 545 second_element_offset = top_level_array_size_in_bytes ? 546 top_level_array_base_offset + 547 prog->data->UniformStorage[i].top_level_array_stride : -1; 548 } 549 block_index = uniform->block_index; 550 551 552 GLenum interface = uniform->is_shader_storage ? GL_BUFFER_VARIABLE : GL_UNIFORM; 553 if (!link_util_add_program_resource(prog, resource_set, interface, uniform, 554 uniform->active_shader_mask)) { 555 return; 556 } 557 } 558 559 560 for (unsigned i = 0; i < prog->data->NumUniformBlocks; i++) { 561 if (!link_util_add_program_resource(prog, resource_set, GL_UNIFORM_BLOCK, 562 &prog->data->UniformBlocks[i], 563 prog->data->UniformBlocks[i].stageref)) 564 return; 565 } 566 567 for (unsigned i = 0; i < prog->data->NumShaderStorageBlocks; i++) { 568 if (!link_util_add_program_resource(prog, resource_set, GL_SHADER_STORAGE_BLOCK, 569 &prog->data->ShaderStorageBlocks[i], 570 prog->data->ShaderStorageBlocks[i].stageref)) 571 return; 572 } 573 574 /* Add atomic counter buffers. */ 575 for (unsigned i = 0; i < prog->data->NumAtomicBuffers; i++) { 576 if (!link_util_add_program_resource(prog, resource_set, GL_ATOMIC_COUNTER_BUFFER, 577 &prog->data->AtomicBuffers[i], 0)) 578 return; 579 } 580 581 unsigned mask = prog->data->linked_stages; 582 while (mask) { 583 const int i = u_bit_scan(&mask); 584 struct gl_program *p = prog->_LinkedShaders[i]->Program; 585 586 GLuint type = _mesa_shader_stage_to_subroutine((gl_shader_stage)i); 587 for (unsigned j = 0; j < p->sh.NumSubroutineFunctions; j++) { 588 if (!link_util_add_program_resource(prog, resource_set, 589 type, 590 &p->sh.SubroutineFunctions[j], 591 0)) 592 return; 593 } 594 } 595 596 _mesa_set_destroy(resource_set, NULL); 597} 598 599bool 600gl_nir_link_spirv(struct gl_context *ctx, struct gl_shader_program *prog, 601 const struct gl_nir_linker_options *options) 602{ 603 for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { 604 struct gl_linked_shader *shader = prog->_LinkedShaders[i]; 605 if (shader) { 606 const nir_remove_dead_variables_options opts = { 607 .can_remove_var = can_remove_uniform, 608 }; 609 nir_remove_dead_variables(shader->Program->nir, nir_var_uniform, 610 &opts); 611 } 612 } 613 614 if (!gl_nir_link_uniform_blocks(ctx, prog)) 615 return false; 616 617 if (!gl_nir_link_uniforms(ctx, prog, options->fill_parameters)) 618 return false; 619 620 gl_nir_link_assign_atomic_counter_resources(ctx, prog); 621 gl_nir_link_assign_xfb_resources(ctx, prog); 622 623 return true; 624} 625 626/** 627 * Validate shader image resources. 628 */ 629static void 630check_image_resources(struct gl_context *ctx, struct gl_shader_program *prog) 631{ 632 unsigned total_image_units = 0; 633 unsigned fragment_outputs = 0; 634 unsigned total_shader_storage_blocks = 0; 635 636 if (!ctx->Extensions.ARB_shader_image_load_store) 637 return; 638 639 for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { 640 struct gl_linked_shader *sh = prog->_LinkedShaders[i]; 641 if (!sh) 642 continue; 643 644 total_image_units += sh->Program->info.num_images; 645 total_shader_storage_blocks += sh->Program->info.num_ssbos; 646 } 647 648 if (total_image_units > ctx->Const.MaxCombinedImageUniforms) 649 linker_error(prog, "Too many combined image uniforms\n"); 650 651 struct gl_linked_shader *frag_sh = 652 prog->_LinkedShaders[MESA_SHADER_FRAGMENT]; 653 if (frag_sh) { 654 uint64_t frag_outputs_written = frag_sh->Program->info.outputs_written; 655 fragment_outputs = util_bitcount64(frag_outputs_written); 656 } 657 658 if (total_image_units + fragment_outputs + total_shader_storage_blocks > 659 ctx->Const.MaxCombinedShaderOutputResources) 660 linker_error(prog, "Too many combined image uniforms, shader storage " 661 " buffers and fragment outputs\n"); 662} 663 664bool 665gl_nir_link_glsl(struct gl_context *ctx, struct gl_shader_program *prog) 666{ 667 for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { 668 struct gl_linked_shader *shader = prog->_LinkedShaders[i]; 669 if (shader) { 670 const nir_remove_dead_variables_options opts = { 671 .can_remove_var = can_remove_uniform, 672 }; 673 nir_remove_dead_variables(shader->Program->nir, nir_var_uniform, 674 &opts); 675 } 676 } 677 678 if (!gl_nir_link_uniforms(ctx, prog, true)) 679 return false; 680 681 link_util_calculate_subroutine_compat(prog); 682 link_util_check_uniform_resources(ctx, prog); 683 link_util_check_subroutine_resources(prog); 684 check_image_resources(ctx, prog); 685 gl_nir_link_assign_atomic_counter_resources(ctx, prog); 686 gl_nir_link_check_atomic_counter_resources(ctx, prog); 687 688 if (prog->data->LinkStatus == LINKING_FAILURE) 689 return false; 690 691 return true; 692} 693