diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/state_tracker/st_glsl_to_nir.cpp | 22 |
1 files 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 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; |