Reviewed-by: Marek Olšák <marek.ol...@amd.com> Marek
On Thu, Dec 14, 2017 at 12:14 AM, Timothy Arceri <tarc...@itsqueeze.com> wrote: > --- > src/mesa/state_tracker/st_glsl_to_nir.cpp | 22 +++++++++++++++++----- > 1 file changed, 17 insertions(+), 5 deletions(-) > > diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp > b/src/mesa/state_tracker/st_glsl_to_nir.cpp > index 70c5daaa225..be34031bfb5 100644 > --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp > +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp > @@ -119,46 +119,58 @@ st_nir_assign_vs_in_locations(struct gl_program *prog, > nir_shader *nir) > exec_list_push_tail(&nir->globals, &var->node); > } > } > } > > static void > st_nir_assign_var_locations(struct exec_list *var_list, unsigned *size, > gl_shader_stage stage) > { > unsigned location = 0; > - unsigned assigned_locations[VARYING_SLOT_MAX]; > + unsigned assigned_locations[VARYING_SLOT_TESS_MAX]; > uint64_t processed_locs = 0; > + uint32_t processed_patch_locs = 0; > > nir_foreach_variable(var, var_list) { > > const struct glsl_type *type = var->type; > if (nir_is_per_vertex_io(var, stage)) { > assert(glsl_type_is_array(type)); > type = glsl_get_array_element(type); > } > > + bool processed = false; > + if (var->data.patch) { > + unsigned patch_loc = var->data.location - VARYING_SLOT_VAR0; > + if (processed_patch_locs & (1 << patch_loc)) > + processed = true; > + > + processed_patch_locs |= (1 << patch_loc); > + } else { > + if (processed_locs & ((uint64_t)1 << var->data.location)) > + processed = true; > + > + processed_locs |= ((uint64_t)1 << var->data.location); > + } > + > /* Because component packing allows varyings to share the same location > * we may have already have processed this location. > */ > - if (var->data.location >= VARYING_SLOT_VAR0 && > - processed_locs & ((uint64_t)1 << var->data.location)) { > + if (processed && var->data.location >= VARYING_SLOT_VAR0) { > var->data.driver_location = assigned_locations[var->data.location]; > *size += type_size(type); > continue; > } > > assigned_locations[var->data.location] = location; > var->data.driver_location = location; > location += type_size(type); > - > - processed_locs |= ((uint64_t)1 << var->data.location); > } > > *size += location; > } > > static int > st_nir_lookup_parameter_index(const struct gl_program_parameter_list *params, > const char *name) > { > int loc = _mesa_lookup_parameter_index(params, name); > -- > 2.14.3 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev