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);
|
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
|
||||||
|
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user