summaryrefslogtreecommitdiffstats
path: root/src/compiler/nir/nir_lower_clip.c
diff options
context:
space:
mode:
authorConnor Abbott <[email protected]>2016-04-08 15:47:40 -0400
committerJason Ekstrand <[email protected]>2016-04-28 15:52:17 -0700
commit686f247b2100d197322c698005e029135627faf9 (patch)
tree19b9163236124599f5b14eb159d6df53e7b2c60d /src/compiler/nir/nir_lower_clip.c
parente36fbcfc3ffb5d152c4f65d41ad5c5bce53a995a (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.c50
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;
}
/*