diff --git a/src/compiler/nir/nir_lower_io_arrays_to_elements.c b/src/compiler/nir/nir_lower_io_arrays_to_elements.c index 7f548c8b654..a0d0eb740db 100644 --- a/src/compiler/nir/nir_lower_io_arrays_to_elements.c +++ b/src/compiler/nir/nir_lower_io_arrays_to_elements.c @@ -212,8 +212,8 @@ deref_has_indirect(nir_builder *b, nir_variable *var, nir_deref_path *path) * indirect indexing. */ static void -create_indirects_mask(nir_shader *shader, uint64_t *indirects, - uint64_t *patch_indirects, nir_variable_mode mode) +create_indirects_mask(nir_shader *shader, + BITSET_WORD *indirects, nir_variable_mode mode) { nir_foreach_function(function, shader) { if (function->impl) { @@ -244,14 +244,9 @@ create_indirects_mask(nir_shader *shader, uint64_t *indirects, nir_deref_path path; nir_deref_path_init(&path, deref, NULL); - uint64_t loc_mask = ((uint64_t)1) << var->data.location; - if (var->data.patch) { - if (deref_has_indirect(&b, var, &path)) - patch_indirects[var->data.location_frac] |= loc_mask; - } else { - if (deref_has_indirect(&b, var, &path)) - indirects[var->data.location_frac] |= loc_mask; - } + int loc = var->data.location * 4 + var->data.location_frac; + if (deref_has_indirect(&b, var, &path)) + BITSET_SET(indirects, loc); nir_deref_path_finish(&path); } @@ -262,7 +257,7 @@ create_indirects_mask(nir_shader *shader, uint64_t *indirects, static void lower_io_arrays_to_elements(nir_shader *shader, nir_variable_mode mask, - uint64_t *indirects, uint64_t *patch_indirects, + BITSET_WORD *indirects, struct hash_table *varyings, bool after_cross_stage_opts) { @@ -296,14 +291,9 @@ lower_io_arrays_to_elements(nir_shader *shader, nir_variable_mode mask, continue; /* Skip indirects */ - uint64_t loc_mask = ((uint64_t)1) << var->data.location; - if (var->data.patch) { - if (patch_indirects[var->data.location_frac] & loc_mask) - continue; - } else { - if (indirects[var->data.location_frac] & loc_mask) - continue; - } + int loc = var->data.location * 4 + var->data.location_frac; + if (BITSET_TEST(indirects, loc)) + continue; nir_variable_mode mode = var->data.mode; @@ -359,14 +349,14 @@ nir_lower_io_arrays_to_elements_no_indirects(nir_shader *shader, struct hash_table *split_inputs = _mesa_pointer_hash_table_create(NULL); struct hash_table *split_outputs = _mesa_pointer_hash_table_create(NULL); - uint64_t indirects[4] = {0}, patch_indirects[4] = {0}; + BITSET_DECLARE(indirects, 4 * MAX_VARYINGS_INCL_PATCH) = {}; - lower_io_arrays_to_elements(shader, nir_var_shader_out, indirects, - patch_indirects, split_outputs, true); + lower_io_arrays_to_elements(shader, nir_var_shader_out, + indirects, split_outputs, true); if (!outputs_only) { - lower_io_arrays_to_elements(shader, nir_var_shader_in, indirects, - patch_indirects, split_inputs, true); + lower_io_arrays_to_elements(shader, nir_var_shader_in, + indirects, split_inputs, true); /* Remove old input from the shaders inputs list */ hash_table_foreach(split_inputs, entry) { @@ -397,17 +387,16 @@ nir_lower_io_arrays_to_elements(nir_shader *producer, nir_shader *consumer) struct hash_table *split_inputs = _mesa_pointer_hash_table_create(NULL); struct hash_table *split_outputs = _mesa_pointer_hash_table_create(NULL); - uint64_t indirects[4] = {0}, patch_indirects[4] = {0}; - create_indirects_mask(producer, indirects, patch_indirects, - nir_var_shader_out); - create_indirects_mask(consumer, indirects, patch_indirects, - nir_var_shader_in); + BITSET_DECLARE(indirects, 4 * MAX_VARYINGS_INCL_PATCH) = {}; - lower_io_arrays_to_elements(producer, nir_var_shader_out, indirects, - patch_indirects, split_outputs, false); + create_indirects_mask(producer, indirects, nir_var_shader_out); + create_indirects_mask(consumer, indirects, nir_var_shader_in); - lower_io_arrays_to_elements(consumer, nir_var_shader_in, indirects, - patch_indirects, split_inputs, false); + lower_io_arrays_to_elements(producer, nir_var_shader_out, + indirects, split_outputs, false); + + lower_io_arrays_to_elements(consumer, nir_var_shader_in, + indirects, split_inputs, false); /* Remove old input from the shaders inputs list */ hash_table_foreach(split_inputs, entry) {