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:

committed by
Timothy Arceri

parent
0a7664fe8c
commit
7c694cbfa4
@@ -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);
|
||||
void nir_compact_varyings(nir_shader *producer, nir_shader *consumer,
|
||||
bool default_to_smooth_interp);
|
||||
void nir_link_xfb_varyings(nir_shader *producer, nir_shader *consumer);
|
||||
|
||||
typedef enum {
|
||||
/* If set, this forces all non-flat fragment shader inputs to be
|
||||
|
@@ -523,3 +523,36 @@ nir_compact_varyings(nir_shader *producer, nir_shader *consumer,
|
||||
compact_components(producer, consumer, comps, interp_type, interp_loc,
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user