aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTimothy Arceri <[email protected]>2018-01-19 13:05:35 +1100
committerTimothy Arceri <[email protected]>2018-01-31 09:14:08 +1100
commit32187562623b78cc502eaa976a2933fa8a201cab (patch)
tree3240bae525d0efaf247e2068806116768027692b /src
parent93e213f91f64189ff5fe65844a9fe5b8c48366c2 (diff)
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 <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/compiler/nir/nir.h3
-rw-r--r--src/compiler/nir/nir_lower_io_arrays_to_elements.c22
-rw-r--r--src/mesa/state_tracker/st_glsl_to_nir.cpp2
3 files changed, 16 insertions, 11 deletions
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
index 4bb96c3c952..86d1c68fa72 100644
--- a/src/compiler/nir/nir.h
+++ b/src/compiler/nir/nir.h
@@ -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);
diff --git a/src/compiler/nir/nir_lower_io_arrays_to_elements.c b/src/compiler/nir/nir_lower_io_arrays_to_elements.c
index cdf9a76a881..9a5eec8f870 100644
--- a/src/compiler/nir/nir_lower_io_arrays_to_elements.c
+++ b/src/compiler/nir/nir_lower_io_arrays_to_elements.c
@@ -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,19 +361,22 @@ 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);
- lower_io_arrays_to_elements(shader, nir_var_shader_in, indirects,
- patch_indirects, split_inputs, true);
+ if (!outputs_only) {
+ lower_io_arrays_to_elements(shader, nir_var_shader_in, indirects,
+ patch_indirects, split_inputs, true);
- /* Remove old input from the shaders inputs list */
- struct hash_entry *entry;
- hash_table_foreach(split_inputs, entry) {
- nir_variable *var = (nir_variable *) entry->key;
- exec_node_remove(&var->node);
+ /* Remove old input from the shaders inputs list */
+ struct hash_entry *entry;
+ hash_table_foreach(split_inputs, entry) {
+ nir_variable *var = (nir_variable *) entry->key;
+ exec_node_remove(&var->node);
- free(entry->data);
+ 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);
diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp
index 6d3a7c78dcd..a3d447c5a41 100644
--- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
@@ -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: */