From a88532c612c49681b7622ce8a4afc7417c88694c Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Thu, 14 Dec 2017 10:14:34 +1100 Subject: [PATCH] st/glsl_to_nir: add patch support to st_nir_assign_var_locations() MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Tested-by: Dieter Nützel Reviewed-by: Marek Olšák --- 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 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; -- 2.30.2