intel/compiler: rework message descriptors for render targets
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Thu, 4 Feb 2021 09:49:29 +0000 (11:49 +0200)
committerMarge Bot <eric+marge@anholt.net>
Sun, 2 May 2021 20:20:06 +0000 (20:20 +0000)
Render target message descriptors are slightly different from the
dataport ones. In particular the msg_type field is on bits 14:17 for
RT while bits 14:18 for DP.

v2: Drop unused send_commit_msg field in brw_fb_write_desc() (Ken)

v3: Rebase on top renaming (Lionel)

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Suggested-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7455>

src/intel/compiler/brw_disasm.c
src/intel/compiler/brw_eu.h
src/intel/compiler/brw_eu_emit.c
src/intel/compiler/brw_fs.cpp
src/intel/compiler/brw_fs_reg_allocate.cpp
src/intel/compiler/brw_vec4_generator.cpp

index 9e9fcc9..6e3312e 100644 (file)
@@ -1956,7 +1956,7 @@ brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
 
          case GFX6_SFID_DATAPORT_RENDER_CACHE: {
             /* aka BRW_SFID_DATAPORT_WRITE on Gfx4-5 */
-            unsigned msg_type = brw_dp_write_desc_msg_type(devinfo, imm_desc);
+            unsigned msg_type = brw_fb_write_desc_msg_type(devinfo, imm_desc);
 
             err |= control(file, "DP rc message type",
                            dp_rc_msg_type(devinfo), msg_type, &space);
@@ -1970,18 +1970,18 @@ brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
                               brw_inst_rt_message_type(devinfo, inst), &space);
                if (devinfo->ver >= 6 && brw_inst_rt_slot_group(devinfo, inst))
                   string(file, " Hi");
-               if (brw_dp_write_desc_last_render_target(devinfo, imm_desc))
+               if (brw_fb_write_desc_last_render_target(devinfo, imm_desc))
                   string(file, " LastRT");
                if (devinfo->ver < 7 &&
-                   brw_dp_write_desc_write_commit(devinfo, imm_desc))
+                   brw_fb_write_desc_write_commit(devinfo, imm_desc))
                   string(file, " WriteCommit");
             } else {
                format(file, " MsgCtrl = 0x%u",
-                      brw_dp_write_desc_msg_control(devinfo, imm_desc));
+                      brw_fb_write_desc_msg_control(devinfo, imm_desc));
             }
 
             format(file, " Surface = %u",
-                   brw_dp_desc_binding_table_index(devinfo, imm_desc));
+                   brw_fb_desc_binding_table_index(devinfo, imm_desc));
             break;
          }
 
index 138eb2b..4d2197f 100644 (file)
@@ -555,20 +555,18 @@ brw_dp_write_desc(const struct intel_device_info *devinfo,
                   unsigned binding_table_index,
                   unsigned msg_control,
                   unsigned msg_type,
-                  unsigned last_render_target,
                   unsigned send_commit_msg)
 {
    assert(devinfo->ver <= 6 || !send_commit_msg);
-   if (devinfo->ver >= 6)
+   if (devinfo->ver >= 6) {
       return brw_dp_desc(devinfo, binding_table_index, msg_type, msg_control) |
-             SET_BITS(last_render_target, 12, 12) |
              SET_BITS(send_commit_msg, 17, 17);
-   else
+   } else {
       return (SET_BITS(binding_table_index, 7, 0) |
               SET_BITS(msg_control, 11, 8) |
-              SET_BITS(last_render_target, 11, 11) |
               SET_BITS(msg_type, 14, 12) |
               SET_BITS(send_commit_msg, 15, 15));
+   }
 }
 
 static inline unsigned
@@ -592,16 +590,6 @@ brw_dp_write_desc_msg_control(const struct intel_device_info *devinfo,
 }
 
 static inline bool
-brw_dp_write_desc_last_render_target(const struct intel_device_info *devinfo,
-                                     uint32_t desc)
-{
-   if (devinfo->ver >= 6)
-      return GET_BITS(desc, 12, 12);
-   else
-      return GET_BITS(desc, 11, 11);
-}
-
-static inline bool
 brw_dp_write_desc_write_commit(const struct intel_device_info *devinfo,
                                uint32_t desc)
 {
@@ -1026,6 +1014,130 @@ brw_dp_typed_surface_rw_desc(const struct intel_device_info *devinfo,
 }
 
 static inline uint32_t
+brw_fb_desc(const struct intel_device_info *devinfo,
+            unsigned binding_table_index,
+            unsigned msg_type,
+            unsigned msg_control)
+{
+   /* Prior to gen6, things are too inconsistent; use the fb_(read|write)_desc
+    * helpers instead.
+    */
+   assert(devinfo->ver >= 6);
+   const unsigned desc = SET_BITS(binding_table_index, 7, 0);
+   if (devinfo->ver >= 7) {
+      return (desc | SET_BITS(msg_control, 13, 8) |
+              SET_BITS(msg_type, 17, 14));
+   } else {
+      return (desc | SET_BITS(msg_control, 12, 8) |
+              SET_BITS(msg_type, 16, 13));
+   }
+}
+
+static inline unsigned
+brw_fb_desc_binding_table_index(UNUSED const struct intel_device_info *devinfo,
+                                uint32_t desc)
+{
+   return GET_BITS(desc, 7, 0);
+}
+
+static inline uint32_t
+brw_fb_desc_msg_control(const struct intel_device_info *devinfo, uint32_t desc)
+{
+   assert(devinfo->ver >= 6);
+   if (devinfo->ver >= 7)
+      return GET_BITS(desc, 13, 8);
+   else
+      return GET_BITS(desc, 12, 8);
+}
+
+static inline unsigned
+brw_fb_desc_msg_type(const struct intel_device_info *devinfo, uint32_t desc)
+{
+   assert(devinfo->ver >= 6);
+   if (devinfo->ver >= 7)
+      return GET_BITS(desc, 17, 14);
+   else
+      return GET_BITS(desc, 16, 13);
+}
+
+static inline uint32_t
+brw_fb_read_desc(const struct intel_device_info *devinfo,
+                 unsigned binding_table_index,
+                 unsigned msg_control,
+                 unsigned exec_size,
+                 bool per_sample)
+{
+   assert(devinfo->ver >= 9);
+   return brw_fb_desc(devinfo, binding_table_index,
+                      GFX9_DATAPORT_RC_RENDER_TARGET_READ, msg_control) |
+          SET_BITS(per_sample, 13, 13) |
+          SET_BITS(exec_size == 16, 8, 8) /* Render Target Message Subtype */;
+}
+
+static inline uint32_t
+brw_fb_write_desc(const struct intel_device_info *devinfo,
+                  unsigned binding_table_index,
+                  unsigned msg_control,
+                  bool last_render_target)
+{
+   const unsigned msg_type =
+      devinfo->ver >= 6 ?
+      GFX6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE :
+      BRW_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE;
+
+   if (devinfo->ver >= 6) {
+      return brw_fb_desc(devinfo, binding_table_index, msg_type, msg_control) |
+             SET_BITS(last_render_target, 12, 12);
+   } else {
+      return (SET_BITS(binding_table_index, 7, 0) |
+              SET_BITS(msg_control, 11, 8) |
+              SET_BITS(last_render_target, 11, 11) |
+              SET_BITS(msg_type, 14, 12));
+   }
+}
+
+static inline unsigned
+brw_fb_write_desc_msg_type(const struct intel_device_info *devinfo,
+                           uint32_t desc)
+{
+   if (devinfo->ver >= 6)
+      return brw_fb_desc_msg_type(devinfo, desc);
+   else
+      return GET_BITS(desc, 14, 12);
+}
+
+static inline unsigned
+brw_fb_write_desc_msg_control(const struct intel_device_info *devinfo,
+                              uint32_t desc)
+{
+   if (devinfo->ver >= 6)
+      return brw_fb_desc_msg_control(devinfo, desc);
+   else
+      return GET_BITS(desc, 11, 8);
+}
+
+static inline bool
+brw_fb_write_desc_last_render_target(const struct intel_device_info *devinfo,
+                                     uint32_t desc)
+{
+   if (devinfo->ver >= 6)
+      return GET_BITS(desc, 12, 12);
+   else
+      return GET_BITS(desc, 11, 11);
+}
+
+static inline bool
+brw_fb_write_desc_write_commit(const struct intel_device_info *devinfo,
+                               uint32_t desc)
+{
+   assert(devinfo->ver <= 6);
+   if (devinfo->ver >= 6)
+      return GET_BITS(desc, 17, 17);
+   else
+      return GET_BITS(desc, 15, 15);
+}
+
+static inline uint32_t
 brw_mdc_sm2(unsigned exec_size)
 {
    assert(exec_size == 8 || exec_size == 16);
index 4404a79..fbe6c31 100644 (file)
@@ -2224,8 +2224,7 @@ void brw_oword_block_write_scratch(struct brw_codegen *p,
                    brw_message_desc(devinfo, mlen, send_commit_msg, true) |
                    brw_dp_write_desc(devinfo, brw_scratch_surface_idx(p),
                                      BRW_DATAPORT_OWORD_BLOCK_DWORDS(num_regs * 8),
-                                     msg_type, 0, /* not a render target */
-                                     send_commit_msg));
+                                     msg_type, send_commit_msg));
    }
 }
 
@@ -2434,7 +2433,6 @@ brw_fb_WRITE(struct brw_codegen *p,
       (devinfo->ver >= 6 ? GFX6_SFID_DATAPORT_RENDER_CACHE :
        BRW_SFID_DATAPORT_WRITE);
    brw_inst *insn;
-   unsigned msg_type;
    struct brw_reg dest, src0;
 
    if (brw_get_default_exec_size(p) >= BRW_EXECUTE_16)
@@ -2453,14 +2451,10 @@ brw_fb_WRITE(struct brw_codegen *p,
    if (devinfo->ver >= 6) {
       /* headerless version, just submit color payload */
       src0 = payload;
-
-      msg_type = GFX6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE;
    } else {
       assert(payload.file == BRW_MESSAGE_REGISTER_FILE);
       brw_inst_set_base_mrf(devinfo, insn, payload.nr);
       src0 = implied_header;
-
-      msg_type = BRW_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE;
    }
 
    brw_set_dest(p, insn, dest);
@@ -2468,9 +2462,8 @@ brw_fb_WRITE(struct brw_codegen *p,
    brw_set_desc(p, insn,
                 brw_message_desc(devinfo, msg_length, response_length,
                                  header_present) |
-                brw_dp_write_desc(devinfo, binding_table_index, msg_control,
-                                  msg_type, last_render_target,
-                                  0 /* send_commit_msg */));
+                brw_fb_write_desc(devinfo, binding_table_index, msg_control,
+                                  last_render_target));
    brw_inst_set_eot(devinfo, insn, eot);
 
    return insn;
@@ -2487,8 +2480,6 @@ gfx9_fb_READ(struct brw_codegen *p,
 {
    const struct intel_device_info *devinfo = p->devinfo;
    assert(devinfo->ver >= 9);
-   const unsigned msg_subtype =
-      brw_get_default_exec_size(p) == BRW_EXECUTE_16 ? 0 : 1;
    brw_inst *insn = next_insn(p, BRW_OPCODE_SENDC);
 
    brw_inst_set_sfid(devinfo, insn, GFX6_SFID_DATAPORT_RENDER_CACHE);
@@ -2497,10 +2488,8 @@ gfx9_fb_READ(struct brw_codegen *p,
    brw_set_desc(
       p, insn,
       brw_message_desc(devinfo, msg_length, response_length, true) |
-      brw_dp_read_desc(devinfo, binding_table_index,
-                       per_sample << 5 | msg_subtype,
-                       GFX9_DATAPORT_RC_RENDER_TARGET_READ,
-                       BRW_DATAPORT_READ_TARGET_RENDER_CACHE));
+      brw_fb_read_desc(devinfo, binding_table_index, 0 /* msg_control */,
+                       brw_get_default_exec_size(p), per_sample));
    brw_inst_set_rt_slot_group(devinfo, insn, brw_get_default_group(p) / 16);
 
    return insn;
@@ -3094,7 +3083,6 @@ brw_svb_write(struct brw_codegen *p,
                 brw_dp_write_desc(devinfo, binding_table_index,
                                   0, /* msg_control: ignored */
                                   GFX6_DATAPORT_WRITE_MESSAGE_STREAMED_VB_WRITE,
-                                  0, /* last_render_target: ignored */
                                   send_commit_msg)); /* send_commit_msg */
 }
 
index 4e3476f..0a4dfa9 100644 (file)
@@ -4663,9 +4663,7 @@ lower_fb_write_logical_send(const fs_builder &bld, fs_inst *inst,
 
       inst->desc =
          (inst->group / 16) << 11 | /* rt slot group */
-         brw_dp_write_desc(devinfo, inst->target, msg_ctl,
-                           GFX6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE,
-                           inst->last_rt, false);
+         brw_fb_write_desc(devinfo, inst->target, msg_ctl, inst->last_rt);
 
       uint32_t ex_desc = 0;
       if (devinfo->ver >= 11) {
index 992aaa6..06ea363 100644 (file)
@@ -969,7 +969,6 @@ fs_reg_alloc::emit_spill(const fs_builder &bld, fs_reg src,
             brw_dp_write_desc(devinfo, GFX8_BTI_STATELESS_NON_COHERENT,
                               BRW_DATAPORT_OWORD_BLOCK_DWORDS(reg_size * 8),
                               GFX6_DATAPORT_WRITE_MESSAGE_OWORD_BLOCK_WRITE,
-                              0 /* not a render target */,
                               false /* send_commit_msg */);
       } else {
          spill_inst = bld.emit(SHADER_OPCODE_GFX4_SCRATCH_WRITE,
index 055aaf6..e23312a 100644 (file)
@@ -1259,7 +1259,6 @@ generate_scratch_write(struct brw_codegen *p,
                                   brw_scratch_surface_idx(p),
                                   BRW_DATAPORT_OWORD_DUAL_BLOCK_1OWORD,
                                   msg_type,
-                                  false, /* not a render target write */
                                   write_commit));
 }