From: Jason Ekstrand Date: Wed, 14 Sep 2016 17:39:52 +0000 (-0700) Subject: i965/fs: Use NIR for handling forced per-sample interpolation X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=246db0063eb6e01aad961b1c73d32fca911ae1df;p=mesa.git i965/fs: Use NIR for handling forced per-sample interpolation Signed-off-by: Jason Ekstrand Reviewed-by: Anuj Phogat Reviewed-by: Kenneth Graunke --- diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 2283cffb83b..6deca2621e3 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -6378,8 +6378,7 @@ move_interpolation_to_top(nir_shader *nir) static void brw_nir_set_default_interpolation(const struct gen_device_info *devinfo, struct nir_shader *nir, - bool api_flat_shade, - bool per_sample_interpolation) + bool api_flat_shade) { assert(nir->stage == MESA_SHADER_FRAGMENT); @@ -6398,13 +6397,6 @@ brw_nir_set_default_interpolation(const struct gen_device_info *devinfo, : INTERP_MODE_SMOOTH; } - /* Apply 'sample' if necessary for API state. */ - if (per_sample_interpolation && - var->data.interpolation != INTERP_MODE_FLAT) { - var->data.centroid = false; - var->data.sample = true; - } - /* On Ironlake and below, there is only one interpolation mode. * Centroid interpolation doesn't mean anything on this hardware -- * there is no multisampling. @@ -6414,32 +6406,6 @@ brw_nir_set_default_interpolation(const struct gen_device_info *devinfo, var->data.sample = false; } } - - if (per_sample_interpolation) { - nir_foreach_block(block, nir_shader_get_entrypoint(nir)) { - nir_foreach_instr(instr, block) { - if (instr->type != nir_instr_type_intrinsic) - continue; - - nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr); - if (intrin->intrinsic != nir_intrinsic_interp_var_at_centroid) - continue; - - nir_variable *var = intrin->variables[0]->var; - if (var->data.interpolation == INTERP_MODE_FLAT) - continue; - - /* The description of the interpolateAtCentroid intrinsic is that - * it interpolates the variable as if it had the "centroid" - * qualifier. When executing with per_sample_interpolation, this - * is equivalent to having the "sample" qualifier. Just convert - * it to a load_var instead. - */ - assert(var->data.sample); - intrin->intrinsic = nir_intrinsic_load_var; - } - } - } } /** @@ -6500,8 +6466,8 @@ brw_compile_fs(const struct brw_compiler *compiler, void *log_data, shader = brw_nir_apply_sampler_key(shader, compiler->devinfo, &key->tex, true); brw_nir_set_default_interpolation(compiler->devinfo, shader, - key->flat_shade, key->persample_interp); - brw_nir_lower_fs_inputs(shader); + key->flat_shade); + brw_nir_lower_fs_inputs(shader, key); brw_nir_lower_fs_outputs(shader); if (!key->multisample_fbo) NIR_PASS_V(shader, demote_sample_qualifiers); diff --git a/src/mesa/drivers/dri/i965/brw_nir.c b/src/mesa/drivers/dri/i965/brw_nir.c index b4c1cf1a214..9fdfa4d79cb 100644 --- a/src/mesa/drivers/dri/i965/brw_nir.c +++ b/src/mesa/drivers/dri/i965/brw_nir.c @@ -281,13 +281,18 @@ brw_nir_lower_tes_inputs(nir_shader *nir, const struct brw_vue_map *vue_map) } void -brw_nir_lower_fs_inputs(nir_shader *nir) +brw_nir_lower_fs_inputs(nir_shader *nir, + const struct brw_wm_prog_key *key) { foreach_list_typed(nir_variable, var, node, &nir->inputs) { var->data.driver_location = var->data.location; } - nir_lower_io(nir, nir_var_shader_in, type_size_vec4, 0); + nir_lower_io_options lower_io_options = 0; + if (key->persample_interp) + lower_io_options |= nir_lower_io_force_sample_interpolation; + + nir_lower_io(nir, nir_var_shader_in, type_size_vec4, lower_io_options); /* This pass needs actual constants */ nir_opt_constant_folding(nir); diff --git a/src/mesa/drivers/dri/i965/brw_nir.h b/src/mesa/drivers/dri/i965/brw_nir.h index b025d55a135..51d2f630903 100644 --- a/src/mesa/drivers/dri/i965/brw_nir.h +++ b/src/mesa/drivers/dri/i965/brw_nir.h @@ -106,7 +106,8 @@ void brw_nir_lower_vs_inputs(nir_shader *nir, void brw_nir_lower_vue_inputs(nir_shader *nir, bool is_scalar, const struct brw_vue_map *vue_map); void brw_nir_lower_tes_inputs(nir_shader *nir, const struct brw_vue_map *vue); -void brw_nir_lower_fs_inputs(nir_shader *nir); +void brw_nir_lower_fs_inputs(nir_shader *nir, + const struct brw_wm_prog_key *key); void brw_nir_lower_vue_outputs(nir_shader *nir, bool is_scalar); void brw_nir_lower_tcs_outputs(nir_shader *nir, const struct brw_vue_map *vue); void brw_nir_lower_fs_outputs(nir_shader *nir);