nir: do not pack varying with different types
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 5 Apr 2019 09:26:12 +0000 (11:26 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 5 Apr 2019 11:57:42 +0000 (13:57 +0200)
The current algorithm only supports packing 32-bit types.
If a shader uses both 16-bit and 32-bit varyings, we shouldn't
compact them together.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/nir/nir_linking_helpers.c

index 146d4e4e5919990a61ee5ce99dbda04f4eff3f83..7594728e25e114679e40035baef09e5d6d419f50 100644 (file)
@@ -243,6 +243,7 @@ struct assigned_comps
    uint8_t comps;
    uint8_t interp_type;
    uint8_t interp_loc;
+   bool is_32bit;
 };
 
 /* Packing arrays and dual slot varyings is difficult so to avoid complex
@@ -308,6 +309,7 @@ get_unmoveable_components_masks(struct exec_list *var_list,
             comps[location + i].interp_type =
                get_interp_type(var, type, default_to_smooth_interp);
             comps[location + i].interp_loc = get_interp_loc(var);
+            comps[location + i].is_32bit = glsl_type_is_32bit(type);
          }
       }
    }
@@ -423,6 +425,7 @@ struct varying_component {
    nir_variable *var;
    uint8_t interp_type;
    uint8_t interp_loc;
+   bool is_32bit;
    bool is_patch;
    bool initialised;
 };
@@ -539,6 +542,7 @@ gather_varying_component_info(nir_shader *consumer,
             vc_info->interp_type =
                get_interp_type(in_var, type, default_to_smooth_interp);
             vc_info->interp_loc = get_interp_loc(in_var);
+            vc_info->is_32bit = glsl_type_is_32bit(type);
             vc_info->is_patch = in_var->data.patch;
          }
       }
@@ -572,6 +576,14 @@ assign_remap_locations(struct varying_loc (*remap)[4],
             continue;
          }
 
+         /* We can only pack varyings with matching types, and the current
+          * algorithm only supports packing 32-bit.
+          */
+         if (!assigned_comps[tmp_cursor].is_32bit) {
+            tmp_comp = 0;
+            continue;
+         }
+
          while (tmp_comp < 4 &&
                 (assigned_comps[tmp_cursor].comps & (1 << tmp_comp))) {
             tmp_comp++;
@@ -589,6 +601,7 @@ assign_remap_locations(struct varying_loc (*remap)[4],
       assigned_comps[tmp_cursor].comps |= (1 << tmp_comp);
       assigned_comps[tmp_cursor].interp_type = info->interp_type;
       assigned_comps[tmp_cursor].interp_loc = info->interp_loc;
+      assigned_comps[tmp_cursor].is_32bit = info->is_32bit;
 
       /* Assign remap location */
       remap[location][info->var->data.location_frac].component = tmp_comp++;