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.oliveira@intel.com>
Reviewed-by: Emma Anholt <emma@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20172>
This commit is contained in:
Kenneth Graunke
2022-11-23 01:47:55 -08:00
committed by Marge Bot
parent ef7d1b5f44
commit 48f60f4c4b
+32 -10
View File
@@ -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;