X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fnir%2Fnir_linking_helpers.c;h=faf8a1eaced149b7efac864745da22dd5b13203b;hb=a8b0b6e52b095f03c96a72394d15327c42512815;hp=f4494c78f9850fe5e67f4d9c56c83d95800f158d;hpb=8f74a60c43af119ae751181a58d6c0943c18be30;p=mesa.git diff --git a/src/compiler/nir/nir_linking_helpers.c b/src/compiler/nir/nir_linking_helpers.c index f4494c78f98..faf8a1eaced 100644 --- a/src/compiler/nir/nir_linking_helpers.c +++ b/src/compiler/nir/nir_linking_helpers.c @@ -59,6 +59,15 @@ get_variable_io_mask(nir_variable *var, gl_shader_stage stage) return ((1ull << slots) - 1) << location; } +static uint8_t +get_num_components(nir_variable *var) +{ + if (glsl_type_is_struct_or_ifc(glsl_without_array(var->type))) + return 4; + + return glsl_get_vector_elements(glsl_without_array(var->type)); +} + static void tcs_add_output_reads(nir_shader *shader, uint64_t *read, uint64_t *patches_read) { @@ -80,12 +89,14 @@ tcs_add_output_reads(nir_shader *shader, uint64_t *read, uint64_t *patches_read) continue; nir_variable *var = nir_deref_instr_get_variable(deref); - if (var->data.patch) { - patches_read[var->data.location_frac] |= - get_variable_io_mask(var, shader->info.stage); - } else { - read[var->data.location_frac] |= - get_variable_io_mask(var, shader->info.stage); + for (unsigned i = 0; i < get_num_components(var); i++) { + if (var->data.patch) { + patches_read[var->data.location_frac + i] |= + get_variable_io_mask(var, shader->info.stage); + } else { + read[var->data.location_frac + i] |= + get_variable_io_mask(var, shader->info.stage); + } } } } @@ -161,22 +172,26 @@ nir_remove_unused_varyings(nir_shader *producer, nir_shader *consumer) uint64_t patches_read[4] = { 0 }, patches_written[4] = { 0 }; nir_foreach_variable(var, &producer->outputs) { - if (var->data.patch) { - patches_written[var->data.location_frac] |= - get_variable_io_mask(var, producer->info.stage); - } else { - written[var->data.location_frac] |= - get_variable_io_mask(var, producer->info.stage); + for (unsigned i = 0; i < get_num_components(var); i++) { + if (var->data.patch) { + patches_written[var->data.location_frac + i] |= + get_variable_io_mask(var, producer->info.stage); + } else { + written[var->data.location_frac + i] |= + get_variable_io_mask(var, producer->info.stage); + } } } nir_foreach_variable(var, &consumer->inputs) { - if (var->data.patch) { - patches_read[var->data.location_frac] |= - get_variable_io_mask(var, consumer->info.stage); - } else { - read[var->data.location_frac] |= - get_variable_io_mask(var, consumer->info.stage); + for (unsigned i = 0; i < get_num_components(var); i++) { + if (var->data.patch) { + patches_read[var->data.location_frac + i] |= + get_variable_io_mask(var, consumer->info.stage); + } else { + read[var->data.location_frac + i] |= + get_variable_io_mask(var, consumer->info.stage); + } } } @@ -461,7 +476,7 @@ gather_varying_component_info(nir_shader *consumer, unsigned *varying_comp_info_size, bool default_to_smooth_interp) { - unsigned store_varying_info_idx[MAX_VARYINGS_INCL_PATCH][4] = {0}; + unsigned store_varying_info_idx[MAX_VARYINGS_INCL_PATCH][4] = {{0}}; unsigned num_of_comps_to_pack = 0; /* Count the number of varying that can be packed and create a mapping @@ -711,7 +726,7 @@ nir_compact_varyings(nir_shader *producer, nir_shader *consumer, assert(producer->info.stage != MESA_SHADER_FRAGMENT); assert(consumer->info.stage != MESA_SHADER_VERTEX); - struct assigned_comps assigned_comps[MAX_VARYINGS_INCL_PATCH] = {0}; + struct assigned_comps assigned_comps[MAX_VARYINGS_INCL_PATCH] = {{0}}; get_unmoveable_components_masks(&producer->outputs, assigned_comps, producer->info.stage,