From f20df2984d6fb08567eff41ed209d4d1fb867b8c Mon Sep 17 00:00:00 2001 From: Caio Oliveira Date: Fri, 6 Sep 2024 15:11:34 -0700 Subject: [PATCH] intel/brw: Ensure BROADCAST() value respect register alignment If we have a non-register-aligned source, MOV it to a new register so that the invariant expected when generating SHADER_OPCODE_BROADCAST is respected. Added to ensure a later patch won't hit the `src.subnr == 0` assertion in brw_broadcast() generation code. Reviewed-by: Kenneth Graunke Part-of: --- src/intel/compiler/brw_fs_builder.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/intel/compiler/brw_fs_builder.h b/src/intel/compiler/brw_fs_builder.h index ab93b90e046..e2a709bff91 100644 --- a/src/intel/compiler/brw_fs_builder.h +++ b/src/intel/compiler/brw_fs_builder.h @@ -773,6 +773,13 @@ namespace brw { BROADCAST(brw_reg value, brw_reg index) const { const brw_reg dst = vgrf(value.type); + + /* Ensure that the source of a broadcast is always register aligned. + * See brw_broadcast() non-scalar case for more details. + */ + if (reg_offset(value) % (REG_SIZE * reg_unit(shader->devinfo)) != 0) + value = MOV(value); + exec_all().emit(SHADER_OPCODE_BROADCAST, dst, value, index); return component(dst, 0); }