nir: Add a new memcpy intrinsic

This matches SPIR-V's OpCopyMemorySized

Reviewed-by: Jesse Natalie <jenatali@microsoft.com>.
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6713>
This commit is contained in:
Jason Ekstrand 2020-09-14 15:21:47 -05:00 committed by Marge Bot
parent 8cbb6640f0
commit b2899f7265
2 changed files with 26 additions and 0 deletions

View File

@ -1373,6 +1373,31 @@ nir_copy_deref(nir_builder *build, nir_deref_instr *dest, nir_deref_instr *src)
(enum gl_access_qualifier) 0);
}
static inline void
nir_memcpy_deref_with_access(nir_builder *build, nir_deref_instr *dest,
nir_deref_instr *src, nir_ssa_def *size,
enum gl_access_qualifier dest_access,
enum gl_access_qualifier src_access)
{
nir_intrinsic_instr *copy =
nir_intrinsic_instr_create(build->shader, nir_intrinsic_memcpy_deref);
copy->src[0] = nir_src_for_ssa(&dest->dest.ssa);
copy->src[1] = nir_src_for_ssa(&src->dest.ssa);
copy->src[2] = nir_src_for_ssa(size);
nir_intrinsic_set_dst_access(copy, dest_access);
nir_intrinsic_set_src_access(copy, src_access);
nir_builder_instr_insert(build, &copy->instr);
}
static inline void
nir_memcpy_deref(nir_builder *build, nir_deref_instr *dest,
nir_deref_instr *src, nir_ssa_def *size)
{
nir_memcpy_deref_with_access(build, dest, src, size,
(enum gl_access_qualifier)0,
(enum gl_access_qualifier)0);
}
static inline nir_ssa_def *
nir_load_var(nir_builder *build, nir_variable *var)
{

View File

@ -174,6 +174,7 @@ intrinsic("load_deref", dest_comp=0, src_comp=[-1],
indices=[ACCESS], flags=[CAN_ELIMINATE])
intrinsic("store_deref", src_comp=[-1, 0], indices=[WRMASK, ACCESS])
intrinsic("copy_deref", src_comp=[-1, -1], indices=[DST_ACCESS, SRC_ACCESS])
intrinsic("memcpy_deref", src_comp=[-1, -1, 1], indices=[DST_ACCESS, SRC_ACCESS])
# Interpolation of input. The interp_deref_at* intrinsics are similar to the
# load_var intrinsic acting on a shader input except that they interpolate the