From ed65e6ef49e17e9cae93a8f98e2968346de2bc6e Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Wed, 14 Sep 2016 10:29:38 -0700 Subject: nir: Add a flag to lower_io to force "sample" interpolation Signed-off-by: Jason Ekstrand Reviewed-by: Anuj Phogat Reviewed-by: Kenneth Graunke --- src/compiler/nir/nir_lower_io.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'src/compiler/nir/nir_lower_io.c') diff --git a/src/compiler/nir/nir_lower_io.c b/src/compiler/nir/nir_lower_io.c index b36836f6f76..d469b6180f8 100644 --- a/src/compiler/nir/nir_lower_io.c +++ b/src/compiler/nir/nir_lower_io.c @@ -39,6 +39,7 @@ struct lower_io_state { void *mem_ctx; int (*type_size)(const struct glsl_type *type); nir_variable_mode modes; + nir_lower_io_options options; }; void @@ -205,7 +206,8 @@ lower_load(nir_intrinsic_instr *intrin, struct lower_io_state *state, assert(vertex_index == NULL); nir_intrinsic_op bary_op; - if (var->data.sample) + if (var->data.sample || + (state->options & nir_lower_io_force_sample_interpolation)) bary_op = nir_intrinsic_load_barycentric_sample; else if (var->data.centroid) bary_op = nir_intrinsic_load_barycentric_centroid; @@ -347,7 +349,9 @@ lower_interpolate_at(nir_intrinsic_instr *intrin, struct lower_io_state *state, nir_intrinsic_op bary_op; switch (intrin->intrinsic) { case nir_intrinsic_interp_var_at_centroid: - bary_op = nir_intrinsic_load_barycentric_centroid; + bary_op = (state->options & nir_lower_io_force_sample_interpolation) ? + nir_intrinsic_load_barycentric_sample : + nir_intrinsic_load_barycentric_centroid; break; case nir_intrinsic_interp_var_at_sample: bary_op = nir_intrinsic_load_barycentric_at_sample; @@ -505,7 +509,8 @@ nir_lower_io_block(nir_block *block, static void nir_lower_io_impl(nir_function_impl *impl, nir_variable_mode modes, - int (*type_size)(const struct glsl_type *)) + int (*type_size)(const struct glsl_type *), + nir_lower_io_options options) { struct lower_io_state state; @@ -513,6 +518,7 @@ nir_lower_io_impl(nir_function_impl *impl, state.mem_ctx = ralloc_parent(impl); state.modes = modes; state.type_size = type_size; + state.options = options; nir_foreach_block(block, impl) { nir_lower_io_block(block, &state); @@ -524,11 +530,13 @@ nir_lower_io_impl(nir_function_impl *impl, void nir_lower_io(nir_shader *shader, nir_variable_mode modes, - int (*type_size)(const struct glsl_type *)) + int (*type_size)(const struct glsl_type *), + nir_lower_io_options options) { nir_foreach_function(function, shader) { - if (function->impl) - nir_lower_io_impl(function->impl, modes, type_size); + if (function->impl) { + nir_lower_io_impl(function->impl, modes, type_size, options); + } } } -- cgit v1.2.3