nir: add linking helper nir_link_xfb_varyings()

The linking opts shouldn't try removing or compacting XFB varyings
in the consumer. To avoid this we copy the always_active_io flag
from the producer.

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
This commit is contained in:
Samuel Pitoiset
2018-10-23 21:56:29 +11:00
committed by Timothy Arceri
parent 0a7664fe8c
commit 7c694cbfa4
2 changed files with 34 additions and 0 deletions

View File

@@ -2799,6 +2799,7 @@ bool nir_remove_unused_io_vars(nir_shader *shader, struct exec_list *var_list,
uint64_t *used_by_other_stage_patches); uint64_t *used_by_other_stage_patches);
void nir_compact_varyings(nir_shader *producer, nir_shader *consumer, void nir_compact_varyings(nir_shader *producer, nir_shader *consumer,
bool default_to_smooth_interp); bool default_to_smooth_interp);
void nir_link_xfb_varyings(nir_shader *producer, nir_shader *consumer);
typedef enum { typedef enum {
/* If set, this forces all non-flat fragment shader inputs to be /* If set, this forces all non-flat fragment shader inputs to be

View File

@@ -523,3 +523,36 @@ nir_compact_varyings(nir_shader *producer, nir_shader *consumer,
compact_components(producer, consumer, comps, interp_type, interp_loc, compact_components(producer, consumer, comps, interp_type, interp_loc,
default_to_smooth_interp); default_to_smooth_interp);
} }
/*
* Mark XFB varyings as always_active_io in the consumer so the linking opts
* don't touch them.
*/
void
nir_link_xfb_varyings(nir_shader *producer, nir_shader *consumer)
{
nir_variable *input_vars[MAX_VARYING] = {};
nir_foreach_variable(var, &consumer->inputs) {
if (var->data.location >= VARYING_SLOT_VAR0 &&
var->data.location - VARYING_SLOT_VAR0 < MAX_VARYING) {
unsigned location = var->data.location - VARYING_SLOT_VAR0;
input_vars[location] = var;
}
}
nir_foreach_variable(var, &producer->outputs) {
if (var->data.location >= VARYING_SLOT_VAR0 &&
var->data.location - VARYING_SLOT_VAR0 < MAX_VARYING) {
if (!var->data.always_active_io)
continue;
unsigned location = var->data.location - VARYING_SLOT_VAR0;
if (input_vars[location]) {
input_vars[location]->data.always_active_io = true;
}
}
}
}