[Mesa-dev] [PATCH v4 20/44] i965/fs: Add byte scattered read message and fs support

2017-11-29 Thread Jose Maria Casanova Crespo
v2: Fix alignment style (Topi Pohjolainen)
(Jason Ekstrand)
- Enable bit_size parameter to scattered messages to enable different
  bitsizes byte/word/dword.
- Remove use of brw_send_indirect_scattered_message in favor of
  brw_send_indirect_surface_message.
- Move scattered messages to surface messages namespace.
- Assert align1 for scattered messages and assume Gen8+.
- Inline brw_set_dp_byte_scattered_read.
---
 src/intel/compiler/brw_eu.h|  8 +++
 src/intel/compiler/brw_eu_defines.h|  2 ++
 src/intel/compiler/brw_eu_emit.c   | 30 ++
 src/intel/compiler/brw_fs.cpp  | 19 
 src/intel/compiler/brw_fs_copy_propagation.cpp |  2 ++
 src/intel/compiler/brw_fs_generator.cpp|  6 ++
 src/intel/compiler/brw_fs_surface_builder.cpp  | 11 +-
 src/intel/compiler/brw_fs_surface_builder.h|  7 ++
 src/intel/compiler/brw_shader.cpp  |  6 ++
 9 files changed, 90 insertions(+), 1 deletion(-)

diff --git a/src/intel/compiler/brw_eu.h b/src/intel/compiler/brw_eu.h
index 3ac3b4342a..2d0f56f793 100644
--- a/src/intel/compiler/brw_eu.h
+++ b/src/intel/compiler/brw_eu.h
@@ -485,6 +485,14 @@ brw_typed_surface_write(struct brw_codegen *p,
 unsigned msg_length,
 unsigned num_channels);
 
+void
+brw_byte_scattered_read(struct brw_codegen *p,
+struct brw_reg dst,
+struct brw_reg payload,
+struct brw_reg surface,
+unsigned msg_length,
+unsigned bit_size);
+
 void
 brw_byte_scattered_write(struct brw_codegen *p,
  struct brw_reg payload,
diff --git a/src/intel/compiler/brw_eu_defines.h 
b/src/intel/compiler/brw_eu_defines.h
index de6330ee54..aa510ebfa4 100644
--- a/src/intel/compiler/brw_eu_defines.h
+++ b/src/intel/compiler/brw_eu_defines.h
@@ -409,6 +409,8 @@ enum opcode {
 * opcode, but instead of taking a single payload blog they expect their
 * arguments separately as individual sources, like untyped write/read.
 */
+   SHADER_OPCODE_BYTE_SCATTERED_READ,
+   SHADER_OPCODE_BYTE_SCATTERED_READ_LOGICAL,
SHADER_OPCODE_BYTE_SCATTERED_WRITE,
SHADER_OPCODE_BYTE_SCATTERED_WRITE_LOGICAL,
 
diff --git a/src/intel/compiler/brw_eu_emit.c b/src/intel/compiler/brw_eu_emit.c
index ded7e228cf..bdc516848a 100644
--- a/src/intel/compiler/brw_eu_emit.c
+++ b/src/intel/compiler/brw_eu_emit.c
@@ -2998,6 +2998,36 @@ static enum brw_data_size 
brw_data_size_from_bit_size(unsigned bit_size)
}
 }
 
+
+void
+brw_byte_scattered_read(struct brw_codegen *p,
+struct brw_reg dst,
+struct brw_reg payload,
+struct brw_reg surface,
+unsigned msg_length,
+unsigned bit_size)
+{
+   assert(brw_inst_access_mode(p->devinfo, p->current) == BRW_ALIGN_1);
+   const struct gen_device_info *devinfo = p->devinfo;
+   const unsigned sfid =  GEN7_SFID_DATAPORT_DATA_CACHE;
+
+   struct brw_inst *insn = brw_send_indirect_surface_message(
+  p, sfid, dst, payload, surface, msg_length,
+  brw_surface_payload_size(p, 1, true, true),
+  false);
+
+   unsigned msg_control = brw_data_size_from_bit_size(bit_size) << 2;
+
+   if (brw_inst_exec_size(devinfo, p->current) == BRW_EXECUTE_16)
+  msg_control |= 1; /* SIMD16 mode */
+   else
+  msg_control |= 0; /* SIMD8 mode */
+
+   brw_inst_set_dp_msg_type(devinfo, insn,
+HSW_DATAPORT_DC_PORT0_BYTE_SCATTERED_READ);
+   brw_inst_set_dp_msg_control(devinfo, insn, msg_control);
+}
+
 void
 brw_byte_scattered_write(struct brw_codegen *p,
  struct brw_reg payload,
diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp
index 32f1d757f0..1ca4d416b2 100644
--- a/src/intel/compiler/brw_fs.cpp
+++ b/src/intel/compiler/brw_fs.cpp
@@ -251,6 +251,7 @@ fs_inst::is_send_from_grf() const
case SHADER_OPCODE_UNTYPED_SURFACE_READ:
case SHADER_OPCODE_UNTYPED_SURFACE_WRITE:
case SHADER_OPCODE_BYTE_SCATTERED_WRITE:
+   case SHADER_OPCODE_BYTE_SCATTERED_READ:
case SHADER_OPCODE_TYPED_ATOMIC:
case SHADER_OPCODE_TYPED_SURFACE_READ:
case SHADER_OPCODE_TYPED_SURFACE_WRITE:
@@ -750,6 +751,16 @@ fs_inst::components_read(unsigned i) const
   else
  return 1;
 
+   case SHADER_OPCODE_BYTE_SCATTERED_READ_LOGICAL:
+  assert(src[3].file == IMM &&
+ src[4].file == IMM);
+  if (i == 0)
+ return 1;
+  else if (i == 1)
+ return 0;
+  else
+ return 1;
+
case SHADER_OPCODE_BYTE_SCATTERED_WRITE_LOGICAL:
   assert(src[3].file == IMM &&
  src[4].file == IMM);
@@ -798,6 +809,7 @@ fs_inst::size_read(int arg) const
case SHADER_OPCODE_TYPED_SURFACE_WRITE:
case FS_OPCODE_INTERPO

Re: [Mesa-dev] [PATCH v4 20/44] i965/fs: Add byte scattered read message and fs support

2017-11-30 Thread Jason Ekstrand
On Wed, Nov 29, 2017 at 6:50 PM, Jose Maria Casanova Crespo <
jmcasan...@igalia.com> wrote:

> v2: Fix alignment style (Topi Pohjolainen)
> (Jason Ekstrand)
> - Enable bit_size parameter to scattered messages to enable different
>   bitsizes byte/word/dword.
> - Remove use of brw_send_indirect_scattered_message in favor of
>   brw_send_indirect_surface_message.
> - Move scattered messages to surface messages namespace.
> - Assert align1 for scattered messages and assume Gen8+.
> - Inline brw_set_dp_byte_scattered_read.
> ---
>  src/intel/compiler/brw_eu.h|  8 +++
>  src/intel/compiler/brw_eu_defines.h|  2 ++
>  src/intel/compiler/brw_eu_emit.c   | 30
> ++
>  src/intel/compiler/brw_fs.cpp  | 19 
>  src/intel/compiler/brw_fs_copy_propagation.cpp |  2 ++
>  src/intel/compiler/brw_fs_generator.cpp|  6 ++
>  src/intel/compiler/brw_fs_surface_builder.cpp  | 11 +-
>  src/intel/compiler/brw_fs_surface_builder.h|  7 ++
>  src/intel/compiler/brw_shader.cpp  |  6 ++
>  9 files changed, 90 insertions(+), 1 deletion(-)
>
> diff --git a/src/intel/compiler/brw_eu.h b/src/intel/compiler/brw_eu.h
> index 3ac3b4342a..2d0f56f793 100644
> --- a/src/intel/compiler/brw_eu.h
> +++ b/src/intel/compiler/brw_eu.h
> @@ -485,6 +485,14 @@ brw_typed_surface_write(struct brw_codegen *p,
>  unsigned msg_length,
>  unsigned num_channels);
>
> +void
> +brw_byte_scattered_read(struct brw_codegen *p,
> +struct brw_reg dst,
> +struct brw_reg payload,
> +struct brw_reg surface,
> +unsigned msg_length,
> +unsigned bit_size);
> +
>  void
>  brw_byte_scattered_write(struct brw_codegen *p,
>   struct brw_reg payload,
> diff --git a/src/intel/compiler/brw_eu_defines.h
> b/src/intel/compiler/brw_eu_defines.h
> index de6330ee54..aa510ebfa4 100644
> --- a/src/intel/compiler/brw_eu_defines.h
> +++ b/src/intel/compiler/brw_eu_defines.h
> @@ -409,6 +409,8 @@ enum opcode {
>  * opcode, but instead of taking a single payload blog they expect
> their
>  * arguments separately as individual sources, like untyped write/read.
>  */
> +   SHADER_OPCODE_BYTE_SCATTERED_READ,
> +   SHADER_OPCODE_BYTE_SCATTERED_READ_LOGICAL,
> SHADER_OPCODE_BYTE_SCATTERED_WRITE,
> SHADER_OPCODE_BYTE_SCATTERED_WRITE_LOGICAL,
>
> diff --git a/src/intel/compiler/brw_eu_emit.c b/src/intel/compiler/brw_eu_
> emit.c
> index ded7e228cf..bdc516848a 100644
> --- a/src/intel/compiler/brw_eu_emit.c
> +++ b/src/intel/compiler/brw_eu_emit.c
> @@ -2998,6 +2998,36 @@ static enum brw_data_size
> brw_data_size_from_bit_size(unsigned bit_size)
> }
>  }
>
> +
> +void
> +brw_byte_scattered_read(struct brw_codegen *p,
> +struct brw_reg dst,
> +struct brw_reg payload,
> +struct brw_reg surface,
> +unsigned msg_length,
> +unsigned bit_size)
> +{
> +   assert(brw_inst_access_mode(p->devinfo, p->current) == BRW_ALIGN_1);
> +   const struct gen_device_info *devinfo = p->devinfo;
> +   const unsigned sfid =  GEN7_SFID_DATAPORT_DATA_CACHE;
> +
> +   struct brw_inst *insn = brw_send_indirect_surface_message(
> +  p, sfid, dst, payload, surface, msg_length,
> +  brw_surface_payload_size(p, 1, true, true),
> +  false);
> +
> +   unsigned msg_control = brw_data_size_from_bit_size(bit_size) << 2;
> +
> +   if (brw_inst_exec_size(devinfo, p->current) == BRW_EXECUTE_16)
> +  msg_control |= 1; /* SIMD16 mode */
> +   else
> +  msg_control |= 0; /* SIMD8 mode */
> +
> +   brw_inst_set_dp_msg_type(devinfo, insn,
> +HSW_DATAPORT_DC_PORT0_BYTE_SCATTERED_READ);
> +   brw_inst_set_dp_msg_control(devinfo, insn, msg_control);
> +}
> +
>  void
>  brw_byte_scattered_write(struct brw_codegen *p,
>   struct brw_reg payload,
> diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp
> index 32f1d757f0..1ca4d416b2 100644
> --- a/src/intel/compiler/brw_fs.cpp
> +++ b/src/intel/compiler/brw_fs.cpp
> @@ -251,6 +251,7 @@ fs_inst::is_send_from_grf() const
> case SHADER_OPCODE_UNTYPED_SURFACE_READ:
> case SHADER_OPCODE_UNTYPED_SURFACE_WRITE:
> case SHADER_OPCODE_BYTE_SCATTERED_WRITE:
> +   case SHADER_OPCODE_BYTE_SCATTERED_READ:
> case SHADER_OPCODE_TYPED_ATOMIC:
> case SHADER_OPCODE_TYPED_SURFACE_READ:
> case SHADER_OPCODE_TYPED_SURFACE_WRITE:
> @@ -750,6 +751,16 @@ fs_inst::components_read(unsigned i) const
>else
>   return 1;
>
> +   case SHADER_OPCODE_BYTE_SCATTERED_READ_LOGICAL:
> +  assert(src[3].file == IMM &&
> + src[4].file == IMM);
> +  if (i == 0)
> + return 1;
> +

Re: [Mesa-dev] [PATCH v4 20/44] i965/fs: Add byte scattered read message and fs support

2017-12-04 Thread Chema Casanova
On 30/11/17 21:45, Jason Ekstrand wrote:
> On Wed, Nov 29, 2017 at 6:50 PM, Jose Maria Casanova Crespo
> mailto:jmcasan...@igalia.com>> wrote:
> 
> v2: Fix alignment style (Topi Pohjolainen)
>     (Jason Ekstrand)
>     - Enable bit_size parameter to scattered messages to enable
> different
>       bitsizes byte/word/dword.
>     - Remove use of brw_send_indirect_scattered_message in favor of
>       brw_send_indirect_surface_message.
>     - Move scattered messages to surface messages namespace.
>     - Assert align1 for scattered messages and assume Gen8+.
>     - Inline brw_set_dp_byte_scattered_read.
> ---
>  src/intel/compiler/brw_eu.h                    |  8 +++
>  src/intel/compiler/brw_eu_defines.h            |  2 ++
>  src/intel/compiler/brw_eu_emit.c               | 30
> ++
>  src/intel/compiler/brw_fs.cpp                  | 19 
>  src/intel/compiler/brw_fs_copy_propagation.cpp |  2 ++
>  src/intel/compiler/brw_fs_generator.cpp        |  6 ++
>  src/intel/compiler/brw_fs_surface_builder.cpp  | 11 +-
>  src/intel/compiler/brw_fs_surface_builder.h    |  7 ++
>  src/intel/compiler/brw_shader.cpp              |  6 ++
>  9 files changed, 90 insertions(+), 1 deletion(-)
> 
> diff --git a/src/intel/compiler/brw_eu.h b/src/intel/compiler/brw_eu.h
> index 3ac3b4342a..2d0f56f793 100644
> --- a/src/intel/compiler/brw_eu.h
> +++ b/src/intel/compiler/brw_eu.h
> @@ -485,6 +485,14 @@ brw_typed_surface_write(struct brw_codegen *p,
>                          unsigned msg_length,
>                          unsigned num_channels);
> 
> +void
> +brw_byte_scattered_read(struct brw_codegen *p,
> +                        struct brw_reg dst,
> +                        struct brw_reg payload,
> +                        struct brw_reg surface,
> +                        unsigned msg_length,
> +                        unsigned bit_size);
> +
>  void
>  brw_byte_scattered_write(struct brw_codegen *p,
>                           struct brw_reg payload,
> diff --git a/src/intel/compiler/brw_eu_defines.h
> b/src/intel/compiler/brw_eu_defines.h
> index de6330ee54..aa510ebfa4 100644
> --- a/src/intel/compiler/brw_eu_defines.h
> +++ b/src/intel/compiler/brw_eu_defines.h
> @@ -409,6 +409,8 @@ enum opcode {
>      * opcode, but instead of taking a single payload blog they
> expect their
>      * arguments separately as individual sources, like untyped
> write/read.
>      */
> +   SHADER_OPCODE_BYTE_SCATTERED_READ,
> +   SHADER_OPCODE_BYTE_SCATTERED_READ_LOGICAL,
>     SHADER_OPCODE_BYTE_SCATTERED_WRITE,
>     SHADER_OPCODE_BYTE_SCATTERED_WRITE_LOGICAL,
> 
> diff --git a/src/intel/compiler/brw_eu_emit.c
> b/src/intel/compiler/brw_eu_emit.c
> index ded7e228cf..bdc516848a 100644
> --- a/src/intel/compiler/brw_eu_emit.c
> +++ b/src/intel/compiler/brw_eu_emit.c
> @@ -2998,6 +2998,36 @@ static enum brw_data_size
> brw_data_size_from_bit_size(unsigned bit_size)
>     }
>  }
> 
> +
> +void
> +brw_byte_scattered_read(struct brw_codegen *p,
> +                        struct brw_reg dst,
> +                        struct brw_reg payload,
> +                        struct brw_reg surface,
> +                        unsigned msg_length,
> +                        unsigned bit_size)
> +{
> +   assert(brw_inst_access_mode(p->devinfo, p->current) == BRW_ALIGN_1);
> +   const struct gen_device_info *devinfo = p->devinfo;
> +   const unsigned sfid =  GEN7_SFID_DATAPORT_DATA_CACHE;
> +
> +   struct brw_inst *insn = brw_send_indirect_surface_message(
> +      p, sfid, dst, payload, surface, msg_length,
> +      brw_surface_payload_size(p, 1, true, true),
> +      false);
> +
> +   unsigned msg_control = brw_data_size_from_bit_size(bit_size) << 2;
> +
> +   if (brw_inst_exec_size(devinfo, p->current) == BRW_EXECUTE_16)
> +      msg_control |= 1; /* SIMD16 mode */
> +   else
> +      msg_control |= 0; /* SIMD8 mode */
> +
> +   brw_inst_set_dp_msg_type(devinfo, insn,
> +                            HSW_DATAPORT_DC_PORT0_BYTE_SCATTERED_READ);
> +   brw_inst_set_dp_msg_control(devinfo, insn, msg_control);
> +}
> +
>  void
>  brw_byte_scattered_write(struct brw_codegen *p,
>                           struct brw_reg payload,
> diff --git a/src/intel/compiler/brw_fs.cpp
> b/src/intel/compiler/brw_fs.cpp
> index 32f1d757f0..1ca4d416b2 100644
> --- a/src/intel/compiler/brw_fs.cpp
> +++ b/src/intel/compiler/brw_fs.cpp
> @@ -251,6 +251,7 @@ fs_inst::is_send_from_grf() const
>     case SHADER_OPCODE_UNTYPED_SURFACE_READ:
>     case SHADER_OPCODE_UNTYPED_SURFACE_WRITE:
>     case SHADE

Re: [Mesa-dev] [PATCH v4 20/44] i965/fs: Add byte scattered read message and fs support

2017-12-04 Thread Jason Ekstrand
On Mon, Dec 4, 2017 at 4:50 PM, Chema Casanova 
wrote:

> On 30/11/17 21:45, Jason Ekstrand wrote:
> > On Wed, Nov 29, 2017 at 6:50 PM, Jose Maria Casanova Crespo
> > mailto:jmcasan...@igalia.com>> wrote:
> >
> > v2: Fix alignment style (Topi Pohjolainen)
> > (Jason Ekstrand)
> > - Enable bit_size parameter to scattered messages to enable
> > different
> >   bitsizes byte/word/dword.
> > - Remove use of brw_send_indirect_scattered_message in favor of
> >   brw_send_indirect_surface_message.
> > - Move scattered messages to surface messages namespace.
> > - Assert align1 for scattered messages and assume Gen8+.
> > - Inline brw_set_dp_byte_scattered_read.
> > ---
> >  src/intel/compiler/brw_eu.h|  8 +++
> >  src/intel/compiler/brw_eu_defines.h|  2 ++
> >  src/intel/compiler/brw_eu_emit.c   | 30
> > ++
> >  src/intel/compiler/brw_fs.cpp  | 19
> 
> >  src/intel/compiler/brw_fs_copy_propagation.cpp |  2 ++
> >  src/intel/compiler/brw_fs_generator.cpp|  6 ++
> >  src/intel/compiler/brw_fs_surface_builder.cpp  | 11 +-
> >  src/intel/compiler/brw_fs_surface_builder.h|  7 ++
> >  src/intel/compiler/brw_shader.cpp  |  6 ++
> >  9 files changed, 90 insertions(+), 1 deletion(-)
> >
> > diff --git a/src/intel/compiler/brw_eu.h
> b/src/intel/compiler/brw_eu.h
> > index 3ac3b4342a..2d0f56f793 100644
> > --- a/src/intel/compiler/brw_eu.h
> > +++ b/src/intel/compiler/brw_eu.h
> > @@ -485,6 +485,14 @@ brw_typed_surface_write(struct brw_codegen *p,
> >  unsigned msg_length,
> >  unsigned num_channels);
> >
> > +void
> > +brw_byte_scattered_read(struct brw_codegen *p,
> > +struct brw_reg dst,
> > +struct brw_reg payload,
> > +struct brw_reg surface,
> > +unsigned msg_length,
> > +unsigned bit_size);
> > +
> >  void
> >  brw_byte_scattered_write(struct brw_codegen *p,
> >   struct brw_reg payload,
> > diff --git a/src/intel/compiler/brw_eu_defines.h
> > b/src/intel/compiler/brw_eu_defines.h
> > index de6330ee54..aa510ebfa4 100644
> > --- a/src/intel/compiler/brw_eu_defines.h
> > +++ b/src/intel/compiler/brw_eu_defines.h
> > @@ -409,6 +409,8 @@ enum opcode {
> >  * opcode, but instead of taking a single payload blog they
> > expect their
> >  * arguments separately as individual sources, like untyped
> > write/read.
> >  */
> > +   SHADER_OPCODE_BYTE_SCATTERED_READ,
> > +   SHADER_OPCODE_BYTE_SCATTERED_READ_LOGICAL,
> > SHADER_OPCODE_BYTE_SCATTERED_WRITE,
> > SHADER_OPCODE_BYTE_SCATTERED_WRITE_LOGICAL,
> >
> > diff --git a/src/intel/compiler/brw_eu_emit.c
> > b/src/intel/compiler/brw_eu_emit.c
> > index ded7e228cf..bdc516848a 100644
> > --- a/src/intel/compiler/brw_eu_emit.c
> > +++ b/src/intel/compiler/brw_eu_emit.c
> > @@ -2998,6 +2998,36 @@ static enum brw_data_size
> > brw_data_size_from_bit_size(unsigned bit_size)
> > }
> >  }
> >
> > +
> > +void
> > +brw_byte_scattered_read(struct brw_codegen *p,
> > +struct brw_reg dst,
> > +struct brw_reg payload,
> > +struct brw_reg surface,
> > +unsigned msg_length,
> > +unsigned bit_size)
> > +{
> > +   assert(brw_inst_access_mode(p->devinfo, p->current) ==
> BRW_ALIGN_1);
> > +   const struct gen_device_info *devinfo = p->devinfo;
> > +   const unsigned sfid =  GEN7_SFID_DATAPORT_DATA_CACHE;
> > +
> > +   struct brw_inst *insn = brw_send_indirect_surface_message(
> > +  p, sfid, dst, payload, surface, msg_length,
> > +  brw_surface_payload_size(p, 1, true, true),
> > +  false);
> > +
> > +   unsigned msg_control = brw_data_size_from_bit_size(bit_size) <<
> 2;
> > +
> > +   if (brw_inst_exec_size(devinfo, p->current) == BRW_EXECUTE_16)
> > +  msg_control |= 1; /* SIMD16 mode */
> > +   else
> > +  msg_control |= 0; /* SIMD8 mode */
> > +
> > +   brw_inst_set_dp_msg_type(devinfo, insn,
> > +HSW_DATAPORT_DC_PORT0_BYTE_
> SCATTERED_READ);
> > +   brw_inst_set_dp_msg_control(devinfo, insn, msg_control);
> > +}
> > +
> >  void
> >  brw_byte_scattered_write(struct brw_codegen *p,
> >   struct brw_reg payload,
> > diff --git a/src/intel/compiler/brw_fs.cpp
> > b/src/intel/compiler/brw_fs.cpp
> > index 32f1d757f0..1ca4d41