void
st_nir_assign_vs_in_locations(struct nir_shader *nir)
{
- if (nir->info.stage != MESA_SHADER_VERTEX)
+ if (nir->info.stage != MESA_SHADER_VERTEX || nir->info.io_lowered)
return;
+ nir->num_inputs = util_bitcount64(nir->info.inputs_read);
+
bool removed_inputs = false;
- nir->num_inputs = util_bitcount64(nir->info.inputs_read);
nir_foreach_shader_in_variable_safe(var, nir) {
/* NIR already assigns dual-slot inputs to two locations so all we have
* to do is compact everything down.
* might be able to make progress after it.
*/
NIR_PASS(progress, nir, nir_remove_dead_variables,
- (nir_variable_mode)(nir_var_function_temp |
- nir_var_shader_temp |
- nir_var_mem_shared),
+ nir_var_function_temp | nir_var_shader_temp |
+ nir_var_mem_shared,
NULL);
NIR_PASS(progress, nir, nir_opt_copy_prop_vars);
* calls below do a little extra work but should otherwise have no impact.
*/
if (!_mesa_is_gles(st->ctx) || !nir->info.separate_shader) {
- nir_variable_mode mask =
- (nir_variable_mode) (nir_var_shader_in | nir_var_shader_out);
+ nir_variable_mode mask = nir_var_shader_in | nir_var_shader_out;
nir_remove_dead_variables(nir, mask, NULL);
}
struct gl_shader_program *shader_program)
{
nir_shader *nir = prog->nir;
+ struct pipe_screen *screen = st->pipe->screen;
/* Make a pass over the IR to add state references for any built-in
* uniforms that are used. This has to be done now (during linking).
!st->ctx->Const.PackedDriverUniformStorage)
NIR_PASS_V(nir, st_nir_lower_builtin);
- NIR_PASS_V(nir, gl_nir_lower_atomics, shader_program, true);
+ if (!screen->get_param(screen, PIPE_CAP_NIR_ATOMICS_AS_DEREF))
+ NIR_PASS_V(nir, gl_nir_lower_atomics, shader_program, true);
+
NIR_PASS_V(nir, nir_opt_intrinsics);
/* Lower 64-bit ops. */
NIR_PASS(lowered_64bit_ops, nir, nir_lower_doubles,
st->ctx->SoftFP64, nir->options->lower_doubles_options);
}
- if (nir->options->lower_int64_options) {
- NIR_PASS(lowered_64bit_ops, nir, nir_lower_int64,
- nir->options->lower_int64_options);
- }
+ if (nir->options->lower_int64_options)
+ NIR_PASS(lowered_64bit_ops, nir, nir_lower_int64);
if (lowered_64bit_ops)
st_nir_opts(nir);
}
- nir_variable_mode mask = (nir_variable_mode)
- (nir_var_shader_in | nir_var_shader_out | nir_var_function_temp );
+ nir_variable_mode mask =
+ nir_var_shader_in | nir_var_shader_out | nir_var_function_temp;
nir_remove_dead_variables(nir, mask, NULL);
- if (!st->has_hw_atomics)
+ if (!st->has_hw_atomics && !screen->get_param(screen, PIPE_CAP_NIR_ATOMICS_AS_DEREF))
NIR_PASS_V(nir, nir_lower_atomics_to_ssbo);
st_finalize_nir_before_variants(nir);
st->pipe->screen);
NIR_PASS_V(nir, nir_lower_system_values);
+ NIR_PASS_V(nir, nir_lower_compute_system_values, NULL);
+
NIR_PASS_V(nir, nir_lower_clip_cull_distance_arrays);
st_shader_gather_info(nir, shader->Program);