mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-20 18:10:11 +01:00
nir: move divergence analysis options to nir_shader_compiler_options
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> Reviewed-by: Daniel Schürmann <daniel@schuermann.dev> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6558>
This commit is contained in:
parent
bb5c0ba0d2
commit
e1120f274f
4 changed files with 24 additions and 19 deletions
|
|
@ -766,7 +766,7 @@ void init_context(isel_context *ctx, nir_shader *shader)
|
|||
unsigned lane_mask_size = ctx->program->lane_mask.size();
|
||||
|
||||
ctx->shader = shader;
|
||||
nir_divergence_analysis(shader, nir_divergence_view_index_uniform);
|
||||
nir_divergence_analysis(shader);
|
||||
|
||||
fill_desc_set_info(ctx, impl);
|
||||
|
||||
|
|
|
|||
|
|
@ -90,6 +90,7 @@ static const struct nir_shader_compiler_options nir_options = {
|
|||
nir_lower_dsqrt |
|
||||
nir_lower_drsq |
|
||||
nir_lower_ddiv,
|
||||
.divergence_analysis_options = nir_divergence_view_index_uniform,
|
||||
};
|
||||
|
||||
bool
|
||||
|
|
|
|||
|
|
@ -3377,6 +3377,7 @@ typedef struct nir_shader_compiler_options {
|
|||
|
||||
nir_lower_int64_options lower_int64_options;
|
||||
nir_lower_doubles_options lower_doubles_options;
|
||||
nir_divergence_options divergence_analysis_options;
|
||||
} nir_shader_compiler_options;
|
||||
|
||||
typedef struct nir_shader {
|
||||
|
|
@ -4799,7 +4800,7 @@ bool nir_repair_ssa(nir_shader *shader);
|
|||
|
||||
void nir_convert_loop_to_lcssa(nir_loop *loop);
|
||||
bool nir_convert_to_lcssa(nir_shader *shader, bool skip_invariants, bool skip_bool_invariants);
|
||||
void nir_divergence_analysis(nir_shader *shader, nir_divergence_options options);
|
||||
void nir_divergence_analysis(nir_shader *shader);
|
||||
|
||||
/* If phi_webs_only is true, only convert SSA values involved in phi nodes to
|
||||
* registers. If false, convert all values (even those not involved in a phi
|
||||
|
|
|
|||
|
|
@ -37,8 +37,8 @@
|
|||
*/
|
||||
|
||||
struct divergence_state {
|
||||
const nir_divergence_options options;
|
||||
const gl_shader_stage stage;
|
||||
nir_shader *shader;
|
||||
|
||||
/** current control flow state */
|
||||
/* True if some loop-active invocations might take a different control-flow path.
|
||||
|
|
@ -78,7 +78,7 @@ visit_alu(nir_alu_instr *instr)
|
|||
}
|
||||
|
||||
static bool
|
||||
visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state)
|
||||
visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr)
|
||||
{
|
||||
if (!nir_intrinsic_infos[instr->intrinsic].has_dest)
|
||||
return false;
|
||||
|
|
@ -86,8 +86,8 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state)
|
|||
if (instr->dest.ssa.divergent)
|
||||
return false;
|
||||
|
||||
nir_divergence_options options = state->options;
|
||||
gl_shader_stage stage = state->stage;
|
||||
nir_divergence_options options = shader->options->divergence_analysis_options;
|
||||
gl_shader_stage stage = shader->info.stage;
|
||||
bool is_divergent = false;
|
||||
switch (instr->intrinsic) {
|
||||
/* Intrinsics which are always uniform */
|
||||
|
|
@ -524,24 +524,27 @@ nir_variable_mode_is_uniform(nir_variable_mode mode) {
|
|||
}
|
||||
|
||||
static bool
|
||||
nir_variable_is_uniform(nir_variable *var, struct divergence_state *state)
|
||||
nir_variable_is_uniform(nir_shader *shader, nir_variable *var)
|
||||
{
|
||||
if (nir_variable_mode_is_uniform(var->data.mode))
|
||||
return true;
|
||||
|
||||
if (state->stage == MESA_SHADER_FRAGMENT &&
|
||||
(state->options & nir_divergence_single_prim_per_subgroup) &&
|
||||
nir_divergence_options options = shader->options->divergence_analysis_options;
|
||||
gl_shader_stage stage = shader->info.stage;
|
||||
|
||||
if (stage == MESA_SHADER_FRAGMENT &&
|
||||
(options & nir_divergence_single_prim_per_subgroup) &&
|
||||
var->data.mode == nir_var_shader_in &&
|
||||
var->data.interpolation == INTERP_MODE_FLAT)
|
||||
return true;
|
||||
|
||||
if (state->stage == MESA_SHADER_TESS_CTRL &&
|
||||
(state->options & nir_divergence_single_patch_per_tcs_subgroup) &&
|
||||
if (stage == MESA_SHADER_TESS_CTRL &&
|
||||
(options & nir_divergence_single_patch_per_tcs_subgroup) &&
|
||||
var->data.mode == nir_var_shader_out && var->data.patch)
|
||||
return true;
|
||||
|
||||
if (state->stage == MESA_SHADER_TESS_EVAL &&
|
||||
(state->options & nir_divergence_single_patch_per_tes_subgroup) &&
|
||||
if (stage == MESA_SHADER_TESS_EVAL &&
|
||||
(options & nir_divergence_single_patch_per_tes_subgroup) &&
|
||||
var->data.mode == nir_var_shader_in && var->data.patch)
|
||||
return true;
|
||||
|
||||
|
|
@ -549,7 +552,7 @@ nir_variable_is_uniform(nir_variable *var, struct divergence_state *state)
|
|||
}
|
||||
|
||||
static bool
|
||||
visit_deref(nir_deref_instr *deref, struct divergence_state *state)
|
||||
visit_deref(nir_shader *shader, nir_deref_instr *deref)
|
||||
{
|
||||
if (deref->dest.ssa.divergent)
|
||||
return false;
|
||||
|
|
@ -557,7 +560,7 @@ visit_deref(nir_deref_instr *deref, struct divergence_state *state)
|
|||
bool is_divergent = false;
|
||||
switch (deref->deref_type) {
|
||||
case nir_deref_type_var:
|
||||
is_divergent = !nir_variable_is_uniform(deref->var, state);
|
||||
is_divergent = !nir_variable_is_uniform(shader, deref->var);
|
||||
break;
|
||||
case nir_deref_type_array:
|
||||
case nir_deref_type_ptr_as_array:
|
||||
|
|
@ -629,7 +632,7 @@ visit_block(nir_block *block, struct divergence_state *state)
|
|||
has_changed |= visit_alu(nir_instr_as_alu(instr));
|
||||
break;
|
||||
case nir_instr_type_intrinsic:
|
||||
has_changed |= visit_intrinsic(nir_instr_as_intrinsic(instr), state);
|
||||
has_changed |= visit_intrinsic(state->shader, nir_instr_as_intrinsic(instr));
|
||||
break;
|
||||
case nir_instr_type_tex:
|
||||
has_changed |= visit_tex(nir_instr_as_tex(instr));
|
||||
|
|
@ -641,7 +644,7 @@ visit_block(nir_block *block, struct divergence_state *state)
|
|||
has_changed |= visit_ssa_undef(nir_instr_as_ssa_undef(instr));
|
||||
break;
|
||||
case nir_instr_type_deref:
|
||||
has_changed |= visit_deref(nir_instr_as_deref(instr), state);
|
||||
has_changed |= visit_deref(state->shader, nir_instr_as_deref(instr));
|
||||
break;
|
||||
case nir_instr_type_jump:
|
||||
has_changed |= visit_jump(nir_instr_as_jump(instr), state);
|
||||
|
|
@ -886,11 +889,11 @@ visit_cf_list(struct exec_list *list, struct divergence_state *state)
|
|||
}
|
||||
|
||||
void
|
||||
nir_divergence_analysis(nir_shader *shader, nir_divergence_options options)
|
||||
nir_divergence_analysis(nir_shader *shader)
|
||||
{
|
||||
struct divergence_state state = {
|
||||
.options = options,
|
||||
.stage = shader->info.stage,
|
||||
.shader = shader,
|
||||
.divergent_loop_cf = false,
|
||||
.divergent_loop_continue = false,
|
||||
.divergent_loop_break = false,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue