nir/st_glsl_to_nir: add param to disable splitting of inputs

We need this because we will always copy fs outputs to temps and
split the arrays, but do not want to do either of these with fs
inputs as it is unnessisary and makes handling interpolateAt
builtins difficult.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Timothy Arceri
2018-01-19 13:05:35 +11:00
parent 93e213f91f
commit 3218756262
3 changed files with 16 additions and 11 deletions

View File

@@ -2522,7 +2522,8 @@ bool nir_lower_load_const_to_scalar(nir_shader *shader);
bool nir_lower_read_invocation_to_scalar(nir_shader *shader);
bool nir_lower_phis_to_scalar(nir_shader *shader);
void nir_lower_io_arrays_to_elements(nir_shader *producer, nir_shader *consumer);
void nir_lower_io_arrays_to_elements_no_indirects(nir_shader *shader);
void nir_lower_io_arrays_to_elements_no_indirects(nir_shader *shader,
bool outputs_only);
void nir_lower_io_to_scalar(nir_shader *shader, nir_variable_mode mask);
void nir_lower_io_to_scalar_early(nir_shader *shader, nir_variable_mode mask);

View File

@@ -346,7 +346,8 @@ lower_io_arrays_to_elements(nir_shader *shader, nir_variable_mode mask,
}
void
nir_lower_io_arrays_to_elements_no_indirects(nir_shader *shader)
nir_lower_io_arrays_to_elements_no_indirects(nir_shader *shader,
bool outputs_only)
{
struct hash_table *split_inputs =
_mesa_hash_table_create(NULL, _mesa_hash_pointer,
@@ -360,6 +361,7 @@ nir_lower_io_arrays_to_elements_no_indirects(nir_shader *shader)
lower_io_arrays_to_elements(shader, nir_var_shader_out, indirects,
patch_indirects, split_outputs, true);
if (!outputs_only) {
lower_io_arrays_to_elements(shader, nir_var_shader_in, indirects,
patch_indirects, split_inputs, true);
@@ -371,8 +373,10 @@ nir_lower_io_arrays_to_elements_no_indirects(nir_shader *shader)
free(entry->data);
}
}
/* Remove old output from the shaders outputs list */
struct hash_entry *entry;
hash_table_foreach(split_outputs, entry) {
nir_variable *var = (nir_variable *) entry->key;
exec_node_remove(&var->node);

View File

@@ -660,7 +660,7 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog,
NIR_PASS_V(nir, nir_lower_var_copies);
if (nir->info.stage != MESA_SHADER_TESS_CTRL &&
nir->info.stage != MESA_SHADER_TESS_EVAL)
NIR_PASS_V(nir, nir_lower_io_arrays_to_elements_no_indirects);
NIR_PASS_V(nir, nir_lower_io_arrays_to_elements_no_indirects, false);
if (nir->info.stage == MESA_SHADER_VERTEX) {
/* Needs special handling so drvloc matches the vbo state: */