[Mesa-dev] [PATCH 02/15] nir: allow builin arrays to be lowered
Timothy Arceri
tarceri at itsqueeze.com
Wed Nov 22 10:29:49 UTC 2017
Galliums nir drivers expect this to be done.
---
src/compiler/nir/nir_lower_io_arrays_to_elements.c | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
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 29076bf79b..dfd8e85d96 100644
--- a/src/compiler/nir/nir_lower_io_arrays_to_elements.c
+++ b/src/compiler/nir/nir_lower_io_arrays_to_elements.c
@@ -249,21 +249,22 @@ create_indirects_mask(nir_shader *shader, uint64_t *indirects,
}
}
}
}
}
}
static void
lower_io_arrays_to_elements(nir_shader *shader, nir_variable_mode mask,
uint64_t *indirects, uint64_t *patch_indirects,
- struct hash_table *varyings)
+ struct hash_table *varyings,
+ bool after_cross_stage_opts)
{
nir_foreach_function(function, shader) {
if (function->impl) {
nir_builder b;
nir_builder_init(&b, function->impl);
nir_foreach_block(block, function->impl) {
nir_foreach_instr_safe(instr, block) {
if (instr->type != nir_instr_type_intrinsic)
continue;
@@ -298,28 +299,30 @@ lower_io_arrays_to_elements(nir_shader *shader, nir_variable_mode mask,
}
/* Skip types we cannot split.
*
* TODO: Add support for struct splitting.
*/
if ((!glsl_type_is_array(type) && !glsl_type_is_matrix(type))||
glsl_type_is_struct(glsl_without_array(type)))
continue;
- if (var->data.location < VARYING_SLOT_VAR0 &&
+ /* Skip builtins */
+ if (!after_cross_stage_opts &&
+ var->data.location < VARYING_SLOT_VAR0 &&
var->data.location >= 0)
continue;
/* Don't bother splitting if we can't opt away any unused
* elements.
*/
- if (var->data.always_active_io)
+ if (!after_cross_stage_opts && var->data.always_active_io)
continue;
switch (intr->intrinsic) {
case nir_intrinsic_interp_var_at_centroid:
case nir_intrinsic_interp_var_at_sample:
case nir_intrinsic_interp_var_at_offset:
case nir_intrinsic_load_var:
case nir_intrinsic_store_var:
if ((mask & nir_var_shader_in && mode == nir_var_shader_in) ||
(mask & nir_var_shader_out && mode == nir_var_shader_out))
@@ -340,24 +343,24 @@ nir_lower_io_arrays_to_elements_no_indirects(nir_shader *shader)
struct hash_table *split_inputs =
_mesa_hash_table_create(NULL, _mesa_hash_pointer,
_mesa_key_pointer_equal);
struct hash_table *split_outputs =
_mesa_hash_table_create(NULL, _mesa_hash_pointer,
_mesa_key_pointer_equal);
uint64_t indirects[4] = {0}, patch_indirects[4] = {0};
lower_io_arrays_to_elements(shader, nir_var_shader_out, indirects,
- patch_indirects, split_outputs);
+ patch_indirects, split_outputs, true);
lower_io_arrays_to_elements(shader, nir_var_shader_in, indirects,
- patch_indirects, split_inputs);
+ 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);
free(entry->data);
}
@@ -381,24 +384,24 @@ nir_lower_io_arrays_to_elements(nir_shader *producer, nir_shader *consumer)
_mesa_key_pointer_equal);
struct hash_table *split_outputs =
_mesa_hash_table_create(NULL, _mesa_hash_pointer,
_mesa_key_pointer_equal);
uint64_t indirects[4] = {0}, patch_indirects[4] = {0};
create_indirects_mask(producer, indirects, patch_indirects);
create_indirects_mask(consumer, indirects, patch_indirects);
lower_io_arrays_to_elements(producer, nir_var_shader_out, indirects,
- patch_indirects, split_outputs);
+ patch_indirects, split_outputs, false);
lower_io_arrays_to_elements(consumer, nir_var_shader_in, indirects,
- patch_indirects, split_inputs);
+ patch_indirects, split_inputs, false);
/* 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);
}
--
2.14.3
More information about the mesa-dev
mailing list