mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 09:20:12 +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();
|
unsigned lane_mask_size = ctx->program->lane_mask.size();
|
||||||
|
|
||||||
ctx->shader = shader;
|
ctx->shader = shader;
|
||||||
nir_divergence_analysis(shader, nir_divergence_view_index_uniform);
|
nir_divergence_analysis(shader);
|
||||||
|
|
||||||
fill_desc_set_info(ctx, impl);
|
fill_desc_set_info(ctx, impl);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -90,6 +90,7 @@ static const struct nir_shader_compiler_options nir_options = {
|
||||||
nir_lower_dsqrt |
|
nir_lower_dsqrt |
|
||||||
nir_lower_drsq |
|
nir_lower_drsq |
|
||||||
nir_lower_ddiv,
|
nir_lower_ddiv,
|
||||||
|
.divergence_analysis_options = nir_divergence_view_index_uniform,
|
||||||
};
|
};
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
|
||||||
|
|
@ -3377,6 +3377,7 @@ typedef struct nir_shader_compiler_options {
|
||||||
|
|
||||||
nir_lower_int64_options lower_int64_options;
|
nir_lower_int64_options lower_int64_options;
|
||||||
nir_lower_doubles_options lower_doubles_options;
|
nir_lower_doubles_options lower_doubles_options;
|
||||||
|
nir_divergence_options divergence_analysis_options;
|
||||||
} nir_shader_compiler_options;
|
} nir_shader_compiler_options;
|
||||||
|
|
||||||
typedef struct nir_shader {
|
typedef struct nir_shader {
|
||||||
|
|
@ -4799,7 +4800,7 @@ bool nir_repair_ssa(nir_shader *shader);
|
||||||
|
|
||||||
void nir_convert_loop_to_lcssa(nir_loop *loop);
|
void nir_convert_loop_to_lcssa(nir_loop *loop);
|
||||||
bool nir_convert_to_lcssa(nir_shader *shader, bool skip_invariants, bool skip_bool_invariants);
|
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
|
/* 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
|
* registers. If false, convert all values (even those not involved in a phi
|
||||||
|
|
|
||||||
|
|
@ -37,8 +37,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct divergence_state {
|
struct divergence_state {
|
||||||
const nir_divergence_options options;
|
|
||||||
const gl_shader_stage stage;
|
const gl_shader_stage stage;
|
||||||
|
nir_shader *shader;
|
||||||
|
|
||||||
/** current control flow state */
|
/** current control flow state */
|
||||||
/* True if some loop-active invocations might take a different control-flow path.
|
/* 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
|
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)
|
if (!nir_intrinsic_infos[instr->intrinsic].has_dest)
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -86,8 +86,8 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state)
|
||||||
if (instr->dest.ssa.divergent)
|
if (instr->dest.ssa.divergent)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
nir_divergence_options options = state->options;
|
nir_divergence_options options = shader->options->divergence_analysis_options;
|
||||||
gl_shader_stage stage = state->stage;
|
gl_shader_stage stage = shader->info.stage;
|
||||||
bool is_divergent = false;
|
bool is_divergent = false;
|
||||||
switch (instr->intrinsic) {
|
switch (instr->intrinsic) {
|
||||||
/* Intrinsics which are always uniform */
|
/* Intrinsics which are always uniform */
|
||||||
|
|
@ -524,24 +524,27 @@ nir_variable_mode_is_uniform(nir_variable_mode mode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
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))
|
if (nir_variable_mode_is_uniform(var->data.mode))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (state->stage == MESA_SHADER_FRAGMENT &&
|
nir_divergence_options options = shader->options->divergence_analysis_options;
|
||||||
(state->options & nir_divergence_single_prim_per_subgroup) &&
|
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.mode == nir_var_shader_in &&
|
||||||
var->data.interpolation == INTERP_MODE_FLAT)
|
var->data.interpolation == INTERP_MODE_FLAT)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (state->stage == MESA_SHADER_TESS_CTRL &&
|
if (stage == MESA_SHADER_TESS_CTRL &&
|
||||||
(state->options & nir_divergence_single_patch_per_tcs_subgroup) &&
|
(options & nir_divergence_single_patch_per_tcs_subgroup) &&
|
||||||
var->data.mode == nir_var_shader_out && var->data.patch)
|
var->data.mode == nir_var_shader_out && var->data.patch)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (state->stage == MESA_SHADER_TESS_EVAL &&
|
if (stage == MESA_SHADER_TESS_EVAL &&
|
||||||
(state->options & nir_divergence_single_patch_per_tes_subgroup) &&
|
(options & nir_divergence_single_patch_per_tes_subgroup) &&
|
||||||
var->data.mode == nir_var_shader_in && var->data.patch)
|
var->data.mode == nir_var_shader_in && var->data.patch)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
@ -549,7 +552,7 @@ nir_variable_is_uniform(nir_variable *var, struct divergence_state *state)
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
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)
|
if (deref->dest.ssa.divergent)
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -557,7 +560,7 @@ visit_deref(nir_deref_instr *deref, struct divergence_state *state)
|
||||||
bool is_divergent = false;
|
bool is_divergent = false;
|
||||||
switch (deref->deref_type) {
|
switch (deref->deref_type) {
|
||||||
case nir_deref_type_var:
|
case nir_deref_type_var:
|
||||||
is_divergent = !nir_variable_is_uniform(deref->var, state);
|
is_divergent = !nir_variable_is_uniform(shader, deref->var);
|
||||||
break;
|
break;
|
||||||
case nir_deref_type_array:
|
case nir_deref_type_array:
|
||||||
case nir_deref_type_ptr_as_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));
|
has_changed |= visit_alu(nir_instr_as_alu(instr));
|
||||||
break;
|
break;
|
||||||
case nir_instr_type_intrinsic:
|
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;
|
break;
|
||||||
case nir_instr_type_tex:
|
case nir_instr_type_tex:
|
||||||
has_changed |= visit_tex(nir_instr_as_tex(instr));
|
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));
|
has_changed |= visit_ssa_undef(nir_instr_as_ssa_undef(instr));
|
||||||
break;
|
break;
|
||||||
case nir_instr_type_deref:
|
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;
|
break;
|
||||||
case nir_instr_type_jump:
|
case nir_instr_type_jump:
|
||||||
has_changed |= visit_jump(nir_instr_as_jump(instr), state);
|
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
|
void
|
||||||
nir_divergence_analysis(nir_shader *shader, nir_divergence_options options)
|
nir_divergence_analysis(nir_shader *shader)
|
||||||
{
|
{
|
||||||
struct divergence_state state = {
|
struct divergence_state state = {
|
||||||
.options = options,
|
|
||||||
.stage = shader->info.stage,
|
.stage = shader->info.stage,
|
||||||
|
.shader = shader,
|
||||||
.divergent_loop_cf = false,
|
.divergent_loop_cf = false,
|
||||||
.divergent_loop_continue = false,
|
.divergent_loop_continue = false,
|
||||||
.divergent_loop_break = false,
|
.divergent_loop_break = false,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue