diff options
author | Timothy Arceri <[email protected]> | 2018-12-10 09:42:42 +1100 |
---|---|---|
committer | Timothy Arceri <[email protected]> | 2019-02-08 02:54:56 +0000 |
commit | 2f532604173d9c9a35f57120cdb2c2ec8447b6d6 (patch) | |
tree | 17fd41b77ae67af22e36e2e4bb9ea5f25ea0d3a7 /src | |
parent | e041123841385d308b1cdd91d8f83d1633cd31a8 (diff) |
nir: add is_packing_supported_for_type() helper
This will be used in the following patches to determine if we
support packing the components of a varying.
Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/nir/nir_linking_helpers.c | 28 |
1 files changed, 13 insertions, 15 deletions
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; |