diff --git a/src/compiler/nir/nir_linking_helpers.c b/src/compiler/nir/nir_linking_helpers.c index 3128ede2f15..d74cc6c8788 100644 --- a/src/compiler/nir/nir_linking_helpers.c +++ b/src/compiler/nir/nir_linking_helpers.c @@ -226,6 +226,18 @@ get_interp_loc(nir_variable *var) return INTERPOLATE_LOC_CENTER; } +static bool +is_packing_supported_for_type(const struct glsl_type *type) +{ + /* We ignore complex types such as arrays, matrices, structs and bitsizes + * other then 32bit. All other vector types should have been split into + * scalar variables by the lower_io_to_scalar pass. The only exception + * should be OpenGL xfb varyings. + * TODO: add support for more complex types? + */ + return glsl_type_is_scalar(type) && glsl_type_is_32bit(type); +} + static void get_slot_component_masks_and_interp_types(struct exec_list *var_list, uint8_t *comps, @@ -428,21 +440,7 @@ compact_components(nir_shader *producer, nir_shader *consumer, uint8_t *comps, type = glsl_get_array_element(type); } - /* Skip types that require more complex packing handling. - * TODO: add support for these types. - */ - if (glsl_type_is_array(type) || - glsl_type_is_dual_slot(type) || - glsl_type_is_matrix(type) || - glsl_type_is_struct(type) || - glsl_type_is_64bit(type)) - continue; - - /* We ignore complex types above and all other vector types should - * have been split into scalar variables by the lower_io_to_scalar - * pass. The only exception should by OpenGL xfb varyings. - */ - if (glsl_get_vector_elements(type) != 1) + if (!is_packing_supported_for_type(type)) continue; unsigned location = var->data.location - VARYING_SLOT_VAR0;