From: Marek Olšák Date: Fri, 10 Mar 2023 02:30:41 +0000 (-0500) Subject: nir: rework nir_lower_color_inputs to work with lowered IO intrinsics X-Git-Tag: upstream/23.3.3~9772 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9d78fec68486018bd7ce89dba53b8f5fddf60e6e;p=platform%2Fupstream%2Fmesa.git nir: rework nir_lower_color_inputs to work with lowered IO intrinsics also only call it from radeonsi and remove the option Reviewed-by: Qiang Yu Reviewed-by: Timur Kristóf Part-of: --- diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index b2a3b4e..d1921df 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -3827,13 +3827,6 @@ typedef struct nir_shader_compiler_options { bool lower_io_variables; /** - * Lower color inputs to load_colorN that are kind of like system values - * if lower_io_variables is also set. shader_info will contain - * the interpolation settings. This is used by nir_lower_io_passes. - */ - bool lower_fs_color_inputs; - - /** * The masks of shader stages that support indirect indexing with * load_input and store_output intrinsics. It's used when * lower_io_variables is true. This is used by nir_lower_io_passes. @@ -4824,10 +4817,8 @@ bool nir_lower_io(nir_shader *shader, nir_lower_io_options); bool nir_io_add_const_offset_to_base(nir_shader *nir, nir_variable_mode modes); - -void -nir_lower_io_passes(nir_shader *nir); - +bool nir_lower_color_inputs(nir_shader *nir); +void nir_lower_io_passes(nir_shader *nir); bool nir_io_add_intrinsic_xfb_info(nir_shader *nir); bool diff --git a/src/compiler/nir/nir_lower_io.c b/src/compiler/nir/nir_lower_io.c index eff8d15..ec8b6bf 100644 --- a/src/compiler/nir/nir_lower_io.c +++ b/src/compiler/nir/nir_lower_io.c @@ -2984,7 +2984,7 @@ nir_io_add_const_offset_to_base(nir_shader *nir, nir_variable_mode modes) return progress; } -static bool +bool nir_lower_color_inputs(nir_shader *nir) { nir_function_impl *impl = nir_shader_get_entrypoint(nir); @@ -3000,32 +3000,58 @@ nir_lower_color_inputs(nir_shader *nir) nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr); - if (intrin->intrinsic != nir_intrinsic_load_deref) + if (intrin->intrinsic != nir_intrinsic_load_input && + intrin->intrinsic != nir_intrinsic_load_interpolated_input) continue; - nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]); - if (!nir_deref_mode_is(deref, nir_var_shader_in)) + nir_io_semantics sem = nir_intrinsic_io_semantics(intrin); + + if (sem.location != VARYING_SLOT_COL0 && + sem.location != VARYING_SLOT_COL1) continue; + /* Default to FLAT (for load_input) */ + enum glsl_interp_mode interp = INTERP_MODE_FLAT; + bool sample = false; + bool centroid = false; + + if (intrin->intrinsic == nir_intrinsic_load_interpolated_input) { + nir_intrinsic_instr *baryc = + nir_instr_as_intrinsic(intrin->src[0].ssa->parent_instr); + + centroid = + baryc->intrinsic == nir_intrinsic_load_barycentric_centroid; + sample = + baryc->intrinsic == nir_intrinsic_load_barycentric_sample; + assert(centroid || sample || + baryc->intrinsic == nir_intrinsic_load_barycentric_pixel); + + interp = nir_intrinsic_interp_mode(baryc); + } + b.cursor = nir_before_instr(instr); - nir_variable *var = nir_deref_instr_get_variable(deref); - nir_ssa_def *def; - - if (var->data.location == VARYING_SLOT_COL0) { - def = nir_load_color0(&b); - nir->info.fs.color0_interp = var->data.interpolation; - nir->info.fs.color0_sample = var->data.sample; - nir->info.fs.color0_centroid = var->data.centroid; - } else if (var->data.location == VARYING_SLOT_COL1) { - def = nir_load_color1(&b); - nir->info.fs.color1_interp = var->data.interpolation; - nir->info.fs.color1_sample = var->data.sample; - nir->info.fs.color1_centroid = var->data.centroid; + nir_ssa_def *load = NULL; + + if (sem.location == VARYING_SLOT_COL0) { + load = nir_load_color0(&b); + nir->info.fs.color0_interp = interp; + nir->info.fs.color0_sample = sample; + nir->info.fs.color0_centroid = centroid; } else { - continue; + assert(sem.location == VARYING_SLOT_COL1); + load = nir_load_color1(&b); + nir->info.fs.color1_interp = interp; + nir->info.fs.color1_sample = sample; + nir->info.fs.color1_centroid = centroid; } - nir_ssa_def_rewrite_uses(&intrin->dest.ssa, def); + if (intrin->num_components != 4) { + unsigned start = nir_intrinsic_component(intrin); + unsigned count = intrin->num_components; + load = nir_channels(&b, load, BITFIELD_RANGE(start, count)); + } + + nir_ssa_def_rewrite_uses(&intrin->dest.ssa, load); nir_instr_remove(instr); progress = true; } @@ -3154,10 +3180,6 @@ nir_lower_io_passes(nir_shader *nir) NIR_PASS_V(nir, nir_lower_global_vars_to_local); } - if (nir->info.stage == MESA_SHADER_FRAGMENT && - nir->options->lower_fs_color_inputs) - NIR_PASS_V(nir, nir_lower_color_inputs); - NIR_PASS_V(nir, nir_lower_io, nir_var_shader_out | nir_var_shader_in, type_size_vec4, nir_lower_io_lower_64bit_to_32); diff --git a/src/gallium/drivers/radeonsi/si_get.c b/src/gallium/drivers/radeonsi/si_get.c index d4b3075..77799f5 100644 --- a/src/gallium/drivers/radeonsi/si_get.c +++ b/src/gallium/drivers/radeonsi/si_get.c @@ -1268,7 +1268,6 @@ void si_init_screen_get_functions(struct si_screen *sscreen) nir_pack_varying_interp_loc_sample | nir_pack_varying_interp_loc_centroid, .lower_io_variables = true, - .lower_fs_color_inputs = true, /* HW supports indirect indexing for: | Enabled in driver * ------------------------------------------------------- * TCS inputs | Yes diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c index 62f3a2d..b655b95 100644 --- a/src/gallium/drivers/radeonsi/si_shader_nir.c +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c @@ -415,6 +415,9 @@ char *si_finalize_nir(struct pipe_screen *screen, void *nirptr) nir_lower_io_passes(nir); NIR_PASS_V(nir, nir_remove_dead_variables, nir_var_shader_in | nir_var_shader_out, NULL); + if (nir->info.stage == MESA_SHADER_FRAGMENT) + NIR_PASS_V(nir, nir_lower_color_inputs); + NIR_PASS_V(nir, ac_nir_lower_subdword_loads, (ac_nir_lower_subdword_options) { .modes_1_comp = nir_var_mem_ubo,