From: Timur Kristóf Date: Tue, 19 Feb 2019 09:11:36 +0000 (+0100) Subject: tgsi_to_nir: Improve interpolation modes. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=770faf546d14db6a8eced0da406e48a32fabf551;p=mesa.git tgsi_to_nir: Improve interpolation modes. This patch extracts the interpolation mode translation into a separate function called ttn_translate_interp_mode, adds support for TGSI_INTERPOLATE_COLOR which was missing, and also sets the proper interpolation mode to output variables, which were not set previously. Signed-Off-By: Timur Kristóf Tested-by: Andre Heider Tested-by: Rob Clark Reviewed-by: Timothy Arceri Reviewed-by: Eric Anholt --- diff --git a/src/gallium/auxiliary/nir/tgsi_to_nir.c b/src/gallium/auxiliary/nir/tgsi_to_nir.c index 7984cea5a7b..016e2b46f08 100644 --- a/src/gallium/auxiliary/nir/tgsi_to_nir.c +++ b/src/gallium/auxiliary/nir/tgsi_to_nir.c @@ -180,6 +180,23 @@ ttn_src_for_dest(nir_builder *b, nir_alu_dest *dest) return nir_fmov_alu(b, src, 4); } +static enum glsl_interp_mode +ttn_translate_interp_mode(unsigned tgsi_interp) +{ + switch (tgsi_interp) { + case TGSI_INTERPOLATE_CONSTANT: + return INTERP_MODE_FLAT; + case TGSI_INTERPOLATE_LINEAR: + return INTERP_MODE_NOPERSPECTIVE; + case TGSI_INTERPOLATE_PERSPECTIVE: + return INTERP_MODE_SMOOTH; + case TGSI_INTERPOLATE_COLOR: + return INTERP_MODE_SMOOTH; + default: + unreachable("bad TGSI interpolation mode"); + } +} + static void ttn_emit_declaration(struct ttn_compile *c) { @@ -314,21 +331,8 @@ ttn_emit_declaration(struct ttn_compile *c) var->data.location = VERT_ATTRIB_GENERIC0 + idx; } var->data.index = 0; - - /* We definitely need to translate the interpolation field, because - * nir_print will decode it. - */ - switch (decl->Interp.Interpolate) { - case TGSI_INTERPOLATE_CONSTANT: - var->data.interpolation = INTERP_MODE_FLAT; - break; - case TGSI_INTERPOLATE_LINEAR: - var->data.interpolation = INTERP_MODE_NOPERSPECTIVE; - break; - case TGSI_INTERPOLATE_PERSPECTIVE: - var->data.interpolation = INTERP_MODE_SMOOTH; - break; - } + var->data.interpolation = + ttn_translate_interp_mode(decl->Interp.Interpolate); exec_list_push_tail(&b->shader->inputs, &var->node); c->inputs[idx] = var; @@ -352,6 +356,8 @@ ttn_emit_declaration(struct ttn_compile *c) var->data.mode = nir_var_shader_out; var->name = ralloc_asprintf(var, "out_%d", idx); var->data.index = 0; + var->data.interpolation = + ttn_translate_interp_mode(decl->Interp.Interpolate); if (c->scan->processor == PIPE_SHADER_FRAGMENT) { switch (semantic_name) {