aco: add missing usable_read2 check

A Hitman 2 shader does: read64(local_invocation_index() * 4 - 4). This was
likely emitting a ds_read2_b32 on GFX6. For local_invocation_index()=0,
because the first dword was out-of-bounds, the second was likely also
considered out-of-bounds (even though it's not, at offset 0).

Likely fixes https://gitlab.freedesktop.org/mesa/mesa/-/issues/3882

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Fixes: 57e6886f98 ("aco: refactor load_lds to use new helpers")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9332>
This commit is contained in:
Rhys Perry 2021-02-26 16:05:40 +00:00 committed by Marge Bot
parent 941739619e
commit 3a72044ece

View file

@ -3483,7 +3483,7 @@ Temp lds_load_callback(Builder& bld, const LoadEmitInfo &info,
} else if (bytes_needed >= 8 && align % 8 == 0) { } else if (bytes_needed >= 8 && align % 8 == 0) {
size = 8; size = 8;
op = aco_opcode::ds_read_b64; op = aco_opcode::ds_read_b64;
} else if (bytes_needed >= 8 && align % 4 == 0 && const_offset % 4 == 0) { } else if (bytes_needed >= 8 && align % 4 == 0 && const_offset % 4 == 0 && usable_read2) {
size = 8; size = 8;
read2 = true; read2 = true;
op = aco_opcode::ds_read2_b32; op = aco_opcode::ds_read2_b32;