Skip to content

Commit f8150ce

Browse files
committed
Avoid unnecessary copy in dma
1 parent ec5f727 commit f8150ce

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

src/core/memory/dma.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,15 @@ impl Emu {
283283
*src_addr += total_size;
284284
}
285285
(DmaAddrCtrl::Increment, DmaAddrCtrl::Increment | DmaAddrCtrl::IncrementReload) => {
286-
let slice = unsafe { slice::from_raw_parts_mut(dma.src_buf.as_mut_ptr() as *mut T, count as usize) };
287-
self.mem_read_multiple_slice::<CPU, false, true, T>(*src_addr, slice);
286+
let mut slice = unsafe { slice::from_raw_parts_mut(dma.src_buf.as_mut_ptr() as *mut T, count as usize) };
287+
let aligned_addr = *src_addr & !(size_of::<T>() as u32 - 1);
288+
let aligned_addr = aligned_addr & 0x0FFFFFFF;
289+
let shm_offset = self.get_shm_offset::<CPU, false, false>(aligned_addr);
290+
if shm_offset != 0 {
291+
slice = unsafe { slice::from_raw_parts_mut(self.mem.shm.as_ptr().add(shm_offset) as *mut T, count as usize) };
292+
} else {
293+
self.mem_read_multiple_slice::<CPU, false, false, T>(aligned_addr, slice);
294+
}
288295
self.mem_write_multiple_slice::<CPU, false, T>(*dest_addr, slice);
289296
*src_addr += total_size;
290297
*dest_addr += total_size;

0 commit comments

Comments
 (0)