diff options
author | Jason Ekstrand <[email protected]> | 2014-10-30 21:04:15 -0700 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2015-01-15 07:19:00 -0800 |
commit | 366181d826219b50ae74a5d5db49e885f3bb7c4e (patch) | |
tree | 8d391714b575e6d702ad2ba9d0b31f3d718fcb5b /src/glsl/nir/nir.c | |
parent | 7de6b7fc3ecd771c11acab251d3c432ea680b811 (diff) |
nir: Add a parallel copy instruction type
Reviewed-by: Connor Abbott <[email protected]>
Diffstat (limited to 'src/glsl/nir/nir.c')
-rw-r--r-- | src/glsl/nir/nir.c | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/src/glsl/nir/nir.c b/src/glsl/nir/nir.c index 4100f9770cc..b64ec4073a4 100644 --- a/src/glsl/nir/nir.c +++ b/src/glsl/nir/nir.c @@ -481,6 +481,18 @@ nir_phi_instr_create(void *mem_ctx) return instr; } +nir_parallel_copy_instr * +nir_parallel_copy_instr_create(void *mem_ctx) +{ + nir_parallel_copy_instr *instr = ralloc(mem_ctx, nir_parallel_copy_instr); + instr_init(&instr->instr, nir_instr_type_parallel_copy); + + instr->at_end = false; + exec_list_make_empty(&instr->copies); + + return instr; +} + nir_ssa_undef_instr * nir_ssa_undef_instr_create(void *mem_ctx) { @@ -1383,6 +1395,18 @@ visit_phi_dest(nir_phi_instr *instr, nir_foreach_dest_cb cb, void *state) return cb(&instr->dest, state); } +static bool +visit_parallel_copy_dest(nir_parallel_copy_instr *instr, + nir_foreach_dest_cb cb, void *state) +{ + foreach_list_typed(nir_parallel_copy_copy, copy, node, &instr->copies) { + if (!cb(©->dest, state)) + return false; + } + + return true; +} + bool nir_foreach_dest(nir_instr *instr, nir_foreach_dest_cb cb, void *state) { @@ -1397,7 +1421,9 @@ nir_foreach_dest(nir_instr *instr, nir_foreach_dest_cb cb, void *state) return visit_load_const_dest(nir_instr_as_load_const(instr), cb, state); case nir_instr_type_phi: return visit_phi_dest(nir_instr_as_phi(instr), cb, state); - break; + case nir_instr_type_parallel_copy: + return visit_parallel_copy_dest(nir_instr_as_parallel_copy(instr), + cb, state); case nir_instr_type_ssa_undef: case nir_instr_type_call: @@ -1532,6 +1558,18 @@ visit_phi_src(nir_phi_instr *instr, nir_foreach_src_cb cb, void *state) return true; } +static bool +visit_parallel_copy_src(nir_parallel_copy_instr *instr, + nir_foreach_src_cb cb, void *state) +{ + foreach_list_typed(nir_parallel_copy_copy, copy, node, &instr->copies) { + if (!visit_src(©->src, cb, state)) + return false; + } + + return true; +} + typedef struct { void *state; nir_foreach_src_cb cb; @@ -1576,6 +1614,11 @@ nir_foreach_src(nir_instr *instr, nir_foreach_src_cb cb, void *state) if (!visit_phi_src(nir_instr_as_phi(instr), cb, state)) return false; break; + case nir_instr_type_parallel_copy: + if (!visit_parallel_copy_src(nir_instr_as_parallel_copy(instr), + cb, state)) + return false; + break; case nir_instr_type_jump: case nir_instr_type_ssa_undef: return true; |