On Wed, Dec 17, 2014 at 2:35 PM, Connor Abbott <cwabbo...@gmail.com> wrote: > > On Tue, Dec 16, 2014 at 1:05 AM, Jason Ekstrand <ja...@jlekstrand.net> > wrote: > > --- > > src/glsl/nir/nir.c | 45 > ++++++++++++++++++++++++++++++++++++++++++++- > > src/glsl/nir/nir.h | 23 +++++++++++++++++++++++ > > src/glsl/nir/nir_print.c | 21 +++++++++++++++++++++ > > 3 files changed, 88 insertions(+), 1 deletion(-) > > > > diff --git a/src/glsl/nir/nir.c b/src/glsl/nir/nir.c > > index 27e903e..d3fd084 100644 > > --- a/src/glsl/nir/nir.c > > +++ b/src/glsl/nir/nir.c > > @@ -475,6 +475,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) > > { > > @@ -1377,6 +1389,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) > > { > > @@ -1391,7 +1415,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: > > @@ -1526,6 +1552,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; > > @@ -1570,6 +1608,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; > > diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h > > index 988a135..2ebf826 100644 > > --- a/src/glsl/nir/nir.h > > +++ b/src/glsl/nir/nir.h > > @@ -396,6 +396,7 @@ typedef enum { > > nir_instr_type_jump, > > nir_instr_type_ssa_undef, > > nir_instr_type_phi, > > + nir_instr_type_parallel_copy, > > } nir_instr_type; > > > > typedef struct { > > @@ -933,6 +934,24 @@ typedef struct { > > nir_dest dest; > > } nir_phi_instr; > > > > +typedef struct { > > + struct exec_node node; > > + nir_src src; > > + nir_dest dest; > > +} nir_parallel_copy_copy; > > I don't really care too much what this is called, but maybe something > less silly like "nir_parallel_copy_entry"? > > > + > > +typedef struct { > > + nir_instr instr; > > + > > + /* Indicates that this is the parallel copy at the end of the block. > > + * When isolating phi nodes, we create 2 parallel copies in most > blocks; > > + * this flag helps tell them apart. > > + */ > > + bool at_end; > > Do we really need this? I haven't read the pass yet, but I thought we > could figure this out by checking to see if we're the last instruction > of the basic block. >
Patches 139 and 140 clean up both of these issues --Jason > > > + > > + struct exec_list copies; > > +} nir_parallel_copy_instr; > > + > > #define nir_instr_as_alu(_instr) exec_node_data(nir_alu_instr, _instr, > instr) > > #define nir_instr_as_call(_instr) exec_node_data(nir_call_instr, > _instr, instr) > > #define nir_instr_as_jump(_instr) exec_node_data(nir_jump_instr, > _instr, instr) > > @@ -946,6 +965,8 @@ typedef struct { > > exec_node_data(nir_ssa_undef_instr, _instr, instr) > > #define nir_instr_as_phi(_instr) \ > > exec_node_data(nir_phi_instr, _instr, instr) > > +#define nir_instr_as_parallel_copy(_instr) \ > > + exec_node_data(nir_parallel_copy_instr, _instr, instr) > > > > > > /* > > @@ -1251,6 +1272,8 @@ nir_tex_instr *nir_tex_instr_create(void *mem_ctx, > unsigned num_srcs); > > > > nir_phi_instr *nir_phi_instr_create(void *mem_ctx); > > > > +nir_parallel_copy_instr *nir_parallel_copy_instr_create(void *mem_ctx); > > + > > nir_ssa_undef_instr *nir_ssa_undef_instr_create(void *mem_ctx); > > > > nir_deref_var *nir_deref_var_create(void *mem_ctx, nir_variable *var); > > diff --git a/src/glsl/nir/nir_print.c b/src/glsl/nir/nir_print.c > > index 4981110..0140f4e 100644 > > --- a/src/glsl/nir/nir_print.c > > +++ b/src/glsl/nir/nir_print.c > > @@ -607,6 +607,23 @@ print_phi_instr(nir_phi_instr *instr, FILE *fp) > > } > > > > static void > > +print_parallel_copy_instr(nir_parallel_copy_instr *instr, FILE *fp) > > +{ > > + bool first = true; > > + fprintf(fp, "pcopy: "); > > + foreach_list_typed(nir_parallel_copy_copy, copy, node, > &instr->copies) { > > + if (!first) > > + fprintf(fp, "; "); > > + > > + print_dest(©->dest, fp); > > + fprintf(fp, " = "); > > + print_src(©->src, fp); > > + > > + first = false; > > + } > > +} > > + > > +static void > > print_instr(nir_instr *instr, print_var_state *state, unsigned tabs, > FILE *fp) > > { > > print_tabs(tabs, fp); > > @@ -644,6 +661,10 @@ print_instr(nir_instr *instr, print_var_state > *state, unsigned tabs, FILE *fp) > > print_phi_instr(nir_instr_as_phi(instr), fp); > > break; > > > > + case nir_instr_type_parallel_copy: > > + print_parallel_copy_instr(nir_instr_as_parallel_copy(instr), fp); > > + break; > > + > > default: > > unreachable("Invalid instruction type"); > > break; > > -- > > 2.2.0 > > > > _______________________________________________ > > mesa-dev mailing list > > mesa-dev@lists.freedesktop.org > > http://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev