nir: Add a new memory_barrier_tcs_patch intrinsic
Right now, it's implemented as a no-op for everyone. For most drivers, it's a switch case in the NIR -> whatever which just breaks. For ir3, they already have code to delete tessellation barriers so we just add a case to also delete memory_barrier_tcs_patch. Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com> Reviewed-by: Eric Anholt <eric@anholt.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3307>
This commit is contained in:

committed by
Marge Bot

parent
f2eece773c
commit
60097cc840
@@ -5729,6 +5729,8 @@ void visit_intrinsic(isel_context *ctx, nir_intrinsic_instr *instr)
|
|||||||
case nir_intrinsic_memory_barrier_shared:
|
case nir_intrinsic_memory_barrier_shared:
|
||||||
emit_memory_barrier(ctx, instr);
|
emit_memory_barrier(ctx, instr);
|
||||||
break;
|
break;
|
||||||
|
case nir_intrinsic_memory_barrier_tcs_patch:
|
||||||
|
break;
|
||||||
case nir_intrinsic_load_num_work_groups: {
|
case nir_intrinsic_load_num_work_groups: {
|
||||||
Temp dst = get_ssa_temp(ctx, &instr->dest.ssa);
|
Temp dst = get_ssa_temp(ctx, &instr->dest.ssa);
|
||||||
bld.copy(Definition(dst), Operand(get_arg(ctx, ctx->args->ac.num_work_groups)));
|
bld.copy(Definition(dst), Operand(get_arg(ctx, ctx->args->ac.num_work_groups)));
|
||||||
|
@@ -3553,6 +3553,8 @@ static void visit_intrinsic(struct ac_nir_context *ctx,
|
|||||||
case nir_intrinsic_memory_barrier_shared:
|
case nir_intrinsic_memory_barrier_shared:
|
||||||
emit_membar(&ctx->ac, instr);
|
emit_membar(&ctx->ac, instr);
|
||||||
break;
|
break;
|
||||||
|
case nir_intrinsic_memory_barrier_tcs_patch:
|
||||||
|
break;
|
||||||
case nir_intrinsic_barrier:
|
case nir_intrinsic_barrier:
|
||||||
ac_emit_barrier(&ctx->ac, ctx->stage);
|
ac_emit_barrier(&ctx->ac, ctx->stage);
|
||||||
break;
|
break;
|
||||||
|
@@ -2247,6 +2247,7 @@ ntq_emit_intrinsic(struct v3d_compile *c, nir_intrinsic_instr *instr)
|
|||||||
case nir_intrinsic_memory_barrier_buffer:
|
case nir_intrinsic_memory_barrier_buffer:
|
||||||
case nir_intrinsic_memory_barrier_image:
|
case nir_intrinsic_memory_barrier_image:
|
||||||
case nir_intrinsic_memory_barrier_shared:
|
case nir_intrinsic_memory_barrier_shared:
|
||||||
|
case nir_intrinsic_memory_barrier_tcs_patch:
|
||||||
case nir_intrinsic_group_memory_barrier:
|
case nir_intrinsic_group_memory_barrier:
|
||||||
/* We don't do any instruction scheduling of these NIR
|
/* We don't do any instruction scheduling of these NIR
|
||||||
* instructions between each other, so we just need to make
|
* instructions between each other, so we just need to make
|
||||||
|
@@ -255,6 +255,9 @@ barrier("memory_barrier_shared")
|
|||||||
barrier("begin_invocation_interlock")
|
barrier("begin_invocation_interlock")
|
||||||
barrier("end_invocation_interlock")
|
barrier("end_invocation_interlock")
|
||||||
|
|
||||||
|
# Memory barrier for synchronizing TCS patch outputs
|
||||||
|
barrier("memory_barrier_tcs_patch")
|
||||||
|
|
||||||
# A conditional discard/demote, with a single boolean source.
|
# A conditional discard/demote, with a single boolean source.
|
||||||
intrinsic("discard_if", src_comp=[1])
|
intrinsic("discard_if", src_comp=[1])
|
||||||
intrinsic("demote_if", src_comp=[1])
|
intrinsic("demote_if", src_comp=[1])
|
||||||
|
@@ -320,6 +320,10 @@ combine_stores_block(struct combine_stores_state *state, nir_block *block)
|
|||||||
combine_stores_with_modes(state, nir_var_mem_shared);
|
combine_stores_with_modes(state, nir_var_mem_shared);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case nir_intrinsic_memory_barrier_tcs_patch:
|
||||||
|
combine_stores_with_modes(state, nir_var_shader_out);
|
||||||
|
break;
|
||||||
|
|
||||||
case nir_intrinsic_scoped_memory_barrier:
|
case nir_intrinsic_scoped_memory_barrier:
|
||||||
if (nir_intrinsic_memory_semantics(intrin) & NIR_MEMORY_RELEASE) {
|
if (nir_intrinsic_memory_semantics(intrin) & NIR_MEMORY_RELEASE) {
|
||||||
combine_stores_with_modes(state,
|
combine_stores_with_modes(state,
|
||||||
|
@@ -820,6 +820,12 @@ copy_prop_vars_block(struct copy_prop_var_state *state,
|
|||||||
apply_barrier_for_modes(copies, nir_var_mem_shared);
|
apply_barrier_for_modes(copies, nir_var_mem_shared);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case nir_intrinsic_memory_barrier_tcs_patch:
|
||||||
|
if (debug) dump_instr(instr);
|
||||||
|
|
||||||
|
apply_barrier_for_modes(copies, nir_var_shader_out);
|
||||||
|
break;
|
||||||
|
|
||||||
case nir_intrinsic_scoped_memory_barrier:
|
case nir_intrinsic_scoped_memory_barrier:
|
||||||
if (debug) dump_instr(instr);
|
if (debug) dump_instr(instr);
|
||||||
|
|
||||||
|
@@ -148,6 +148,10 @@ remove_dead_write_vars_local(void *mem_ctx, nir_block *block)
|
|||||||
clear_unused_for_modes(&unused_writes, nir_var_mem_shared);
|
clear_unused_for_modes(&unused_writes, nir_var_mem_shared);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case nir_intrinsic_memory_barrier_tcs_patch:
|
||||||
|
clear_unused_for_modes(&unused_writes, nir_var_shader_out);
|
||||||
|
break;
|
||||||
|
|
||||||
case nir_intrinsic_scoped_memory_barrier: {
|
case nir_intrinsic_scoped_memory_barrier: {
|
||||||
if (nir_intrinsic_memory_semantics(intrin) & NIR_MEMORY_RELEASE) {
|
if (nir_intrinsic_memory_semantics(intrin) & NIR_MEMORY_RELEASE) {
|
||||||
clear_unused_for_modes(&unused_writes,
|
clear_unused_for_modes(&unused_writes,
|
||||||
|
@@ -349,6 +349,7 @@ lower_tess_ctrl_block(nir_block *block, nir_builder *b, struct state *state)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case nir_intrinsic_barrier:
|
case nir_intrinsic_barrier:
|
||||||
|
case nir_intrinsic_memory_barrier_tcs_patch:
|
||||||
/* Hull shaders dispatch 32 wide so an entire patch will always
|
/* Hull shaders dispatch 32 wide so an entire patch will always
|
||||||
* fit in a single warp and execute in lock-step. Consequently,
|
* fit in a single warp and execute in lock-step. Consequently,
|
||||||
* we don't need to do anything for TCS barriers so just remove
|
* we don't need to do anything for TCS barriers so just remove
|
||||||
|
@@ -1359,6 +1359,7 @@ static void visit_intrinsic(struct lp_build_nir_context *bld_base,
|
|||||||
case nir_intrinsic_memory_barrier_shared:
|
case nir_intrinsic_memory_barrier_shared:
|
||||||
case nir_intrinsic_memory_barrier_buffer:
|
case nir_intrinsic_memory_barrier_buffer:
|
||||||
case nir_intrinsic_memory_barrier_image:
|
case nir_intrinsic_memory_barrier_image:
|
||||||
|
case nir_intrinsic_memory_barrier_tcs_patch:
|
||||||
break;
|
break;
|
||||||
case nir_intrinsic_load_kernel_input:
|
case nir_intrinsic_load_kernel_input:
|
||||||
visit_load_kernel_input(bld_base, instr, result);
|
visit_load_kernel_input(bld_base, instr, result);
|
||||||
|
@@ -2663,6 +2663,8 @@ Converter::visit(nir_intrinsic_instr *insn)
|
|||||||
bar->subOp = getSubOp(op);
|
bar->subOp = getSubOp(op);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case nir_intrinsic_memory_barrier_tcs_patch:
|
||||||
|
break;
|
||||||
case nir_intrinsic_shader_clock: {
|
case nir_intrinsic_shader_clock: {
|
||||||
const DataType dType = getDType(insn);
|
const DataType dType = getDType(insn);
|
||||||
LValues &newDefs = convert(&insn->dest);
|
LValues &newDefs = convert(&insn->dest);
|
||||||
|
@@ -4332,6 +4332,9 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case nir_intrinsic_memory_barrier_tcs_patch:
|
||||||
|
break;
|
||||||
|
|
||||||
case nir_intrinsic_shader_clock: {
|
case nir_intrinsic_shader_clock: {
|
||||||
/* We cannot do anything if there is an event, so ignore it for now */
|
/* We cannot do anything if there is an event, so ignore it for now */
|
||||||
const fs_reg shader_clock = get_timestamp(bld);
|
const fs_reg shader_clock = get_timestamp(bld);
|
||||||
|
@@ -315,6 +315,9 @@ vec4_tcs_visitor::nir_emit_intrinsic(nir_intrinsic_instr *instr)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case nir_intrinsic_memory_barrier_tcs_patch:
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
vec4_visitor::nir_emit_intrinsic(instr);
|
vec4_visitor::nir_emit_intrinsic(instr);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user