Module: Mesa
Branch: main
Commit: 48f60f4c4b6b91aabfeec1d32298f0d546ecbad9
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=48f60f4c4b6b91aabfeec1d32298f0d546ecbad9

Author: Kenneth Graunke <kenn...@whitecape.org>
Date:   Wed Nov 23 01:47:55 2022 -0800

intel/compiler: Convert the repclear shader to use send-from-GRF

Sandybridge uses this code and needs MRFs, but all other platforms send
from GRFs.  Do that directly rather than relying on the MRF hack.

Ivybridge and later also use SHADER_OPCODE_SEND directly rather than
a virtual opcode that's handled in the generator, so we follow suit.

Reviewed-by: Caio Oliveira <caio.olive...@intel.com>
Reviewed-by: Emma Anholt <e...@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20172>

---

 src/intel/compiler/brw_fs.cpp | 42 ++++++++++++++++++++++++++++++++----------
 1 file changed, 32 insertions(+), 10 deletions(-)

diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp
index 56effbf00b8..74840c93107 100644
--- a/src/intel/compiler/brw_fs.cpp
+++ b/src/intel/compiler/brw_fs.cpp
@@ -3599,23 +3599,30 @@ void
 fs_visitor::emit_repclear_shader()
 {
    brw_wm_prog_key *key = (brw_wm_prog_key*) this->key;
-   int color_mrf = 2;
+   fs_inst *write = NULL;
 
    assert(uniforms == 0);
    assume(key->nr_color_regions > 0);
 
-   struct brw_reg reg =
+   fs_reg color_output, header;
+   if (devinfo->ver >= 7) {
+      color_output = retype(brw_vec4_grf(127, 0), BRW_REGISTER_TYPE_UD);
+      header = retype(brw_vec8_grf(125, 0), BRW_REGISTER_TYPE_UD);
+   } else {
+      color_output = retype(brw_vec4_reg(MRF, 2, 0), BRW_REGISTER_TYPE_UD);
+      header = retype(brw_vec8_reg(MRF, 0, 0), BRW_REGISTER_TYPE_UD);
+   }
+
+   /* We pass the clear color as a flat input.  Copy it to the output. */
+   fs_reg color_input =
       brw_reg(BRW_GENERAL_REGISTER_FILE, 2, 3, 0, 0, BRW_REGISTER_TYPE_UD,
               BRW_VERTICAL_STRIDE_8, BRW_WIDTH_2, BRW_HORIZONTAL_STRIDE_4,
               BRW_SWIZZLE_XYZW, WRITEMASK_XYZW);
 
-   bld.exec_all().group(4, 0).MOV(brw_uvec_mrf(4, color_mrf, 0), fs_reg(reg));
-
-   fs_inst *write = NULL;
-   struct brw_reg header;
+   bld.exec_all().group(4, 0).MOV(color_output, color_input);
 
    if (key->nr_color_regions > 1) {
-      header = retype(brw_message_reg(color_mrf - 2), BRW_REGISTER_TYPE_UD);
+      /* Copy g0..g1 as the message header */
       bld.exec_all().group(16, 0)
          .MOV(header, retype(brw_vec8_grf(0, 0), BRW_REGISTER_TYPE_UD));
    }
@@ -3624,12 +3631,27 @@ fs_visitor::emit_repclear_shader()
       if (i > 0)
          bld.exec_all().group(1, 0).MOV(component(header, 2), brw_imm_ud(i));
 
-      write = bld.emit(FS_OPCODE_REP_FB_WRITE);
-      write->target = i;
+      if (devinfo->ver >= 7) {
+         write = bld.emit(SHADER_OPCODE_SEND);
+         write->resize_sources(3);
+         write->sfid = GFX6_SFID_DATAPORT_RENDER_CACHE;
+         write->src[0] = brw_imm_ud(0);
+         write->src[1] = brw_imm_ud(0);
+         write->src[2] = i == 0 ? color_output : header;
+         write->check_tdr = true;
+         write->send_has_side_effects = true;
+         write->desc = brw_fb_write_desc(devinfo, i,
+            BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD16_SINGLE_SOURCE_REPLICATED,
+            i == key->nr_color_regions - 1, false);
+      } else {
+         write = bld.emit(FS_OPCODE_REP_FB_WRITE);
+         write->target = i;
+         write->base_mrf = i == 0 ? color_output.nr : header.nr;
+      }
+
       /* We can use a headerless message for the first render target */
       write->header_size = i == 0 ? 0 : 2;
       write->mlen = 1 + write->header_size;
-      write->base_mrf = color_mrf - write->header_size;
    }
    write->eot = true;
    write->last_rt = true;

Reply via email to