diff options
author | Timothy Arceri <[email protected]> | 2017-12-14 10:14:34 +1100 |
---|---|---|
committer | Timothy Arceri <[email protected]> | 2017-12-27 11:26:08 +1100 |
commit | a88532c612c49681b7622ce8a4afc7417c88694c (patch) | |
tree | 83b4b38139e998a24bab7362c3c1d9fb555230d4 | |
parent | 351eee05d346a8d226ecb6a5ab0a0e7d5b49aa66 (diff) |
st/glsl_to_nir: add patch support to st_nir_assign_var_locations()
Tested-by: Dieter Nützel <[email protected]>
Reviewed-by: Marek Olšák <[email protected]>
-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; |