diff options
author | Eric Anholt <[email protected]> | 2016-08-19 17:12:12 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2016-08-22 12:11:05 -0700 |
commit | d08f09c24e68c048f79500abe7f89e94960b55d2 (patch) | |
tree | 9909ff8779b063a2ffef74b162bf9631b70f1dbf /src | |
parent | 3ef1853f7d75eb5235dc1a425374b67c42a4eb65 (diff) |
st/nir: Trim out unused VS input variables.
If we're going to skip setting up vertex input data in them, we should
probably not leave them as vertex inputs with a driver_location that
happens to alias to something else.
Fixes a regression in glsl-mat-attribute on vc4 when enabling GTN.
v2: Change commit message shortlog, lower the new globals away before
handing off to the driver.
Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/state_tracker/st_glsl_to_nir.cpp | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 73a692a5025..be2d5b2ff0f 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -73,8 +73,7 @@ st_nir_fixup_varying_slots(struct st_context *st, struct exec_list *var_list) * on varying-slot w/ the VS outputs) */ static void -st_nir_assign_vs_in_locations(struct gl_program *prog, - struct exec_list *var_list, unsigned *size) +st_nir_assign_vs_in_locations(struct gl_program *prog, nir_shader *nir) { unsigned attr, num_inputs = 0; unsigned input_to_index[VERT_ATTRIB_MAX] = {0}; @@ -88,15 +87,29 @@ st_nir_assign_vs_in_locations(struct gl_program *prog, /* add placeholder for second part of a double attribute */ num_inputs++; } + } else { + input_to_index[attr] = ~0; } } - *size = 0; - nir_foreach_variable(var, var_list) { + nir->num_inputs = 0; + nir_foreach_variable_safe(var, &nir->inputs) { attr = var->data.location; assert(attr < ARRAY_SIZE(input_to_index)); - var->data.driver_location = input_to_index[attr]; - (*size)++; + + if (input_to_index[attr] != ~0u) { + var->data.driver_location = input_to_index[attr]; + nir->num_inputs++; + } else { + /* Move unused input variables to the globals list (with no + * initialization), to avoid confusing drivers looking through the + * inputs array and expecting to find inputs with a driver_location + * set. + */ + exec_node_remove(&var->node); + var->data.mode = nir_var_global; + exec_list_push_tail(&nir->globals, &var->node); + } } } @@ -304,7 +317,10 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog, nir_shader *nir) if (nir->stage == MESA_SHADER_VERTEX) { /* Needs special handling so drvloc matches the vbo state: */ - st_nir_assign_vs_in_locations(prog, &nir->inputs, &nir->num_inputs); + st_nir_assign_vs_in_locations(prog, nir); + /* Re-lower global vars, to deal with any dead VS inputs. */ + NIR_PASS_V(nir, nir_lower_global_vars_to_local); + sort_varyings(&nir->outputs); nir_assign_var_locations(&nir->outputs, &nir->num_outputs, |