--- 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