From b094815ecb16bec069fe637c9f0a54acf824b4e1 Mon Sep 17 00:00:00 2001 From: Tony Wasserka Date: Sat, 9 Mar 2024 20:02:29 +0100 Subject: [PATCH] Make DSP emulation opt-in --- externals/teakra | 2 +- source/framework/settings.hpp | 7 ++++++- source/gui-sdl/main.cpp | 3 +++ source/os.cpp | 21 ++++++++++++++++----- source/settings.cpp | 3 +++ 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/externals/teakra b/externals/teakra index ad99cb9..019d18c 160000 --- a/externals/teakra +++ b/externals/teakra @@ -1 +1 @@ -Subproject commit ad99cb93dec7a042e3736d506783fb2dc1117851 +Subproject commit 019d18c7ee137899030b378feca038cd7789a1b7 diff --git a/source/framework/settings.hpp b/source/framework/settings.hpp index 64cea6c..e4f6e18 100644 --- a/source/framework/settings.hpp +++ b/source/framework/settings.hpp @@ -89,6 +89,10 @@ struct ShaderEngineTag : Config::OptionDefault { static constexpr const char* name = "ShaderEngine"; }; +struct EnableAudioEmulation : Config::BooleanOption { + static constexpr const char* name = "EnableAudioEmulation"; +}; + struct Settings : Config::Options { }; + ShaderEngineTag, + EnableAudioEmulation> { }; } // namespace Settings diff --git a/source/gui-sdl/main.cpp b/source/gui-sdl/main.cpp index 7c49c65..8022810 100644 --- a/source/gui-sdl/main.cpp +++ b/source/gui-sdl/main.cpp @@ -196,6 +196,7 @@ int main(int argc, char* argv[]) { ("shader_engine", bpo::value()->default_value(Settings::ShaderEngineTag::default_value()), "Select which Shader engine to use (interpreter, bytecode, or glsl)") ("enable_logging", bpo::bool_switch(&enable_logging), "Enable logging (slow!)") ("bootstrap_nand", bpo::bool_switch(&bootstrap_nand), "Bootstrap NAND from game update partition") + ("enable_audio", bpo::bool_switch(), "Enable audio emulation (slow!)") ; boost::program_options::positional_options_description p; @@ -252,6 +253,8 @@ int main(int argc, char* argv[]) { std::exit(1); } + settings.set(vm["enable_audio"].as()); + if (vm.count("input")) { Settings::InitialApplicationTag::HostFile file{vm["input"].as()}; settings.set({file}); diff --git a/source/os.cpp b/source/os.cpp index 99ead04..0c570ab 100644 --- a/source/os.cpp +++ b/source/os.cpp @@ -5432,6 +5432,17 @@ uint64_t OS::GetTimeInNanoSeconds() const { static ticks dsp_tick; OS* g_os = nullptr; +static ticks GetDspTick(OS& os) { + if (os.settings.get()) { + // DSP clock rate is half the CPU clock rate + return os.system_tick / 2; + } else { + // Disabling DSP emulation entirely would break games. + // However we can safely underclock the DSP to save work. + return os.system_tick / 64; + } +} + void SetupOSDSPCallbacks(OS& os) { static auto dsp_interrupt_handlera = [&os]() { fprintf(stderr, "DSP INTERRUPT0\n"); @@ -5457,7 +5468,7 @@ void SetupOSDSPCallbacks(OS& os) { g_teakra->SetRecvDataHandler(2, dsp_interrupt_handlerc); g_teakra->SetSemaphoreHandler(dsp_interrupt_handler2); } - dsp_tick = os.system_tick / 2; + dsp_tick = GetDspTick(os); } void OS::EnterExecutionLoop() { @@ -5479,7 +5490,7 @@ void OS::EnterExecutionLoop() { // NotifyInterrupt(0x4a); // }; - /*auto */dsp_tick = system_tick / 2; + /*auto */dsp_tick = GetDspTick(*this); while (!stop_requested) { // TODO: Gather these from the "caller" (i.e. the coroutine) @@ -5492,20 +5503,20 @@ void OS::EnterExecutionLoop() { // g_teakra->SetRecvDataHandler(1, dsp_interrupt_handlerb); // g_teakra->SetRecvDataHandler(2, dsp_interrupt_handlerc); // g_teakra->SetSemaphoreHandler(dsp_interrupt_handler2); -// dsp_tick = system_tick / 2; +// dsp_tick = GetDspTick(*this); // } // Run DSP time slices of at least 100 ticks. // This number was carefully chosen, since too large minimum bounds // trigger hangs. - auto dsp_tick_diff = system_tick / 2 - dsp_tick; + auto dsp_tick_diff = GetDspTick(*this) - dsp_tick; if (dsp_tick_diff.count() > 100) { // For profiling, present DSP emulation as one logical fiber TracyFiberEnter("DSP"); TracyCZoneN(DSPSliceZone, "DSPSlice", true); // fprintf(stderr, "Running %d teakra cycles\n", (int)dsp_tick_diff.count()); g_teakra->Run(dsp_tick_diff.count()); - dsp_tick = system_tick / 2; + dsp_tick = GetDspTick(*this); TracyCZoneEnd(DSPSliceZone); TracyFiberLeave; } diff --git a/source/settings.cpp b/source/settings.cpp index 2a0b42f..218ee73 100644 --- a/source/settings.cpp +++ b/source/settings.cpp @@ -35,4 +35,7 @@ Settings::Renderer OptionDefault::default_val = Settings::Re template<> Settings::ShaderEngine OptionDefault::default_val = Settings::ShaderEngine::Bytecode; +template<> +bool BooleanOption::default_val = false; + } // namespace Config