Add ultramodern::set_callbacks and some other cleanups

This commit is contained in:
Angie 2024-05-25 17:52:44 -04:00 committed by angie
parent 048a3172d7
commit 06a8c5070a
11 changed files with 75 additions and 38 deletions

View file

@ -38,8 +38,8 @@ namespace recomp {
void set_rom_contents(std::vector<uint8_t>&& new_rom); void set_rom_contents(std::vector<uint8_t>&& new_rom);
void do_rom_read(uint8_t* rdram, gpr ram_address, uint32_t physical_addr, size_t num_bytes); 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 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(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(std::u8string game_id); void start_game(const std::u8string& game_id);
void message_box(const char* message); void message_box(const char* message);
std::filesystem::path get_app_folder_path(); std::filesystem::path get_app_folder_path();
std::u8string current_game_id(); std::u8string current_game_id();

View file

@ -402,7 +402,7 @@ std::u8string recomp::current_game_id() {
return current_game.value(); return current_game.value();
}; };
void recomp::start_game(std::u8string game_id) { void recomp::start_game(const std::u8string& game_id) {
std::lock_guard<std::mutex> lock(current_game_mutex); std::lock_guard<std::mutex> lock(current_game_mutex);
current_game = game_id; current_game = game_id;
game_status.store(GameStatus::Running); game_status.store(GameStatus::Running);
@ -412,7 +412,6 @@ bool ultramodern::is_game_started() {
return game_status.load() != GameStatus::None; 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); void set_input_callbacks(const ultramodern::input_callbacks_t& callback);
std::atomic_bool exited = false; std::atomic_bool exited = false;
@ -426,11 +425,12 @@ void ultramodern::quit() {
current_game.reset(); 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(); 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); set_input_callbacks(input_callbacks);
ultramodern::rsp::set_callbacks(rsp_callbacks_);
ultramodern::gfx_callbacks_t gfx_callbacks = gfx_callbacks_; ultramodern::gfx_callbacks_t gfx_callbacks = gfx_callbacks_;

View file

@ -1,10 +1,9 @@
#ifndef __ERROR_HANDLING_HPP__ #ifndef __ERROR_HANDLING_HPP__
#define __ERROR_HANDLING_HPP__ #define __ERROR_HANDLING_HPP__
namespace ultramodern { namespace ultramodern {
namespace error_handling { namespace error_handling {
struct error_handling_callbacks_t { struct callbacks_t {
using message_box_t = void(const char* msg); using message_box_t = void(const char* msg);
/** /**
@ -15,7 +14,7 @@ namespace ultramodern {
message_box_t *message_box; 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); void message_box(const char* msg);
} }

View file

@ -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

View file

@ -25,13 +25,16 @@ extern uint16_t rspInverseSquareRoots[512];
namespace ultramodern { namespace ultramodern {
namespace rsp { 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). * Simulate a DMA copy from RDRAM (CPU) to DMEM (RSP).
* *
* This function should fill the ultramodern's `dmem` by reading from the `rdram` parameter. * 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`. * 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. * 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(); void constants_init();

View file

@ -25,8 +25,9 @@
# undef Success # undef Success
#endif #endif
#include <ultramodern/rsp_stuff.hpp> #include "ultramodern/error_handling.hpp"
#include <ultramodern/error_handling.hpp> #include "ultramodern/events.hpp"
#include "ultramodern/rsp_stuff.hpp"
struct UltraThreadContext { struct UltraThreadContext {
std::thread host_thread; std::thread host_thread;
@ -163,27 +164,20 @@ struct gfx_callbacks_t {
destroy_ui_t* destroy_ui; 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(); bool is_game_started();
void quit(); void quit();
void join_event_threads(); void join_event_threads();
void join_thread_cleaner_thread(); void join_thread_cleaner_thread();
void join_saving_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 } // namespace ultramodern
#define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b))

View file

@ -6,7 +6,7 @@ static uint32_t sample_rate = 48000;
static ultramodern::audio_callbacks_t audio_callbacks; 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; audio_callbacks = callbacks;
} }

View file

@ -2,9 +2,9 @@
#include "ultramodern/error_handling.hpp" #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; error_handling_callbacks = callbacks;
} }

View file

@ -17,9 +17,9 @@
#include "rt64_layer.h" #include "rt64_layer.h"
#include "rsp_stuff.hpp" #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; threads_callbacks = callbacks;
} }

View file

@ -4,9 +4,9 @@
#include "rsp_stuff.hpp" #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; rsp_callbacks = callbacks;
} }

View file

@ -1,6 +1,22 @@
#include "ultra64.h" #include "ultra64.h"
#include "ultramodern.hpp" #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) { void ultramodern::preinit(RDRAM_ARG ultramodern::WindowHandle window_handle) {
ultramodern::set_main_thread(); ultramodern::set_main_thread();
ultramodern::init_events(PASS_RDRAM window_handle); ultramodern::init_events(PASS_RDRAM window_handle);