nir: Add explicit task payload atomic intrinsics.

Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Jason Ekstrand <jason.ekstrand@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16693>
This commit is contained in:
Timur Kristóf 2022-05-23 07:54:58 +02:00 committed by Marge Bot
parent d6112acf18
commit 47da245ff2
4 changed files with 76 additions and 1 deletions

View File

@ -506,6 +506,20 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr)
case nir_intrinsic_shared_atomic_fmin:
case nir_intrinsic_shared_atomic_fmax:
case nir_intrinsic_shared_atomic_fcomp_swap:
case nir_intrinsic_task_payload_atomic_add:
case nir_intrinsic_task_payload_atomic_imin:
case nir_intrinsic_task_payload_atomic_umin:
case nir_intrinsic_task_payload_atomic_imax:
case nir_intrinsic_task_payload_atomic_umax:
case nir_intrinsic_task_payload_atomic_and:
case nir_intrinsic_task_payload_atomic_or:
case nir_intrinsic_task_payload_atomic_xor:
case nir_intrinsic_task_payload_atomic_exchange:
case nir_intrinsic_task_payload_atomic_comp_swap:
case nir_intrinsic_task_payload_atomic_fadd:
case nir_intrinsic_task_payload_atomic_fmin:
case nir_intrinsic_task_payload_atomic_fmax:
case nir_intrinsic_task_payload_atomic_fcomp_swap:
case nir_intrinsic_global_atomic_add:
case nir_intrinsic_global_atomic_imin:
case nir_intrinsic_global_atomic_umin:
@ -644,6 +658,7 @@ nir_variable_mode_is_uniform(nir_variable_mode mode) {
case nir_var_mem_ubo:
case nir_var_mem_ssbo:
case nir_var_mem_shared:
case nir_var_mem_task_payload:
case nir_var_mem_global:
case nir_var_image:
return true;

View File

@ -692,7 +692,8 @@ intrinsic("load_vulkan_descriptor", src_comp=[-1], dest_comp=0,
# in ssbo_atomic_add, etc).
# 3: For CompSwap only: the second data parameter.
#
# All shared variable operations take 2 sources except CompSwap that takes 3.
# All shared (and task payload) variable operations take 2 sources
# except CompSwap that takes 3.
# These sources represent:
#
# 0: The offset into the shared variable storage region that the atomic
@ -716,6 +717,7 @@ def memory_atomic_data1(name):
intrinsic("deref_atomic_" + name, src_comp=[-1, 1], dest_comp=1, indices=[ACCESS])
intrinsic("ssbo_atomic_" + name, src_comp=[-1, 1, 1], dest_comp=1, indices=[ACCESS])
intrinsic("shared_atomic_" + name, src_comp=[1, 1], dest_comp=1, indices=[BASE])
intrinsic("task_payload_atomic_" + name, src_comp=[1, 1], dest_comp=1, indices=[BASE])
intrinsic("global_atomic_" + name, src_comp=[1, 1], dest_comp=1, indices=[])
intrinsic("global_atomic_" + name + "_amd", src_comp=[1, 1, 1], dest_comp=1, indices=[BASE])
if not name.startswith('f'):
@ -725,6 +727,7 @@ def memory_atomic_data2(name):
intrinsic("deref_atomic_" + name, src_comp=[-1, 1, 1], dest_comp=1, indices=[ACCESS])
intrinsic("ssbo_atomic_" + name, src_comp=[-1, 1, 1, 1], dest_comp=1, indices=[ACCESS])
intrinsic("shared_atomic_" + name, src_comp=[1, 1, 1], dest_comp=1, indices=[BASE])
intrinsic("task_payload_atomic_" + name, src_comp=[1, 1, 1], dest_comp=1, indices=[BASE])
intrinsic("global_atomic_" + name, src_comp=[1, 1, 1], dest_comp=1, indices=[])
intrinsic("global_atomic_" + name + "_amd", src_comp=[1, 1, 1, 1], dest_comp=1, indices=[BASE])
if not name.startswith('f'):

View File

@ -121,6 +121,31 @@ shared_atomic_for_deref(nir_intrinsic_op deref_op)
}
}
static nir_intrinsic_op
task_payload_atomic_for_deref(nir_intrinsic_op deref_op)
{
switch (deref_op) {
#define OP(O) case nir_intrinsic_deref_##O: return nir_intrinsic_task_payload_##O;
OP(atomic_exchange)
OP(atomic_comp_swap)
OP(atomic_add)
OP(atomic_imin)
OP(atomic_umin)
OP(atomic_imax)
OP(atomic_umax)
OP(atomic_and)
OP(atomic_or)
OP(atomic_xor)
OP(atomic_fadd)
OP(atomic_fmin)
OP(atomic_fmax)
OP(atomic_fcomp_swap)
#undef OP
default:
unreachable("Invalid task payload atomic");
}
}
void
nir_assign_var_locations(nir_shader *shader, nir_variable_mode mode,
unsigned *size,
@ -1734,6 +1759,10 @@ build_explicit_io_atomic(nir_builder *b, nir_intrinsic_instr *intrin,
assert(addr_format_is_offset(addr_format, mode));
op = shared_atomic_for_deref(intrin->intrinsic);
break;
case nir_var_mem_task_payload:
assert(addr_format_is_offset(addr_format, mode));
op = task_payload_atomic_for_deref(intrin->intrinsic);
break;
default:
unreachable("Unsupported explicit IO variable mode");
}
@ -2560,6 +2589,20 @@ nir_get_io_offset_src(nir_intrinsic_instr *instr)
case nir_intrinsic_shared_atomic_umax:
case nir_intrinsic_shared_atomic_umin:
case nir_intrinsic_shared_atomic_xor:
case nir_intrinsic_task_payload_atomic_add:
case nir_intrinsic_task_payload_atomic_imin:
case nir_intrinsic_task_payload_atomic_umin:
case nir_intrinsic_task_payload_atomic_imax:
case nir_intrinsic_task_payload_atomic_umax:
case nir_intrinsic_task_payload_atomic_and:
case nir_intrinsic_task_payload_atomic_or:
case nir_intrinsic_task_payload_atomic_xor:
case nir_intrinsic_task_payload_atomic_exchange:
case nir_intrinsic_task_payload_atomic_comp_swap:
case nir_intrinsic_task_payload_atomic_fadd:
case nir_intrinsic_task_payload_atomic_fmin:
case nir_intrinsic_task_payload_atomic_fmax:
case nir_intrinsic_task_payload_atomic_fcomp_swap:
case nir_intrinsic_global_atomic_add:
case nir_intrinsic_global_atomic_and:
case nir_intrinsic_global_atomic_comp_swap:

View File

@ -88,6 +88,20 @@ shader_writes_to_memory(nir_shader *shader)
case nir_intrinsic_shared_atomic_xor:
case nir_intrinsic_shared_atomic_exchange:
case nir_intrinsic_shared_atomic_comp_swap:
case nir_intrinsic_task_payload_atomic_add:
case nir_intrinsic_task_payload_atomic_imin:
case nir_intrinsic_task_payload_atomic_umin:
case nir_intrinsic_task_payload_atomic_imax:
case nir_intrinsic_task_payload_atomic_umax:
case nir_intrinsic_task_payload_atomic_and:
case nir_intrinsic_task_payload_atomic_or:
case nir_intrinsic_task_payload_atomic_xor:
case nir_intrinsic_task_payload_atomic_exchange:
case nir_intrinsic_task_payload_atomic_comp_swap:
case nir_intrinsic_task_payload_atomic_fadd:
case nir_intrinsic_task_payload_atomic_fmin:
case nir_intrinsic_task_payload_atomic_fmax:
case nir_intrinsic_task_payload_atomic_fcomp_swap:
case nir_intrinsic_image_deref_store:
case nir_intrinsic_image_deref_atomic_add:
case nir_intrinsic_image_deref_atomic_fadd: