ac/sdma: fix src/dst pitch for sdma < 4
Some checks are pending
macOS-CI / macOS-CI (dri) (push) Waiting to run
macOS-CI / macOS-CI (xlib) (push) Waiting to run

Fixes DRM_PRIME with AMD_DEBUG=notiling.

Fixes: 5f8fa6ae03 ("ac,radv,radeonsi: add ac_emit_sdma_copy_linear_sub_window()")
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39019>
This commit is contained in:
Pierre-Eric Pelloux-Prayer 2025-12-18 16:12:12 +01:00
parent 2f347b5725
commit bfa8dcf3b3

View file

@ -151,12 +151,13 @@ ac_emit_sdma_copy_linear_sub_window(struct ac_cmdbuf *cs, enum sdma_version sdma
/* This packet is the same since SDMA v2.4, haven't bothered to check older versions.
* The main difference is the bitfield sizes:
*
* v2.4 - src/dst_pitch: 14 bits, rect_z: 11 bits
* v4.0 - src/dst_pitch: 19 bits, rect_z: 11 bits
* v5.0 - src/dst_pitch: 19 bits, rect_z: 13 bits
* v2.4 - src/dst_pitch: 14 bits (shift: 16), rect_z: 11 bits
* v4.0 - src/dst_pitch: 19 bits (shift: 13), rect_z: 11 bits
* v5.0 - src/dst_pitch: 19 bits (shift: 13), rect_z: 13 bits
*
* We currently use the smallest limits (from SDMA v2.4).
*/
uint32_t pitch_shift = (sdma_ip_version >= SDMA_7_0 || sdma_ip_version < SDMA_4_0) ? 16 : 13;
assert(src->bpp == dst->bpp);
assert(util_is_power_of_two_nonzero(src->bpp));
ac_sdma_check_pitches(src->pitch, src->slice_pitch, src->bpp, false);
@ -168,12 +169,12 @@ ac_emit_sdma_copy_linear_sub_window(struct ac_cmdbuf *cs, enum sdma_version sdma
ac_cmdbuf_emit(src->va);
ac_cmdbuf_emit(src->va >> 32);
ac_cmdbuf_emit(src->offset.x | src->offset.y << 16);
ac_cmdbuf_emit(src->offset.z | (src->pitch - 1) << (sdma_ip_version >= SDMA_7_0 ? 16 : 13));
ac_cmdbuf_emit(src->offset.z | (src->pitch - 1) << pitch_shift);
ac_cmdbuf_emit(src->slice_pitch - 1);
ac_cmdbuf_emit(dst->va);
ac_cmdbuf_emit(dst->va >> 32);
ac_cmdbuf_emit(dst->offset.x | dst->offset.y << 16);
ac_cmdbuf_emit(dst->offset.z | (dst->pitch - 1) << (sdma_ip_version >= SDMA_7_0 ? 16 : 13));
ac_cmdbuf_emit(dst->offset.z | (dst->pitch - 1) << pitch_shift);
ac_cmdbuf_emit(dst->slice_pitch - 1);
if (sdma_ip_version == SDMA_2_0) {
ac_cmdbuf_emit(width | (height << 16));