[Mesa-dev] [PATCH 01/11] glsl: Add ir node for barrier

Matt Turner mattst88 at gmail.com
Sun Mar 22 19:00:11 PDT 2015


On Sun, Mar 22, 2015 at 6:49 PM, Jordan Justen
<jordan.l.justen at intel.com> wrote:
> From: Chris Forbes <chrisf at ijw.co.nz>
>
> [jordan.l.justen at intel.com: Add nir support]
> Signed-off-by: Jordan Justen <jordan.l.justen at 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


More information about the mesa-dev mailing list