nir: add linking helper nir_link_xfb_varyings()
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Tue, 23 Oct 2018 10:56:29 +0000 (21:56 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Tue, 23 Oct 2018 21:21:29 +0000 (08:21 +1100)
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>
src/compiler/nir/nir.h
src/compiler/nir/nir_linking_helpers.c

index 0ba19cbb25da112f8fe3c309700d9e79625210ed..60ea4fbc7ffb21b7a9253924abf6ec2dce36eadc 100644 (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);
 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
index 85677b7c176a92b14785743d057f396f20c799f8..ca46a6b71b02e99bf960ff7a2066c56c8efd760d 100644 (file)
@@ -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;
+         }
+      }
+   }
+}