diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 813e6bd8e6f..6b7b8c90134 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -3585,6 +3585,12 @@ typedef struct { bool implicit_conversion_prohibited; + /* True if this parameter is not divergent. This is inverted to make + * parameters divergent by default unless explicitly specified + * otherwise. + */ + bool is_uniform; + nir_variable_mode mode; /* The type of the function param */ diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index 3518569f51b..792fdd0ede2 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -39,6 +39,7 @@ struct divergence_state { const gl_shader_stage stage; nir_shader *shader; + nir_function_impl *impl; nir_divergence_options options; nir_loop *loop; bool loop_all_invariant; @@ -736,11 +737,15 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state) src_divergent(instr->src[1], state); break; + case nir_intrinsic_load_param: + is_divergent = + !state->impl->function->params[nir_intrinsic_param_idx(instr)].is_uniform; + break; + /* Intrinsics which are always divergent */ case nir_intrinsic_inverse_ballot: case nir_intrinsic_load_color0: case nir_intrinsic_load_color1: - case nir_intrinsic_load_param: case nir_intrinsic_load_sample_id: case nir_intrinsic_load_sample_id_no_per_sample: case nir_intrinsic_load_sample_mask_in: @@ -1432,6 +1437,7 @@ nir_divergence_analysis_impl(nir_function_impl *impl, nir_divergence_options opt struct divergence_state state = { .stage = impl->function->shader->info.stage, .shader = impl->function->shader, + .impl = impl, .options = options, .loop = NULL, .loop_all_invariant = false, @@ -1466,6 +1472,7 @@ nir_vertex_divergence_analysis(nir_shader *shader) struct divergence_state state = { .stage = shader->info.stage, .shader = shader, + .impl = nir_shader_get_entrypoint(shader), .options = shader->options->divergence_analysis_options, .loop = NULL, .loop_all_invariant = false, diff --git a/src/compiler/nir/nir_serialize.c b/src/compiler/nir/nir_serialize.c index a0b2bbcc8e9..7bdd0da5082 100644 --- a/src/compiler/nir/nir_serialize.c +++ b/src/compiler/nir/nir_serialize.c @@ -2003,6 +2003,8 @@ write_function(write_ctx *ctx, const nir_function *fxn) if (fxn->params[i].is_return) val |= (1u << 17); + if (fxn->params[i].is_uniform) + val |= (1u << 18); blob_write_uint32(ctx->blob, val); if (has_name) blob_write_string(ctx->blob, fxn->params[i].name); @@ -2053,6 +2055,7 @@ read_function(read_ctx *ctx) fxn->params[i].num_components = val & 0xff; fxn->params[i].bit_size = (val >> 8) & 0xff; fxn->params[i].is_return = val & (1u << 16); + fxn->params[i].is_uniform = val & (1u << 17); fxn->params[i].type = decode_type_from_blob(ctx->blob); fxn->params[i].mode = decode_deref_modes(blob_read_uint32(ctx->blob)); }