[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