diff options
author | Jason Ekstrand <[email protected]> | 2018-03-20 22:10:58 -0700 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2018-06-22 20:15:56 -0700 |
commit | e786fcf77794ebf83d82a01c0b2f766346762eb7 (patch) | |
tree | ae98948d84ed62261a7cc2aef40cae40450b5ae7 /src | |
parent | 933c2851ab248358e3887f1afd7d228d34af625d (diff) |
nir: Support deref instructions in remove_unused_varyings
Reviewed-by: Caio Marcelo de Oliveira Filho <[email protected]>
Acked-by: Rob Clark <[email protected]>
Acked-by: Bas Nieuwenhuizen <[email protected]>
Acked-by: Dave Airlie <[email protected]>
Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/nir/nir_linking_helpers.c | 52 |
1 files changed, 27 insertions, 25 deletions
diff --git a/src/compiler/nir/nir_linking_helpers.c b/src/compiler/nir/nir_linking_helpers.c index 707bce12ef9..1a0cb910b80 100644 --- a/src/compiler/nir/nir_linking_helpers.c +++ b/src/compiler/nir/nir_linking_helpers.c @@ -62,29 +62,33 @@ static void tcs_add_output_reads(nir_shader *shader, uint64_t *read, uint64_t *patches_read) { nir_foreach_function(function, shader) { - if (function->impl) { - nir_foreach_block(block, function->impl) { - nir_foreach_instr(instr, block) { - if (instr->type != nir_instr_type_intrinsic) - continue; - - nir_intrinsic_instr *intrin_instr = - nir_instr_as_intrinsic(instr); - if (intrin_instr->intrinsic == nir_intrinsic_load_var && - intrin_instr->variables[0]->var->data.mode == - nir_var_shader_out) { - - nir_variable *var = intrin_instr->variables[0]->var; - if (var->data.patch) { - patches_read[var->data.location_frac] |= - get_variable_io_mask(intrin_instr->variables[0]->var, - shader->info.stage); - } else { - read[var->data.location_frac] |= - get_variable_io_mask(intrin_instr->variables[0]->var, - shader->info.stage); - } - } + if (!function->impl) + continue; + + nir_foreach_block(block, function->impl) { + nir_foreach_instr(instr, block) { + if (instr->type != nir_instr_type_intrinsic) + continue; + + nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr); + nir_variable *var; + if (intrin->intrinsic == nir_intrinsic_load_var) { + var = intrin->variables[0]->var; + } else if (intrin->intrinsic == nir_intrinsic_load_deref) { + var = nir_deref_instr_get_variable(nir_src_as_deref(intrin->src[0])); + } else { + continue; + } + + if (var->data.mode != nir_var_shader_out) + continue; + + if (var->data.patch) { + patches_read[var->data.location_frac] |= + get_variable_io_mask(var, shader->info.stage); + } else { + read[var->data.location_frac] |= + get_variable_io_mask(var, shader->info.stage); } } } @@ -133,8 +137,6 @@ nir_remove_unused_varyings(nir_shader *producer, nir_shader *consumer) { assert(producer->info.stage != MESA_SHADER_FRAGMENT); assert(consumer->info.stage != MESA_SHADER_VERTEX); - nir_assert_lowered_derefs(producer, nir_lower_load_store_derefs); - nir_assert_lowered_derefs(consumer, nir_lower_load_store_derefs); uint64_t read[4] = { 0 }, written[4] = { 0 }; uint64_t patches_read[4] = { 0 }, patches_written[4] = { 0 }; |