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 <timur.kristof@gmail.com> Tested-by: Andre Heider <a.heider@gmail.com> Tested-by: Rob Clark <robdclark@gmail.com> Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com> Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:

committed by
Eric Anholt

parent
2fb800fd1d
commit
770faf546d
@@ -180,6 +180,23 @@ ttn_src_for_dest(nir_builder *b, nir_alu_dest *dest)
|
|||||||
return nir_fmov_alu(b, src, 4);
|
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
|
static void
|
||||||
ttn_emit_declaration(struct ttn_compile *c)
|
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.location = VERT_ATTRIB_GENERIC0 + idx;
|
||||||
}
|
}
|
||||||
var->data.index = 0;
|
var->data.index = 0;
|
||||||
|
var->data.interpolation =
|
||||||
/* We definitely need to translate the interpolation field, because
|
ttn_translate_interp_mode(decl->Interp.Interpolate);
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
exec_list_push_tail(&b->shader->inputs, &var->node);
|
exec_list_push_tail(&b->shader->inputs, &var->node);
|
||||||
c->inputs[idx] = var;
|
c->inputs[idx] = var;
|
||||||
@@ -352,6 +356,8 @@ ttn_emit_declaration(struct ttn_compile *c)
|
|||||||
var->data.mode = nir_var_shader_out;
|
var->data.mode = nir_var_shader_out;
|
||||||
var->name = ralloc_asprintf(var, "out_%d", idx);
|
var->name = ralloc_asprintf(var, "out_%d", idx);
|
||||||
var->data.index = 0;
|
var->data.index = 0;
|
||||||
|
var->data.interpolation =
|
||||||
|
ttn_translate_interp_mode(decl->Interp.Interpolate);
|
||||||
|
|
||||||
if (c->scan->processor == PIPE_SHADER_FRAGMENT) {
|
if (c->scan->processor == PIPE_SHADER_FRAGMENT) {
|
||||||
switch (semantic_name) {
|
switch (semantic_name) {
|
||||||
|
Reference in New Issue
Block a user