From b2899f72657a006489284def54f9a5373f8a1d1e Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Mon, 14 Sep 2020 15:21:47 -0500 Subject: [PATCH] nir: Add a new memcpy intrinsic This matches SPIR-V's OpCopyMemorySized Reviewed-by: Jesse Natalie . Part-of: --- src/compiler/nir/nir_builder.h | 25 +++++++++++++++++++++++++ src/compiler/nir/nir_intrinsics.py | 1 + 2 files changed, 26 insertions(+) diff --git a/src/compiler/nir/nir_builder.h b/src/compiler/nir/nir_builder.h index 8451ce249d1..a70bb3c6dbc 100644 --- a/src/compiler/nir/nir_builder.h +++ b/src/compiler/nir/nir_builder.h @@ -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, ©->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) { diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index 65c7a232dd5..db9ee460173 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -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