Re: [Mesa-dev] [PATCH v3 004/104] nir: Add _deref versions of all of the _var intrinsics

2018-04-08 Thread Rob Clark
On Tue, Apr 3, 2018 at 2:32 PM, Jason Ekstrand  wrote:
> ---
>  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

2018-04-03 Thread Jason Ekstrand
---
 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 +