glsl: Make sure that packed varyings reflect always_active_io properly.
authorEric Anholt <eric@anholt.net>
Thu, 21 Jun 2018 23:39:15 +0000 (16:39 -0700)
committerEric Anholt <eric@anholt.net>
Wed, 27 Jun 2018 16:35:55 +0000 (09:35 -0700)
The always_active_io flag was only set according to the first variable
that got packed in, so NIR io compaction would end up compacting XFB
varyings that shouldn't move at that point.

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/glsl/lower_packed_varyings.cpp

index 5c1eed719f26d369922062660329e142eaf3a1f2..5bd6c92ed9922d6af33ff02db9b06e39932f481f 100644 (file)
@@ -729,12 +729,17 @@ lower_packed_varyings_visitor::get_packed_varying_deref(
       unpacked_var->insert_before(packed_var);
       this->packed_varyings[slot] = packed_var;
    } else {
+      ir_variable *var = this->packed_varyings[slot];
+
+      /* The slot needs to be marked as always active if any variable that got
+       * packed there was.
+       */
+      var->data.always_active_io |= unpacked_var->data.always_active_io;
+
       /* For geometry shader inputs, only update the packed variable name the
        * first time we visit each component.
        */
       if (this->gs_input_vertices == 0 || vertex_index == 0) {
-         ir_variable *var = this->packed_varyings[slot];
-
          if (var->is_name_ralloced())
             ralloc_asprintf_append((char **) &var->name, ",%s", name);
          else