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;