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

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

intel/compiler: Delete repclear shader's special case for 1 color target

This is basically just once through the loop but copy and pasted.  One
difference is that the single render target case used a headerless
message, and the multiple render target case always used headers.

Now we use headerless messages for the first render target, even in the
multiple render target case.  While we already have it set up for the
other RTs, it's still 2 fewer registers to send.  Minor improvement.

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 | 41 ++++++++++++++++-------------------------
 1 file changed, 16 insertions(+), 25 deletions(-)

diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp
index 2d81e5f0897..65f5e9fbf1e 100644
--- a/src/intel/compiler/brw_fs.cpp
+++ b/src/intel/compiler/brw_fs.cpp
@@ -3599,10 +3599,10 @@ void
 fs_visitor::emit_repclear_shader()
 {
    brw_wm_prog_key *key = (brw_wm_prog_key*) this->key;
-   int base_mrf = 0;
-   int color_mrf = base_mrf + 2;
+   int color_mrf = 2;
 
    assert(uniforms == 0);
+   assume(key->nr_color_regions > 0);
 
    struct brw_reg reg =
       brw_reg(BRW_GENERAL_REGISTER_FILE, 2, 3, 0, 0, BRW_REGISTER_TYPE_UD,
@@ -3612,34 +3612,25 @@ fs_visitor::emit_repclear_shader()
    bld.exec_all().group(4, 0).MOV(brw_uvec_mrf(4, color_mrf, 0), fs_reg(reg));
 
    fs_inst *write = NULL;
-   if (key->nr_color_regions == 1) {
-      write = bld.emit(FS_OPCODE_REP_FB_WRITE);
-      write->saturate = key->clamp_fragment_color;
-      write->base_mrf = color_mrf;
-      write->target = 0;
-      write->header_size = 0;
-      write->mlen = 1;
-   } else {
-      assume(key->nr_color_regions > 0);
+   struct brw_reg header;
 
-      struct brw_reg header =
-         retype(brw_message_reg(base_mrf), BRW_REGISTER_TYPE_UD);
+   if (key->nr_color_regions > 1) {
+      header = retype(brw_message_reg(color_mrf - 2), BRW_REGISTER_TYPE_UD);
       bld.exec_all().group(16, 0)
          .MOV(header, retype(brw_vec8_grf(0, 0), BRW_REGISTER_TYPE_UD));
+   }
 
-      for (int i = 0; i < key->nr_color_regions; ++i) {
-         if (i > 0) {
-            bld.exec_all().group(1, 0)
-               .MOV(component(header, 2), brw_imm_ud(i));
-         }
+   for (int i = 0; i < key->nr_color_regions; ++i) {
+      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->saturate = key->clamp_fragment_color;
-         write->base_mrf = base_mrf;
-         write->target = i;
-         write->header_size = 2;
-         write->mlen = 3;
-      }
+      write = bld.emit(FS_OPCODE_REP_FB_WRITE);
+      write->saturate = key->clamp_fragment_color;
+      write->target = i;
+      /* 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