We shouldn't try to compact any varyings known as always
active IO, especially XFB outputs. For example, if one
component of an xfb output is also used as input varying
in the next stage, it shouldn't be compacted.

This small helper just marks all XFB varyings as always_active_io
in the consumer to not compact them.

v2: add a little helper

Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com>
---
 src/compiler/nir/nir_linking_helpers.c | 33 ++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/src/compiler/nir/nir_linking_helpers.c 
b/src/compiler/nir/nir_linking_helpers.c
index 88014e9a1d..433729bd79 100644
--- a/src/compiler/nir/nir_linking_helpers.c
+++ b/src/compiler/nir/nir_linking_helpers.c
@@ -480,6 +480,36 @@ compact_components(nir_shader *producer, nir_shader 
*consumer, uint8_t *comps,
                               &producer->info.outputs_read);
 }
 
+/* Mark XFB varyings as always_active_io in the consumer to not compact them. 
*/
+static void
+link_xfb_varyings(nir_shader *producer, nir_shader *consumer)
+{
+   nir_variable *input_vars[32] = {};
+
+   nir_foreach_variable(var, &consumer->inputs) {
+      if (var->data.location >= VARYING_SLOT_VAR0 &&
+          var->data.location - VARYING_SLOT_VAR0 < 32) {
+
+         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 < 32) {
+
+         if (!var->data.explicit_xfb_buffer)
+            continue;
+
+         unsigned location = var->data.location - VARYING_SLOT_VAR0;
+         if (input_vars[location]) {
+            input_vars[location]->data.always_active_io = true;
+         }
+      }
+   }
+}
+
 /* We assume that this has been called more-or-less directly after
  * remove_unused_varyings.  At this point, all of the varyings that we
  * aren't going to be using have been completely removed and the
@@ -501,6 +531,9 @@ nir_compact_varyings(nir_shader *producer, nir_shader 
*consumer,
    uint8_t interp_type[32] = {0};
    uint8_t interp_loc[32] = {0};
 
+   if (producer->info.has_transform_feedback_varyings)
+      link_xfb_varyings(producer, consumer);
+
    get_slot_component_masks_and_interp_types(&producer->outputs, comps,
                                              interp_type, interp_loc,
                                              producer->info.stage,
-- 
2.19.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to