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 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();

View file

@ -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<std::mutex> 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_;

View file

@ -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);
}

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 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();

View file

@ -25,8 +25,9 @@
# undef Success
#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 {
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))

View file

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

View file

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

View file

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

View file

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

View file

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