From 06a8c5070aaa8a9b6e25aa5e8770b4b554e826ec Mon Sep 17 00:00:00 2001 From: Angie Date: Sat, 25 May 2024 17:52:44 -0400 Subject: [PATCH] Add `ultramodern::set_callbacks` and some other cleanups --- librecomp/include/recomp_game.h | 4 +-- librecomp/src/recomp.cpp | 10 +++---- .../include/ultramodern/error_handling.hpp | 5 ++-- ultramodern/include/ultramodern/events.hpp | 25 +++++++++++++++++ ultramodern/include/ultramodern/rsp_stuff.hpp | 11 +++++--- .../include/ultramodern/ultramodern.hpp | 28 ++++++++----------- ultramodern/src/audio.cpp | 2 +- ultramodern/src/error_handling.cpp | 4 +-- ultramodern/src/events.cpp | 4 +-- ultramodern/src/rsp.cpp | 4 +-- ultramodern/src/ultrainit.cpp | 16 +++++++++++ 11 files changed, 75 insertions(+), 38 deletions(-) create mode 100644 ultramodern/include/ultramodern/events.hpp diff --git a/librecomp/include/recomp_game.h b/librecomp/include/recomp_game.h index 9a98a76..1791f71 100644 --- a/librecomp/include/recomp_game.h +++ b/librecomp/include/recomp_game.h @@ -38,8 +38,8 @@ namespace recomp { void set_rom_contents(std::vector&& new_rom); void do_rom_read(uint8_t* rdram, gpr ram_address, uint32_t physical_addr, size_t num_bytes); void do_rom_pio(uint8_t* rdram, gpr ram_address, uint32_t physical_addr); - void start(ultramodern::WindowHandle window_handle, const ultramodern::audio_callbacks_t& audio_callbacks, const ultramodern::input_callbacks_t& input_callbacks, const ultramodern::gfx_callbacks_t& gfx_callbacks, const ultramodern::rsp::rsp_callbacks_t& rsp_callbacks_); - void start_game(std::u8string game_id); + void start(ultramodern::WindowHandle window_handle, const ultramodern::audio_callbacks_t& audio_callbacks, const ultramodern::input_callbacks_t& input_callbacks, const ultramodern::gfx_callbacks_t& gfx_callbacks, const ultramodern::rsp::callbacks_t& rsp_callbacks, const ultramodern::events::callbacks_t& thread_callbacks, const ultramodern::error_handling::callbacks_t& error_handling_callbacks_); + void start_game(const std::u8string& game_id); void message_box(const char* message); std::filesystem::path get_app_folder_path(); std::u8string current_game_id(); diff --git a/librecomp/src/recomp.cpp b/librecomp/src/recomp.cpp index 27de754..4952b36 100644 --- a/librecomp/src/recomp.cpp +++ b/librecomp/src/recomp.cpp @@ -402,7 +402,7 @@ std::u8string recomp::current_game_id() { return current_game.value(); }; -void recomp::start_game(std::u8string game_id) { +void recomp::start_game(const std::u8string& game_id) { std::lock_guard lock(current_game_mutex); current_game = game_id; game_status.store(GameStatus::Running); @@ -412,7 +412,6 @@ bool ultramodern::is_game_started() { return game_status.load() != GameStatus::None; } -void set_audio_callbacks(const ultramodern::audio_callbacks_t& callbacks); void set_input_callbacks(const ultramodern::input_callbacks_t& callback); std::atomic_bool exited = false; @@ -426,11 +425,12 @@ void ultramodern::quit() { current_game.reset(); } -void recomp::start(ultramodern::WindowHandle window_handle, const ultramodern::audio_callbacks_t& audio_callbacks, const ultramodern::input_callbacks_t& input_callbacks, const ultramodern::gfx_callbacks_t& gfx_callbacks_, const ultramodern::rsp::rsp_callbacks_t& rsp_callbacks_) { +void recomp::start(ultramodern::WindowHandle window_handle, const ultramodern::audio_callbacks_t& audio_callbacks, const ultramodern::input_callbacks_t& input_callbacks, const ultramodern::gfx_callbacks_t& gfx_callbacks_, const ultramodern::rsp::callbacks_t& rsp_callbacks_, const ultramodern::events::callbacks_t& thread_callbacks_, const ultramodern::error_handling::callbacks_t& error_handling_callbacks_) { recomp::check_all_stored_roms(); - set_audio_callbacks(audio_callbacks); + + ultramodern::set_callbacks(audio_callbacks, input_callbacks, gfx_callbacks_, rsp_callbacks_, thread_callbacks_, error_handling_callbacks_); + set_input_callbacks(input_callbacks); - ultramodern::rsp::set_callbacks(rsp_callbacks_); ultramodern::gfx_callbacks_t gfx_callbacks = gfx_callbacks_; diff --git a/ultramodern/include/ultramodern/error_handling.hpp b/ultramodern/include/ultramodern/error_handling.hpp index d814c5a..7632806 100644 --- a/ultramodern/include/ultramodern/error_handling.hpp +++ b/ultramodern/include/ultramodern/error_handling.hpp @@ -1,10 +1,9 @@ #ifndef __ERROR_HANDLING_HPP__ #define __ERROR_HANDLING_HPP__ - namespace ultramodern { namespace error_handling { - struct error_handling_callbacks_t { + struct callbacks_t { using message_box_t = void(const char* msg); /** @@ -15,7 +14,7 @@ namespace ultramodern { message_box_t *message_box; }; - void set_error_handling_callbacks(const error_handling_callbacks_t& callbacks); + void set_callbacks(const callbacks_t& callbacks); void message_box(const char* msg); } diff --git a/ultramodern/include/ultramodern/events.hpp b/ultramodern/include/ultramodern/events.hpp new file mode 100644 index 0000000..dbb2ea5 --- /dev/null +++ b/ultramodern/include/ultramodern/events.hpp @@ -0,0 +1,25 @@ +#ifndef __EVENTS_HPP__ +#define __EVENTS_HPP__ + +namespace ultramodern { + namespace events { + struct callbacks_t { + using vi_callback_t = void(); + using gfx_init_callback_t = void(); + + /** + * Called in each VI. + */ + vi_callback_t* vi_callback; + + /** + * Called before entering the gfx main loop. + */ + gfx_init_callback_t* gfx_init_callback; + }; + + void set_callbacks(const callbacks_t& callbacks); + } +} + +#endif diff --git a/ultramodern/include/ultramodern/rsp_stuff.hpp b/ultramodern/include/ultramodern/rsp_stuff.hpp index 2f60ef0..a5a1486 100644 --- a/ultramodern/include/ultramodern/rsp_stuff.hpp +++ b/ultramodern/include/ultramodern/rsp_stuff.hpp @@ -25,13 +25,16 @@ extern uint16_t rspInverseSquareRoots[512]; namespace ultramodern { namespace rsp { - struct rsp_callbacks_t { + struct callbacks_t { + using dma_rdram_to_dmem_t = void(uint8_t* rdram, uint32_t dmem_addr, uint32_t dram_addr, uint32_t rd_len); + using get_rsp_microcode_t = RspUcodeFunc*(uint32_t task_type, OSTask* task); + /** * Simulate a DMA copy from RDRAM (CPU) to DMEM (RSP). * * This function should fill the ultramodern's `dmem` by reading from the `rdram` parameter. */ - void (*dma_rdram_to_dmem)(uint8_t* rdram, uint32_t dmem_addr, uint32_t dram_addr, uint32_t rd_len); + dma_rdram_to_dmem_t* dma_rdram_to_dmem; /** * Return a function pointer to the corresponding RSP microcode function for the given `task_type`. @@ -40,10 +43,10 @@ namespace ultramodern { * * This function is allowed to return `nullptr` if no microcode matches the specified task. In this case a message will be printed to stderr and the program will exit. */ - RspUcodeFunc* (*get_rsp_microcode)(uint32_t task_type, OSTask* task); + get_rsp_microcode_t* get_rsp_microcode; }; - void set_callbacks(const rsp_callbacks_t& callbacks); + void set_callbacks(const callbacks_t& callbacks); void constants_init(); diff --git a/ultramodern/include/ultramodern/ultramodern.hpp b/ultramodern/include/ultramodern/ultramodern.hpp index 9a81efe..9f73eaa 100644 --- a/ultramodern/include/ultramodern/ultramodern.hpp +++ b/ultramodern/include/ultramodern/ultramodern.hpp @@ -25,8 +25,9 @@ # undef Success #endif -#include -#include +#include "ultramodern/error_handling.hpp" +#include "ultramodern/events.hpp" +#include "ultramodern/rsp_stuff.hpp" struct UltraThreadContext { std::thread host_thread; @@ -163,27 +164,20 @@ struct gfx_callbacks_t { destroy_ui_t* destroy_ui; }; -struct threads_callbacks_t { - using vi_callback_t = void(); - using gfx_init_callback_t = void(); - - /** - * Called in each VI. - */ - vi_callback_t* vi_callback; - - /** - * Called before entering the gfx main loop. - */ - gfx_init_callback_t* gfx_init_callback; -}; - bool is_game_started(); void quit(); void join_event_threads(); void join_thread_cleaner_thread(); void join_saving_thread(); +void set_audio_callbacks(const audio_callbacks_t& callbacks); + +/** + * Register all the callbacks required by `ultramodern`. + * + * It must be called only once and it must be called before `ultramodern::preinit`. + */ +void set_callbacks(const audio_callbacks_t& audio_callbacks, const input_callbacks_t& input_callbacks, const gfx_callbacks_t& gfx_callbacks_, const rsp::callbacks_t& rsp_callbacks_, const events::callbacks_t& thread_callbacks, const error_handling::callbacks_t& error_handling_callbacks); } // namespace ultramodern #define MIN(a, b) ((a) < (b) ? (a) : (b)) diff --git a/ultramodern/src/audio.cpp b/ultramodern/src/audio.cpp index b24e686..d3ae2e7 100644 --- a/ultramodern/src/audio.cpp +++ b/ultramodern/src/audio.cpp @@ -6,7 +6,7 @@ static uint32_t sample_rate = 48000; static ultramodern::audio_callbacks_t audio_callbacks; -void set_audio_callbacks(const ultramodern::audio_callbacks_t& callbacks) { +void ultramodern::set_audio_callbacks(const ultramodern::audio_callbacks_t& callbacks) { audio_callbacks = callbacks; } diff --git a/ultramodern/src/error_handling.cpp b/ultramodern/src/error_handling.cpp index 24baa07..86b17b2 100644 --- a/ultramodern/src/error_handling.cpp +++ b/ultramodern/src/error_handling.cpp @@ -2,9 +2,9 @@ #include "ultramodern/error_handling.hpp" -static ultramodern::error_handling::error_handling_callbacks_t error_handling_callbacks{}; +static ultramodern::error_handling::callbacks_t error_handling_callbacks{}; -void ultramodern::error_handling::set_error_handling_callbacks(const ultramodern::error_handling::error_handling_callbacks_t& callbacks) { +void ultramodern::error_handling::set_callbacks(const ultramodern::error_handling::callbacks_t& callbacks) { error_handling_callbacks = callbacks; } diff --git a/ultramodern/src/events.cpp b/ultramodern/src/events.cpp index 937e715..c74ef43 100644 --- a/ultramodern/src/events.cpp +++ b/ultramodern/src/events.cpp @@ -17,9 +17,9 @@ #include "rt64_layer.h" #include "rsp_stuff.hpp" -static ultramodern::threads_callbacks_t threads_callbacks{}; +static ultramodern::events::callbacks_t threads_callbacks{}; -void set_threads_callbacks(const ultramodern::threads_callbacks_t& callbacks) { +void ultramodern::events::set_callbacks(const ultramodern::events::callbacks_t& callbacks) { threads_callbacks = callbacks; } diff --git a/ultramodern/src/rsp.cpp b/ultramodern/src/rsp.cpp index 346400e..65087b4 100644 --- a/ultramodern/src/rsp.cpp +++ b/ultramodern/src/rsp.cpp @@ -4,9 +4,9 @@ #include "rsp_stuff.hpp" -static ultramodern::rsp::rsp_callbacks_t rsp_callbacks; +static ultramodern::rsp::callbacks_t rsp_callbacks; -void ultramodern::rsp::set_callbacks(const ultramodern::rsp::rsp_callbacks_t& callbacks) { +void ultramodern::rsp::set_callbacks(const ultramodern::rsp::callbacks_t& callbacks) { rsp_callbacks = callbacks; } diff --git a/ultramodern/src/ultrainit.cpp b/ultramodern/src/ultrainit.cpp index 9517113..0674708 100644 --- a/ultramodern/src/ultrainit.cpp +++ b/ultramodern/src/ultrainit.cpp @@ -1,6 +1,22 @@ #include "ultra64.h" #include "ultramodern.hpp" +void ultramodern::set_callbacks( + const audio_callbacks_t& audio_callbacks, + const input_callbacks_t& input_callbacks, + const gfx_callbacks_t& gfx_callbacks, + const rsp::callbacks_t& rsp_callbacks, + const events::callbacks_t& thread_callbacks, + const error_handling::callbacks_t& error_handling_callbacks +) { + ultramodern::set_audio_callbacks(audio_callbacks); + (void)input_callbacks; // nothing yet + (void)gfx_callbacks; // nothing yet + ultramodern::rsp::set_callbacks(rsp_callbacks); + ultramodern::events::set_callbacks(thread_callbacks); + ultramodern::error_handling::set_callbacks(error_handling_callbacks); +} + void ultramodern::preinit(RDRAM_ARG ultramodern::WindowHandle window_handle) { ultramodern::set_main_thread(); ultramodern::init_events(PASS_RDRAM window_handle);