* the counter-part glsl/linker.cpp
*/
+static bool
+can_remove_uniform(nir_variable *var)
+{
+ /* Section 2.11.6 (Uniform Variables) of the OpenGL ES 3.0.3 spec
+ * says:
+ *
+ * "All members of a named uniform block declared with a shared or
+ * std140 layout qualifier are considered active, even if they are not
+ * referenced in any shader in the program. The uniform block itself is
+ * also considered active, even if no member of the block is
+ * referenced."
+ *
+ * Although the spec doesn't state it std430 layouts are expect to behave
+ * the same way. If the variable is in a uniform block with one of those
+ * layouts, do not eliminate it.
+ */
+ if (nir_variable_is_in_block(var) &&
+ (glsl_get_ifc_packing(var->interface_type) !=
+ GLSL_INTERFACE_PACKING_PACKED))
+ return false;
+
+ if (glsl_get_base_type(glsl_without_array(var->type)) ==
+ GLSL_TYPE_SUBROUTINE)
+ return false;
+
+ /* Uniform initializers could get used by another stage */
+ if (var->constant_initializer)
+ return false;
+
+ return true;
+}
+
/**
* Built-in / reserved GL variables names start with "gl_"
*/
}
return true;
}
- /* fallthrough */
}
+ /* fallthrough */
default: {
/* The ARB_program_interface_query spec says:
gl_nir_link_spirv(struct gl_context *ctx, struct gl_shader_program *prog,
const struct gl_nir_linker_options *options)
{
+ for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
+ struct gl_linked_shader *shader = prog->_LinkedShaders[i];
+ if (shader) {
+ nir_remove_dead_variables(shader->Program->nir, nir_var_uniform,
+ &can_remove_uniform);
+ }
+ }
+
if (!gl_nir_link_uniform_blocks(ctx, prog))
return false;
bool
gl_nir_link_glsl(struct gl_context *ctx, struct gl_shader_program *prog)
{
+ for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
+ struct gl_linked_shader *shader = prog->_LinkedShaders[i];
+ if (shader) {
+ nir_remove_dead_variables(shader->Program->nir, nir_var_uniform,
+ &can_remove_uniform);
+ }
+ }
+
+ if (!gl_nir_link_uniforms(ctx, prog, true))
+ return false;
+
link_util_calculate_subroutine_compat(prog);
link_util_check_uniform_resources(ctx, prog);
link_util_check_subroutine_resources(prog);