[Mesa-dev] [PATCH 10/11] i965/fs: Implement support for ir_barrier
Chris Forbes
chrisf at ijw.co.nz
Sun Mar 22 19:57:47 PDT 2015
Jordan,
You also need to set m0.2:15 (Barrier count enable) and m0.2:14-9
(Barrier count) to have the message gateway actually collect the
proper number of threads, right?
- Chris
On Mon, Mar 23, 2015 at 2:49 PM, Jordan Justen
<jordan.l.justen at intel.com> wrote:
> Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
> Reviewed-by: Chris Forbes <chrisf at ijw.co.nz>
> ---
> src/mesa/drivers/dri/i965/brw_defines.h | 5 +++++
> src/mesa/drivers/dri/i965/brw_fs.h | 3 +++
> src/mesa/drivers/dri/i965/brw_fs_generator.cpp | 11 +++++++++++
> src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 27 +++++++++++++++++++++++++-
> src/mesa/drivers/dri/i965/brw_shader.cpp | 3 +++
> 5 files changed, 48 insertions(+), 1 deletion(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_defines.h b/src/mesa/drivers/dri/i965/brw_defines.h
> index 98a392a..9b1fd15 100644
> --- a/src/mesa/drivers/dri/i965/brw_defines.h
> +++ b/src/mesa/drivers/dri/i965/brw_defines.h
> @@ -1102,6 +1102,11 @@ enum opcode {
> * and number of SO primitives needed.
> */
> GS_OPCODE_FF_SYNC_SET_PRIMITIVES,
> +
> + /**
> + * GLSL barrier()
> + */
> + SHADER_OPCODE_BARRIER,
> };
>
> enum brw_urb_write_flags {
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
> index 86a7906..b55c333 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.h
> +++ b/src/mesa/drivers/dri/i965/brw_fs.h
> @@ -383,6 +383,8 @@ public:
> void emit_fb_writes();
> void emit_urb_writes();
>
> + void emit_barrier();
> +
> void emit_shader_time_begin();
> void emit_shader_time_end();
> fs_inst *SHADER_TIME_ADD(enum shader_time_shader_type type, fs_reg value);
> @@ -551,6 +553,7 @@ private:
> GLuint nr);
> void generate_fb_write(fs_inst *inst, struct brw_reg payload);
> void generate_urb_write(fs_inst *inst, struct brw_reg payload);
> + void generate_barrier(fs_inst *inst, struct brw_reg src);
> void generate_blorp_fb_write(fs_inst *inst);
> void generate_pixel_xy(struct brw_reg dst, bool is_x);
> void generate_linterp(fs_inst *inst, struct brw_reg dst,
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> index bd12147..f817e84 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> @@ -369,6 +369,13 @@ fs_generator::generate_urb_write(fs_inst *inst, struct brw_reg payload)
> }
>
> void
> +fs_generator::generate_barrier(fs_inst *inst, struct brw_reg src)
> +{
> + brw_barrier(p, src);
> + brw_wait(p);
> +}
> +
> +void
> fs_generator::generate_blorp_fb_write(fs_inst *inst)
> {
> brw_fb_WRITE(p,
> @@ -2060,6 +2067,10 @@ fs_generator::generate_code(const cfg_t *cfg, int dispatch_width)
> GEN7_PIXEL_INTERPOLATOR_LOC_PER_SLOT_OFFSET);
> break;
>
> + case SHADER_OPCODE_BARRIER:
> + generate_barrier(inst, src[0]);
> + break;
> +
> default:
> if (inst->opcode < (int) ARRAY_SIZE(opcode_descs)) {
> _mesa_problem(ctx, "Unsupported opcode `%s' in %s",
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> index 2b1b72f..5cde8f5 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> @@ -3146,7 +3146,32 @@ fs_visitor::visit(ir_end_primitive *)
> void
> fs_visitor::visit(ir_barrier *)
> {
> - assert(!"Not implemented!");
> + emit_barrier();
> +}
> +
> +void
> +fs_visitor::emit_barrier()
> +{
> + assert(brw->gen >= 7);
> +
> + /* We are getting the barrier ID from the compute shader header */
> + assert(stage == MESA_SHADER_COMPUTE);
> +
> + fs_reg payload = fs_reg(GRF, alloc.allocate(1), BRW_REGISTER_TYPE_UD);
> +
> + /* Clear the message payload */
> + fs_inst *inst = emit(MOV(payload, fs_reg(0u)));
> + inst->force_writemask_all = true;
> +
> + /* Copy bits 27:24 of r0.2 (barrier id) to the message payload reg.2 */
> + struct fs_reg r0_2 = fs_reg(retype(brw_vec1_grf(0, 2), BRW_REGISTER_TYPE_UD));
> + inst = emit(AND(component(payload, 2), r0_2, fs_reg(0x0f000000u)));
> + inst->force_writemask_all = true;
> +
> + /* Emit a gateway "barrier" message using the payload we set up, followed
> + * by a wait instruction.
> + */
> + emit(SHADER_OPCODE_BARRIER, reg_undef, payload);
> }
>
> void
> diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp
> index 51c965c..d0a7c2a 100644
> --- a/src/mesa/drivers/dri/i965/brw_shader.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp
> @@ -572,6 +572,8 @@ brw_instruction_name(enum opcode op)
> return "gs_svb_set_dst_index";
> case GS_OPCODE_FF_SYNC_SET_PRIMITIVES:
> return "gs_ff_sync_set_primitives";
> + case SHADER_OPCODE_BARRIER:
> + return "barrier";
> }
>
> unreachable("not reached");
> @@ -986,6 +988,7 @@ backend_instruction::has_side_effects() const
> case SHADER_OPCODE_GEN4_SCRATCH_WRITE:
> case SHADER_OPCODE_URB_WRITE_SIMD8:
> case FS_OPCODE_FB_WRITE:
> + case SHADER_OPCODE_BARRIER:
> return true;
> default:
> return false;
> --
> 2.1.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list