diff options
author | Connor Abbott <[email protected]> | 2016-04-08 15:47:40 -0400 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2016-04-28 15:52:17 -0700 |
commit | 686f247b2100d197322c698005e029135627faf9 (patch) | |
tree | 19b9163236124599f5b14eb159d6df53e7b2c60d /src/compiler/nir/nir_lower_clip.c | |
parent | e36fbcfc3ffb5d152c4f65d41ad5c5bce53a995a (diff) |
nir/lower_clip: fixup for new foreach_block()
Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src/compiler/nir/nir_lower_clip.c')
-rw-r--r-- | src/compiler/nir/nir_lower_clip.c | 50 |
1 files changed, 21 insertions, 29 deletions
diff --git a/src/compiler/nir/nir_lower_clip.c b/src/compiler/nir/nir_lower_clip.c index 8437d2d775f..5d949de1c45 100644 --- a/src/compiler/nir/nir_lower_clip.c +++ b/src/compiler/nir/nir_lower_clip.c @@ -97,40 +97,23 @@ load_clipdist_input(nir_builder *b, nir_variable *in, nir_ssa_def **val) val[3] = nir_channel(b, &load->dest.ssa, 3); } -struct find_output_state -{ - unsigned drvloc; - nir_ssa_def *def; -}; - -static bool -find_output_in_block(nir_block *block, void *void_state) +static nir_ssa_def * +find_output_in_block(nir_block *block, unsigned drvloc) { - struct find_output_state *state = void_state; nir_foreach_instr(block, instr) { if (instr->type == nir_instr_type_intrinsic) { nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); if ((intr->intrinsic == nir_intrinsic_store_output) && - nir_intrinsic_base(intr) == state->drvloc) { - assert(state->def == NULL); + nir_intrinsic_base(intr) == drvloc) { assert(intr->src[0].is_ssa); assert(nir_src_as_const_value(intr->src[1])); - state->def = intr->src[0].ssa; - -#if !defined(DEBUG) - /* for debug builds, scan entire shader to assert - * if output is written multiple times. For release - * builds just assume all is well and bail when we - * find first: - */ - return false; -#endif + return intr->src[0].ssa; } } } - return true; + return NULL; } /* TODO: maybe this would be a useful helper? @@ -140,18 +123,27 @@ find_output_in_block(nir_block *block, void *void_state) static nir_ssa_def * find_output(nir_shader *shader, unsigned drvloc) { - struct find_output_state state = { - .drvloc = drvloc, - }; - + nir_ssa_def *def = NULL; nir_foreach_function(shader, function) { if (function->impl) { - nir_foreach_block_reverse_call(function->impl, - find_output_in_block, &state); + nir_foreach_block_reverse(block, function->impl) { + nir_ssa_def *new_def = find_output_in_block(block, drvloc); + assert(!(new_def && def)); + def = new_def; +#if !defined(DEBUG) + /* for debug builds, scan entire shader to assert + * if output is written multiple times. For release + * builds just assume all is well and bail when we + * find first: + */ + if (def) + break; +#endif + } } } - return state.def; + return def; } /* |