From e6f5494242244520208f9d25e0ecb9d59908b3b9 Mon Sep 17 00:00:00 2001 From: Gwilym Kuiper Date: Sat, 11 Jun 2022 17:22:29 +0100 Subject: [PATCH] Use the syscall to do the memset because the default implementation is really slow --- agb/src/sound/mixer/sw_mixer.rs | 4 +++- agb/src/syscall.rs | 30 ++++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/agb/src/sound/mixer/sw_mixer.rs b/agb/src/sound/mixer/sw_mixer.rs index 5604672..629dd3e 100644 --- a/agb/src/sound/mixer/sw_mixer.rs +++ b/agb/src/sound/mixer/sw_mixer.rs @@ -5,6 +5,7 @@ use bare_metal::{CriticalSection, Mutex}; use super::hw; use super::hw::LeftOrRight; use super::{SoundChannel, SoundPriority}; +use crate::syscall::cpu_fast_fill_i8; use crate::{ fixnum::Num, interrupt::free, @@ -284,7 +285,8 @@ impl MixerBuffer { let write_buffer_index = free(|cs| self.state.borrow(*cs).borrow_mut().active_advanced()); let write_buffer = &mut self.buffers[write_buffer_index].0; - write_buffer.fill(0); + cpu_fast_fill_i8(write_buffer, 0); + unsafe { agb_rs__mixer_collapse(write_buffer.as_mut_ptr(), buffer.as_ptr()); } diff --git a/agb/src/syscall.rs b/agb/src/syscall.rs index 3e9492d..da94ee6 100644 --- a/agb/src/syscall.rs +++ b/agb/src/syscall.rs @@ -2,7 +2,6 @@ use core::arch::asm; // use crate::display::object::AffineMatrixAttributes; - #[allow(non_snake_case)] pub fn halt() { @@ -94,6 +93,9 @@ pub fn arc_tan(n: i16) -> i16 { "swi 0x09", in("r0") n, lateout("r0") result, + lateout("r1") _, + lateout("r2") _, + lateout("r3") _ ); } result @@ -107,12 +109,36 @@ pub fn arc_tan2(x: i16, y: i32) -> i16 { in("r0") x, in("r1") y, lateout("r0") result, - + lateout("r2") _, + lateout("r3") _ ); } result } +pub(crate) fn cpu_fast_fill_i8(input: &mut [i8], new_content: i32) { + assert_eq!( + input.len() % (4 * 8), + 0, + "Input length must be divisible by 32" + ); + + let input_ptr = [new_content].as_ptr(); + let output_ptr = input.as_mut_ptr(); + let length_mode = (1 << 24) | // copy + (input.len() / 4); + + unsafe { + asm!( + "swi 0x0c", + in("r0") input_ptr, + in("r1") output_ptr, + in("r2") length_mode, + lateout("r3") _, + ); + } +} + // pub fn affine_matrix( // x_scale: Num, // y_scale: Num,