Re: [Mesa-dev] [PATCH v3 004/104] nir: Add _deref versions of all of the _var intrinsics
On Tue, Apr 3, 2018 at 2:32 PM, Jason Ekstrandwrote: > --- > src/compiler/nir/nir.h | 2 +- > src/compiler/nir/nir_builder.h | 37 > src/compiler/nir/nir_intrinsics.py | 72 > ++ > src/compiler/nir/nir_validate.c| 34 ++ > 4 files changed, 144 insertions(+), 1 deletion(-) > > diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h > index db7dc91..fb75c96 100644 > --- a/src/compiler/nir/nir.h > +++ b/src/compiler/nir/nir.h > @@ -1161,7 +1161,7 @@ typedef enum { > > } nir_intrinsic_index_flag; > > -#define NIR_INTRINSIC_MAX_INPUTS 4 > +#define NIR_INTRINSIC_MAX_INPUTS 5 > > typedef struct { > const char *name; > diff --git a/src/compiler/nir/nir_builder.h b/src/compiler/nir/nir_builder.h > index 69c7261..62c3f38 100644 > --- a/src/compiler/nir/nir_builder.h > +++ b/src/compiler/nir/nir_builder.h > @@ -632,6 +632,43 @@ nir_build_deref_cast(nir_builder *build, nir_ssa_def > *parent, > } > > static inline nir_ssa_def * > +nir_load_deref(nir_builder *build, nir_deref_instr *deref) > +{ > + nir_intrinsic_instr *load = > + nir_intrinsic_instr_create(build->shader, nir_intrinsic_load_deref); > + load->num_components = glsl_get_vector_elements(deref->type); > + load->src[0] = nir_src_for_ssa(>dest.ssa); > + nir_ssa_dest_init(>instr, >dest, load->num_components, > + glsl_get_bit_size(deref->type), NULL); > + nir_builder_instr_insert(build, >instr); > + return >dest.ssa; > +} > + > +static inline void > +nir_store_deref(nir_builder *build, nir_deref_instr *deref, > +nir_ssa_def *value, unsigned writemask) > +{ > + nir_intrinsic_instr *store = > + nir_intrinsic_instr_create(build->shader, nir_intrinsic_store_deref); > + store->num_components = glsl_get_vector_elements(deref->type); > + store->src[0] = nir_src_for_ssa(>dest.ssa); > + store->src[1] = nir_src_for_ssa(value); > + nir_intrinsic_set_write_mask(store, > +writemask & ((1 << store->num_components) - > 1)); > + nir_builder_instr_insert(build, >instr); > +} > + > +static inline void > +nir_copy_deref(nir_builder *build, nir_deref_instr *dest, nir_deref_instr > *src) > +{ > + nir_intrinsic_instr *copy = > + nir_intrinsic_instr_create(build->shader, nir_intrinsic_copy_deref); > + copy->src[0] = nir_src_for_ssa(>dest.ssa); > + copy->src[1] = nir_src_for_ssa(>dest.ssa); > + nir_builder_instr_insert(build, >instr); > +} > + > +static inline nir_ssa_def * > nir_load_var(nir_builder *build, nir_variable *var) > { > const unsigned num_components = glsl_get_vector_elements(var->type); > diff --git a/src/compiler/nir/nir_intrinsics.py > b/src/compiler/nir/nir_intrinsics.py > index 1bc9955..5bd2a43 100644 > --- a/src/compiler/nir/nir_intrinsics.py > +++ b/src/compiler/nir/nir_intrinsics.py > @@ -124,6 +124,10 @@ intrinsic("load_var", dest_comp=0, num_vars=1, > flags=[CAN_ELIMINATE]) > intrinsic("store_var", src_comp=[0], num_vars=1, indices=[WRMASK]) > intrinsic("copy_var", num_vars=2) > > +intrinsic("load_deref", dest_comp=0, src_comp=[1], flags=[CAN_ELIMINATE]) > +intrinsic("store_deref", src_comp=[1, 0], indices=[WRMASK]) > +intrinsic("copy_deref", src_comp=[1, 1]) > + > # Interpolation of input. The interp_var_at* intrinsics are similar to the > # load_var intrinsic acting on a shader input except that they interpolate > # the input differently. The at_sample and at_offset intrinsics take an > @@ -137,6 +141,19 @@ intrinsic("interp_var_at_sample", src_comp=[1], > dest_comp=0, num_vars=1, > intrinsic("interp_var_at_offset", src_comp=[2], dest_comp=0, num_vars=1, >flags=[CAN_ELIMINATE, CAN_REORDER]) > > +# 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 > +# input differently. The at_sample and at_offset intrinsics take an > +# additional source that is an integer sample id or a vec2 position offset > +# respectively. > + > +intrinsic("interp_deref_at_centroid", dest_comp=0, src_comp=[1], > + flags=[ CAN_ELIMINATE, CAN_REORDER]) minor nit: ^ whitespace BR, -R > +intrinsic("interp_deref_at_sample", src_comp=[1, 1], dest_comp=0, > + flags=[CAN_ELIMINATE, CAN_REORDER]) > +intrinsic("interp_deref_at_offset", src_comp=[1, 2], dest_comp=0, > + flags=[CAN_ELIMINATE, CAN_REORDER]) > + > # Ask the driver for the size of a given buffer. It takes the buffer index > # as source. > intrinsic("get_buffer_size", src_comp=[1], dest_comp=1, > @@ -256,14 +273,17 @@ intrinsic("set_vertex_count", src_comp=[1]) > > def atomic(name, flags=[]): > intrinsic(name + "_var", dest_comp=1, num_vars=1, flags=flags) > +intrinsic(name + "_deref", src_comp=[1], dest_comp=1, flags=flags) > intrinsic(name, src_comp=[1], dest_comp=1, indices=[BASE], flags=flags)
[Mesa-dev] [PATCH v3 004/104] nir: Add _deref versions of all of the _var intrinsics
--- src/compiler/nir/nir.h | 2 +- src/compiler/nir/nir_builder.h | 37 src/compiler/nir/nir_intrinsics.py | 72 ++ src/compiler/nir/nir_validate.c| 34 ++ 4 files changed, 144 insertions(+), 1 deletion(-) diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index db7dc91..fb75c96 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -1161,7 +1161,7 @@ typedef enum { } nir_intrinsic_index_flag; -#define NIR_INTRINSIC_MAX_INPUTS 4 +#define NIR_INTRINSIC_MAX_INPUTS 5 typedef struct { const char *name; diff --git a/src/compiler/nir/nir_builder.h b/src/compiler/nir/nir_builder.h index 69c7261..62c3f38 100644 --- a/src/compiler/nir/nir_builder.h +++ b/src/compiler/nir/nir_builder.h @@ -632,6 +632,43 @@ nir_build_deref_cast(nir_builder *build, nir_ssa_def *parent, } static inline nir_ssa_def * +nir_load_deref(nir_builder *build, nir_deref_instr *deref) +{ + nir_intrinsic_instr *load = + nir_intrinsic_instr_create(build->shader, nir_intrinsic_load_deref); + load->num_components = glsl_get_vector_elements(deref->type); + load->src[0] = nir_src_for_ssa(>dest.ssa); + nir_ssa_dest_init(>instr, >dest, load->num_components, + glsl_get_bit_size(deref->type), NULL); + nir_builder_instr_insert(build, >instr); + return >dest.ssa; +} + +static inline void +nir_store_deref(nir_builder *build, nir_deref_instr *deref, +nir_ssa_def *value, unsigned writemask) +{ + nir_intrinsic_instr *store = + nir_intrinsic_instr_create(build->shader, nir_intrinsic_store_deref); + store->num_components = glsl_get_vector_elements(deref->type); + store->src[0] = nir_src_for_ssa(>dest.ssa); + store->src[1] = nir_src_for_ssa(value); + nir_intrinsic_set_write_mask(store, +writemask & ((1 << store->num_components) - 1)); + nir_builder_instr_insert(build, >instr); +} + +static inline void +nir_copy_deref(nir_builder *build, nir_deref_instr *dest, nir_deref_instr *src) +{ + nir_intrinsic_instr *copy = + nir_intrinsic_instr_create(build->shader, nir_intrinsic_copy_deref); + copy->src[0] = nir_src_for_ssa(>dest.ssa); + copy->src[1] = nir_src_for_ssa(>dest.ssa); + nir_builder_instr_insert(build, >instr); +} + +static inline nir_ssa_def * nir_load_var(nir_builder *build, nir_variable *var) { const unsigned num_components = glsl_get_vector_elements(var->type); diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index 1bc9955..5bd2a43 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -124,6 +124,10 @@ intrinsic("load_var", dest_comp=0, num_vars=1, flags=[CAN_ELIMINATE]) intrinsic("store_var", src_comp=[0], num_vars=1, indices=[WRMASK]) intrinsic("copy_var", num_vars=2) +intrinsic("load_deref", dest_comp=0, src_comp=[1], flags=[CAN_ELIMINATE]) +intrinsic("store_deref", src_comp=[1, 0], indices=[WRMASK]) +intrinsic("copy_deref", src_comp=[1, 1]) + # Interpolation of input. The interp_var_at* intrinsics are similar to the # load_var intrinsic acting on a shader input except that they interpolate # the input differently. The at_sample and at_offset intrinsics take an @@ -137,6 +141,19 @@ intrinsic("interp_var_at_sample", src_comp=[1], dest_comp=0, num_vars=1, intrinsic("interp_var_at_offset", src_comp=[2], dest_comp=0, num_vars=1, flags=[CAN_ELIMINATE, CAN_REORDER]) +# 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 +# input differently. The at_sample and at_offset intrinsics take an +# additional source that is an integer sample id or a vec2 position offset +# respectively. + +intrinsic("interp_deref_at_centroid", dest_comp=0, src_comp=[1], + flags=[ CAN_ELIMINATE, CAN_REORDER]) +intrinsic("interp_deref_at_sample", src_comp=[1, 1], dest_comp=0, + flags=[CAN_ELIMINATE, CAN_REORDER]) +intrinsic("interp_deref_at_offset", src_comp=[1, 2], dest_comp=0, + flags=[CAN_ELIMINATE, CAN_REORDER]) + # Ask the driver for the size of a given buffer. It takes the buffer index # as source. intrinsic("get_buffer_size", src_comp=[1], dest_comp=1, @@ -256,14 +273,17 @@ intrinsic("set_vertex_count", src_comp=[1]) def atomic(name, flags=[]): intrinsic(name + "_var", dest_comp=1, num_vars=1, flags=flags) +intrinsic(name + "_deref", src_comp=[1], dest_comp=1, flags=flags) intrinsic(name, src_comp=[1], dest_comp=1, indices=[BASE], flags=flags) def atomic2(name): intrinsic(name + "_var", src_comp=[1], dest_comp=1, num_vars=1) +intrinsic(name + "_deref", src_comp=[1, 1], dest_comp=1) intrinsic(name, src_comp=[1, 1], dest_comp=1, indices=[BASE]) def atomic3(name): intrinsic(name + "_var", src_comp=[1, 1], dest_comp=1, num_vars=1) +intrinsic(name +