* no vendor actually implemented that behavior. The 4.20
* behavior matches the implemented behavior of at least one other
* vendor, so we'll implement that for all GLSL versions.
+ * If (at least) one of these constant expressions is implicit,
+ * because it was added by glsl_zero_init, we skip the verification.
*/
if (var->constant_initializer != NULL) {
- if (existing->constant_initializer != NULL) {
+ if (existing->constant_initializer != NULL &&
+ !existing->data.is_implicit_initializer &&
+ !var->data.is_implicit_initializer) {
if (!var->constant_initializer->has_value(existing->constant_initializer)) {
linker_error(prog, "initializers for %s "
"`%s' have differing values\n",
* not have an initializer but a later instance does,
* replace the former with the later.
*/
- variables->replace_variable(existing->name, var);
+ if (!var->data.is_implicit_initializer)
+ variables->replace_variable(existing->name, var);
}
}
link_and_validate_uniforms(struct gl_context *ctx,
struct gl_shader_program *prog)
{
- update_array_sizes(prog);
+ assert(!ctx->Const.UseNIRGLSLLinker);
- if (!ctx->Const.UseNIRGLSLLinker) {
- link_assign_uniform_locations(prog, ctx);
+ update_array_sizes(prog);
+ link_assign_uniform_locations(prog, ctx);
- if (prog->data->LinkStatus == LINKING_FAILURE)
- return;
+ if (prog->data->LinkStatus == LINKING_FAILURE)
+ return;
- link_util_calculate_subroutine_compat(prog);
- link_util_check_uniform_resources(ctx, prog);
- link_util_check_subroutine_resources(prog);
- check_image_resources(ctx, prog);
- link_assign_atomic_counter_resources(ctx, prog);
- link_check_atomic_counter_resources(ctx, prog);
- }
+ link_util_calculate_subroutine_compat(prog);
+ link_util_check_uniform_resources(ctx, prog);
+ link_util_check_subroutine_resources(prog);
+ check_image_resources(ctx, prog);
+ link_assign_atomic_counter_resources(ctx, prog);
+ link_check_atomic_counter_resources(ctx, prog);
}
static bool
if (!link_varyings(prog, first, last, ctx, mem_ctx))
return false;
- link_and_validate_uniforms(ctx, prog);
+ if (!ctx->Const.UseNIRGLSLLinker)
+ link_and_validate_uniforms(ctx, prog);
if (!prog->data->LinkStatus)
return false;