diff --git a/src/amd/common/ac_cmdbuf_sdma.c b/src/amd/common/ac_cmdbuf_sdma.c index ac5d9316aab..afd1788147f 100644 --- a/src/amd/common/ac_cmdbuf_sdma.c +++ b/src/amd/common/ac_cmdbuf_sdma.c @@ -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));