diff --git a/ultramodern/CMakeLists.txt b/ultramodern/CMakeLists.txt index f2d4bff..333ed13 100644 --- a/ultramodern/CMakeLists.txt +++ b/ultramodern/CMakeLists.txt @@ -16,6 +16,7 @@ add_library(ultramodern STATIC "${CMAKE_CURRENT_SOURCE_DIR}/src/input.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/mesgqueue.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/misc_ultra.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/renderer_wrapper.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/rsp.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/scheduling.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/task_win32.cpp" diff --git a/ultramodern/include/ultramodern/error_handling.hpp b/ultramodern/include/ultramodern/error_handling.hpp index 7632806..288482a 100644 --- a/ultramodern/include/ultramodern/error_handling.hpp +++ b/ultramodern/include/ultramodern/error_handling.hpp @@ -1,6 +1,8 @@ #ifndef __ERROR_HANDLING_HPP__ #define __ERROR_HANDLING_HPP__ +#include + namespace ultramodern { namespace error_handling { struct callbacks_t { @@ -17,6 +19,8 @@ namespace ultramodern { void set_callbacks(const callbacks_t& callbacks); void message_box(const char* msg); + + [[noreturn]] void quick_exit(const char* filename, int line, const char *func, int exit_status = EXIT_FAILURE); } } diff --git a/ultramodern/include/ultramodern/renderer_wrapper.hpp b/ultramodern/include/ultramodern/renderer_wrapper.hpp index e054bda..0de38ca 100644 --- a/ultramodern/include/ultramodern/renderer_wrapper.hpp +++ b/ultramodern/include/ultramodern/renderer_wrapper.hpp @@ -43,7 +43,13 @@ namespace ultramodern { SetupResult setup_result; }; - // TODO: register function + struct callbacks_t { + using create_render_context_t = std::unique_ptr(uint8_t* rdram, WindowHandle window_handle, bool developer_mode); + + create_render_context_t *create_render_context; + }; + + void set_callbacks(const callbacks_t& callbacks); std::unique_ptr create_render_context(uint8_t* rdram, WindowHandle window_handle, bool developer_mode); } diff --git a/ultramodern/src/error_handling.cpp b/ultramodern/src/error_handling.cpp index 0adf16d..9be5acd 100644 --- a/ultramodern/src/error_handling.cpp +++ b/ultramodern/src/error_handling.cpp @@ -17,3 +17,13 @@ void ultramodern::error_handling::message_box(const char* msg) { error_handling_callbacks.message_box(msg); } } + +void ultramodern::error_handling::quick_exit(const char* filename, int line, const char *func, int exit_status) { + fprintf(stderr, "Exiting with exit status '%i'. Function %s, at file %s:%i, ", exit_status, func, filename, line); + +#ifdef __APPLE__ + std::_Exit(exit_status); +#else + std::quick_exit(exit_status); +#endif +} diff --git a/ultramodern/src/events.cpp b/ultramodern/src/events.cpp index 6f40d04..ab510f6 100644 --- a/ultramodern/src/events.cpp +++ b/ultramodern/src/events.cpp @@ -214,15 +214,9 @@ void task_thread_func(uint8_t* rdram, moodycamel::LightweightSemaphore* thread_r return; } - if (!ultramodern::rsp::run_task(PASS_RDRAM task)) { fprintf(stderr, "Failed to execute task type: %" PRIu32 "\n", task->t.type); - assert(false); -# ifdef __APPLE__ - std::_Exit(EXIT_FAILURE); -# else - std::quick_exit(EXIT_FAILURE); -# endif + ultramodern::error_handling::quick_exit(__FILE__, __LINE__, __func__); } // Tell the game that the RSP has completed diff --git a/ultramodern/src/renderer_wrapper.cpp b/ultramodern/src/renderer_wrapper.cpp new file mode 100644 index 0000000..d734583 --- /dev/null +++ b/ultramodern/src/renderer_wrapper.cpp @@ -0,0 +1,19 @@ +#include "ultramodern/renderer_wrapper.hpp" +#include "ultramodern/ultramodern.hpp" + +static ultramodern::renderer::callbacks_t render_callbacks{}; + +void set_callbacks(const ultramodern::renderer::callbacks_t& callbacks) { + render_callbacks = callbacks; +} + + +std::unique_ptr ultramodern::renderer::create_render_context(uint8_t* rdram, WindowHandle window_handle, bool developer_mode) { + if (render_callbacks.create_render_context == nullptr) { + error_handling::message_box("[Error] The render callback `create_render_context` was not registered"); + // TODO: should we make a macro for this? + error_handling::quick_exit(__FILE__, __LINE__, __func__); + } + + return render_callbacks.create_render_context(rdram, window_handle, developer_mode); +}