mirror of
https://github.com/N64Recomp/N64ModernRuntime.git
synced 2026-05-10 19:01:53 +00:00
Add ultramodern::set_callbacks and some other cleanups
This commit is contained in:
parent
048a3172d7
commit
06a8c5070a
11 changed files with 75 additions and 38 deletions
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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_;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
25
ultramodern/include/ultramodern/events.hpp
Normal file
25
ultramodern/include/ultramodern/events.hpp
Normal 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
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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))
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue