On Sun, Mar 22, 2015 at 6:49 PM, Jordan Justen <jordan.l.jus...@intel.com> wrote: > From: Chris Forbes <chr...@ijw.co.nz> > > [jordan.l.jus...@intel.com: Add nir support] > Signed-off-by: Jordan Justen <jordan.l.jus...@intel.com> > --- > src/glsl/ir.h | 24 ++++++++++++++++++++++++ > src/glsl/ir_hierarchical_visitor.cpp | 9 +++++++++ > src/glsl/ir_hierarchical_visitor.h | 1 + > src/glsl/ir_hv_accept.cpp | 6 ++++++ > src/glsl/ir_print_visitor.cpp | 5 +++++ > src/glsl/ir_print_visitor.h | 1 + > src/glsl/ir_reader.cpp | 15 +++++++++++++++ > src/glsl/ir_visitor.h | 2 ++ > src/glsl/nir/glsl_to_nir.cpp | 7 +++++++ > src/mesa/drivers/dri/i965/brw_fs.h | 1 + > src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 6 ++++++ > src/mesa/drivers/dri/i965/brw_vec4.h | 1 + > src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 6 ++++++ > src/mesa/program/ir_to_mesa.cpp | 7 +++++++ > src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 7 +++++++ > 15 files changed, 98 insertions(+) > > diff --git a/src/glsl/ir.h b/src/glsl/ir.h > index fdc22ed..af1a31a 100644 > --- a/src/glsl/ir.h > +++ b/src/glsl/ir.h > @@ -78,6 +78,7 @@ enum ir_node_type { > ir_type_discard, > ir_type_emit_vertex, > ir_type_end_primitive, > + ir_type_barrier, > ir_type_max, /**< maximum ir_type enum number, for validation */ > ir_type_unset = ir_type_max > }; > @@ -2378,6 +2379,29 @@ public: > ir_rvalue *stream; > }; > > +/** > + * IR instruction for tessellation control shader barrier.
And presumably for compute shaders as well. > + */ > +class ir_barrier : public ir_instruction { > +public: > + ir_barrier() > + : ir_instruction(ir_type_barrier) > + { > + } > + > + virtual void accept(ir_visitor *v) > + { > + v->visit(this); > + } > + > + virtual ir_barrier *clone(void *mem_ctx, struct hash_table *) const > + { > + return new(mem_ctx) ir_barrier(); > + } > + > + virtual ir_visitor_status accept(ir_hierarchical_visitor *); > +}; > + > /*@}*/ > > /** > diff --git a/src/glsl/ir_hierarchical_visitor.cpp > b/src/glsl/ir_hierarchical_visitor.cpp > index adb6294..1d23a77 100644 > --- a/src/glsl/ir_hierarchical_visitor.cpp > +++ b/src/glsl/ir_hierarchical_visitor.cpp > @@ -80,6 +80,15 @@ ir_hierarchical_visitor::visit(ir_dereference_variable *ir) > } > > ir_visitor_status > +ir_hierarchical_visitor::visit(ir_barrier *ir) > +{ > + if (this->callback_enter != NULL) > + this->callback_enter(ir, this->data_enter); > + > + return visit_continue; > +} > + > +ir_visitor_status > ir_hierarchical_visitor::visit_enter(ir_loop *ir) > { > if (this->callback_enter != NULL) > diff --git a/src/glsl/ir_hierarchical_visitor.h > b/src/glsl/ir_hierarchical_visitor.h > index faa52fd..d667853 100644 > --- a/src/glsl/ir_hierarchical_visitor.h > +++ b/src/glsl/ir_hierarchical_visitor.h > @@ -87,6 +87,7 @@ public: > virtual ir_visitor_status visit(class ir_variable *); > virtual ir_visitor_status visit(class ir_constant *); > virtual ir_visitor_status visit(class ir_loop_jump *); > + virtual ir_visitor_status visit(class ir_barrier *); > > /** > * ir_dereference_variable isn't technically a leaf, but it is treated as > a > diff --git a/src/glsl/ir_hv_accept.cpp b/src/glsl/ir_hv_accept.cpp > index be5b3ea..d3662cf 100644 > --- a/src/glsl/ir_hv_accept.cpp > +++ b/src/glsl/ir_hv_accept.cpp > @@ -429,3 +429,9 @@ ir_end_primitive::accept(ir_hierarchical_visitor *v) > > return (s == visit_stop) ? s : v->visit_leave(this); > } > + > +ir_visitor_status > +ir_barrier::accept(ir_hierarchical_visitor *v) > +{ > + return v->visit(this); > +} > diff --git a/src/glsl/ir_print_visitor.cpp b/src/glsl/ir_print_visitor.cpp > index 01f52e8..f5de6ac 100644 > --- a/src/glsl/ir_print_visitor.cpp > +++ b/src/glsl/ir_print_visitor.cpp > @@ -573,5 +573,10 @@ ir_print_visitor::visit(ir_end_primitive *ir) > fprintf(f, "(end-primitive "); > ir->stream->accept(this); > fprintf(f, ")\n"); > +} > > +void > +ir_print_visitor::visit(ir_barrier *ir) > +{ > + fprintf(f, "(barrier)\n"); > } > diff --git a/src/glsl/ir_print_visitor.h b/src/glsl/ir_print_visitor.h > index 98f041d..965e63a 100644 > --- a/src/glsl/ir_print_visitor.h > +++ b/src/glsl/ir_print_visitor.h > @@ -71,6 +71,7 @@ public: > virtual void visit(ir_loop_jump *); > virtual void visit(ir_emit_vertex *); > virtual void visit(ir_end_primitive *); > + virtual void visit(ir_barrier *); > /*@}*/ > > private: > diff --git a/src/glsl/ir_reader.cpp b/src/glsl/ir_reader.cpp > index fd318c0..4eae413 100644 > --- a/src/glsl/ir_reader.cpp > +++ b/src/glsl/ir_reader.cpp > @@ -63,6 +63,7 @@ private: > ir_texture *read_texture(s_expression *); > ir_emit_vertex *read_emit_vertex(s_expression *); > ir_end_primitive *read_end_primitive(s_expression *); > + ir_barrier *read_barrier(s_expression *); Is there any point in adding this to ir_reader? > > ir_dereference *read_dereference(s_expression *); > ir_dereference_variable *read_var_ref(s_expression *); > @@ -375,6 +376,8 @@ ir_reader::read_instruction(s_expression *expr, ir_loop > *loop_ctx) > inst = read_emit_vertex(list); > } else if (strcmp(tag->value(), "end-primitive") == 0) { > inst = read_end_primitive(list); > + } else if (strcmp(tag->value(), "barrier") == 0) { > + inst = read_barrier(list); > } else { > inst = read_rvalue(list); > if (inst == NULL) > @@ -1142,3 +1145,15 @@ ir_reader::read_end_primitive(s_expression *expr) > ir_read_error(NULL, "when reading end-primitive"); > return NULL; > } > + > +ir_barrier * > +ir_reader::read_barrier(s_expression *expr) > +{ > + s_pattern pat[] = { "barrier" }; > + > + if (MATCH(expr, pat)) { > + return new(mem_ctx) ir_barrier(); > + } > + ir_read_error(NULL, "when reading barrier"); > + return NULL; > +} > diff --git a/src/glsl/ir_visitor.h b/src/glsl/ir_visitor.h > index 40f96ff..7c38481 100644 > --- a/src/glsl/ir_visitor.h > +++ b/src/glsl/ir_visitor.h > @@ -65,6 +65,7 @@ public: > virtual void visit(class ir_loop_jump *) = 0; > virtual void visit(class ir_emit_vertex *) = 0; > virtual void visit(class ir_end_primitive *) = 0; > + virtual void visit(class ir_barrier *) = 0; > /*@}*/ > }; > > @@ -85,6 +86,7 @@ public: > virtual void visit(class ir_call *) {} > virtual void visit(class ir_emit_vertex *) {} > virtual void visit(class ir_end_primitive *) {} > + virtual void visit(class ir_barrier *) {} > }; > #endif /* __cplusplus */ > > diff --git a/src/glsl/nir/glsl_to_nir.cpp b/src/glsl/nir/glsl_to_nir.cpp > index 357944d..5543b38 100644 > --- a/src/glsl/nir/glsl_to_nir.cpp > +++ b/src/glsl/nir/glsl_to_nir.cpp > @@ -65,6 +65,7 @@ public: > virtual void visit(ir_dereference_variable *); > virtual void visit(ir_dereference_record *); > virtual void visit(ir_dereference_array *); > + virtual void visit(ir_barrier *); > > void create_function(ir_function *ir); > > @@ -1785,3 +1786,9 @@ nir_visitor::visit(ir_dereference_array *ir) > this->deref_tail->child = &deref->deref; > this->deref_tail = &deref->deref; > } > + > +void > +nir_visitor::visit(ir_barrier *ir) > +{ > + assert(!"Not implemented!"); unreachable > +} > diff --git a/src/mesa/drivers/dri/i965/brw_fs.h > b/src/mesa/drivers/dri/i965/brw_fs.h > index 608262f..86a7906 100644 > --- a/src/mesa/drivers/dri/i965/brw_fs.h > +++ b/src/mesa/drivers/dri/i965/brw_fs.h > @@ -118,6 +118,7 @@ public: > void visit(ir_function_signature *ir); > void visit(ir_emit_vertex *); > void visit(ir_end_primitive *); > + void visit(ir_barrier *); > > uint32_t gather_channel(int orig_chan, uint32_t sampler); > void swizzle_result(ir_texture_opcode op, int dest_components, > diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > index 2920a82..2b1b72f 100644 > --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > @@ -3144,6 +3144,12 @@ fs_visitor::visit(ir_end_primitive *) > } > > void > +fs_visitor::visit(ir_barrier *) > +{ > + assert(!"Not implemented!"); unreachable > +} > + > +void > fs_visitor::emit_untyped_atomic(unsigned atomic_op, unsigned surf_index, > fs_reg dst, fs_reg offset, fs_reg src0, > fs_reg src1) > diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h > b/src/mesa/drivers/dri/i965/brw_vec4.h > index a24f843..26f6021 100644 > --- a/src/mesa/drivers/dri/i965/brw_vec4.h > +++ b/src/mesa/drivers/dri/i965/brw_vec4.h > @@ -160,6 +160,7 @@ public: > virtual void visit(ir_if *); > virtual void visit(ir_emit_vertex *); > virtual void visit(ir_end_primitive *); > + virtual void visit(ir_barrier *); > /*@}*/ > > src_reg result; > diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp > b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp > index 05bda43..a0294c4 100644 > --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp > +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp > @@ -2934,6 +2934,12 @@ vec4_visitor::visit(ir_end_primitive *) > } > > void > +vec4_visitor::visit(ir_barrier *) > +{ > + unreachable("not reached"); > +} > + > +void > vec4_visitor::emit_untyped_atomic(unsigned atomic_op, unsigned surf_index, > dst_reg dst, src_reg offset, > src_reg src0, src_reg src1) > diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp > index 39790ec..1e04975 100644 > --- a/src/mesa/program/ir_to_mesa.cpp > +++ b/src/mesa/program/ir_to_mesa.cpp > @@ -262,6 +262,7 @@ public: > virtual void visit(ir_if *); > virtual void visit(ir_emit_vertex *); > virtual void visit(ir_end_primitive *); > + virtual void visit(ir_barrier *); > /*@}*/ > > src_reg result; > @@ -2221,6 +2222,12 @@ ir_to_mesa_visitor::visit(ir_end_primitive *) > assert(!"Geometry shaders not supported."); > } > > +void > +ir_to_mesa_visitor::visit(ir_barrier *) > +{ > + assert(!"Tessellation shaders not supported."); unreachable > +} > + > ir_to_mesa_visitor::ir_to_mesa_visitor() > { > result.file = PROGRAM_UNDEFINED; > diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > index efee4b2..3f6a904 100644 > --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > @@ -376,6 +376,7 @@ public: > virtual void visit(ir_if *); > virtual void visit(ir_emit_vertex *); > virtual void visit(ir_end_primitive *); > + virtual void visit(ir_barrier *); > /*@}*/ > > st_src_reg result; > @@ -3445,6 +3446,12 @@ glsl_to_tgsi_visitor::visit(ir_end_primitive *ir) > emit(ir, TGSI_OPCODE_ENDPRIM, undef_dst, this->result); > } > > +void > +glsl_to_tgsi_visitor::visit(ir_barrier *ir) > +{ > + assert(!"Not implemented"); unreachable _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev