From: Timothy Arceri Date: Wed, 13 Dec 2017 23:14:34 +0000 (+1100) Subject: st/glsl_to_nir: add patch support to st_nir_assign_var_locations() X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a88532c612c49681b7622ce8a4afc7417c88694c;p=mesa.git st/glsl_to_nir: add patch support to st_nir_assign_var_locations() Tested-by: Dieter Nützel Reviewed-by: Marek Olšák --- diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index b411621ab2c..276450a64ac 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -126,8 +126,9 @@ 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) { @@ -137,11 +138,24 @@ st_nir_assign_var_locations(struct exec_list *var_list, unsigned *size, 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; @@ -150,8 +164,6 @@ st_nir_assign_var_locations(struct exec_list *var_list, unsigned *size, 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;