diff --git a/librecomp/include/librecomp/game.hpp b/librecomp/include/librecomp/game.hpp index 84c5302..298f009 100644 --- a/librecomp/include/librecomp/game.hpp +++ b/librecomp/include/librecomp/game.hpp @@ -42,7 +42,7 @@ namespace recomp { 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, + ultramodern::renderer::WindowHandle window_handle, const recomp::rsp::callbacks_t& rsp_callbacks, const ultramodern::renderer::callbacks_t& renderer_callbacks, const ultramodern::audio_callbacks_t& audio_callbacks, diff --git a/librecomp/src/recomp.cpp b/librecomp/src/recomp.cpp index 2202a96..c45f4f0 100644 --- a/librecomp/src/recomp.cpp +++ b/librecomp/src/recomp.cpp @@ -391,7 +391,7 @@ void ultramodern::quit() { } void recomp::start( - ultramodern::WindowHandle window_handle, + ultramodern::renderer::WindowHandle window_handle, const recomp::rsp::callbacks_t& rsp_callbacks, const ultramodern::renderer::callbacks_t& renderer_callbacks, const ultramodern::audio_callbacks_t& audio_callbacks, @@ -419,7 +419,7 @@ void recomp::start( gfx_data = gfx_callbacks.create_gfx(); } - if (window_handle == ultramodern::WindowHandle{}) { + if (window_handle == ultramodern::renderer::WindowHandle{}) { if (gfx_callbacks.create_window) { window_handle = gfx_callbacks.create_window(gfx_data); } @@ -432,7 +432,7 @@ void recomp::start( std::unique_ptr rdram_buffer = std::make_unique(ultramodern::rdram_size); std::memset(rdram_buffer.get(), 0, ultramodern::rdram_size); - std::thread game_thread{[](ultramodern::WindowHandle window_handle, uint8_t* rdram) { + std::thread game_thread{[](ultramodern::renderer::WindowHandle window_handle, uint8_t* rdram) { debug_printf("[Recomp] Starting\n"); ultramodern::set_native_thread_name("Game Start Thread"); diff --git a/ultramodern/include/ultramodern/renderer_context.hpp b/ultramodern/include/ultramodern/renderer_context.hpp index 3ad2e51..0b5d333 100644 --- a/ultramodern/include/ultramodern/renderer_context.hpp +++ b/ultramodern/include/ultramodern/renderer_context.hpp @@ -6,15 +6,49 @@ #include #include +#if defined(_WIN32) +# define WIN32_LEAN_AND_MEAN +# include +#elif defined(__ANDROID__) +# include "android/native_window.h" +#elif defined(__linux__) +# include "X11/Xlib.h" +# undef None +# undef Status +# undef LockMask +# undef Always +# undef Success +#endif + #include "ultra64.h" #include "config.hpp" namespace ultramodern { - - // TODO: should we move the WindowHandle definition here? - struct WindowHandle; - namespace renderer { + +#if defined(_WIN32) + // Native HWND handle to the target window. + struct WindowHandle { + HWND window; + DWORD thread_id = (DWORD)-1; + auto operator<=>(const WindowHandle&) const = default; + }; +#elif defined(__ANDROID__) + using WindowHandle = ANativeWindow*; +#elif defined(__linux__) + struct WindowHandle { + Display* display; + Window window; + auto operator<=>(const WindowHandle&) const = default; + }; +#elif defined(__APPLE__) + struct WindowHandle { + void* window; + void* view; + auto operator<=>(const WindowHandle&) const = default; + }; +#endif + enum class SetupResult { Success, DynamicLibrariesNotFound, @@ -69,5 +103,4 @@ namespace ultramodern { } } - #endif diff --git a/ultramodern/include/ultramodern/ultramodern.hpp b/ultramodern/include/ultramodern/ultramodern.hpp index 4b3a2f8..1f7be4b 100644 --- a/ultramodern/include/ultramodern/ultramodern.hpp +++ b/ultramodern/include/ultramodern/ultramodern.hpp @@ -11,20 +11,6 @@ #include "lightweightsemaphore.h" #include "ultra64.h" -#if defined(_WIN32) -# define WIN32_LEAN_AND_MEAN -# include -#elif defined(__ANDROID__) -# include "android/native_window.h" -#elif defined(__linux__) -# include "X11/Xlib.h" -# undef None -# undef Status -# undef LockMask -# undef Always -# undef Success -#endif - #include "ultramodern/error_handling.hpp" #include "ultramodern/events.hpp" #include "ultramodern/input.hpp" @@ -39,29 +25,6 @@ struct UltraThreadContext { namespace ultramodern { -#if defined(_WIN32) - // Native HWND handle to the target window. - struct WindowHandle { - HWND window; - DWORD thread_id = (DWORD)-1; - auto operator<=>(const WindowHandle&) const = default; - }; -#elif defined(__ANDROID__) - using WindowHandle = ANativeWindow*; -#elif defined(__linux__) - struct WindowHandle { - Display* display; - Window window; - auto operator<=>(const WindowHandle&) const = default; - }; -#elif defined(__APPLE__) - struct WindowHandle { - void* window; - void* view; - auto operator<=>(const WindowHandle&) const = default; - }; -#endif - // We need a place in rdram to hold the PI handles, so pick an address in extended rdram constexpr uint32_t rdram_size = 1024 * 1024 * 16; // 16MB to give extra room for anything custom constexpr int32_t cart_handle = 0x80800000; @@ -70,9 +33,9 @@ constexpr int32_t flash_handle = (int32_t)(drive_handle + sizeof(OSPiHandle)); constexpr uint32_t save_size = 1024 * 1024 / 8; // Maximum save size, 1Mbit for flash // Initialization. -void preinit(RDRAM_ARG WindowHandle window_handle); +void preinit(RDRAM_ARG renderer::WindowHandle window_handle); void init_saving(RDRAM_ARG1); -void init_events(RDRAM_ARG WindowHandle window_handle); +void init_events(RDRAM_ARG renderer::WindowHandle window_handle); void init_timers(RDRAM_ARG1); void init_thread_cleanup(); @@ -149,7 +112,7 @@ struct audio_callbacks_t { struct gfx_callbacks_t { using gfx_data_t = void*; using create_gfx_t = gfx_data_t(); - using create_window_t = WindowHandle(gfx_data_t); + using create_window_t = renderer::WindowHandle(gfx_data_t); using update_gfx_t = void(gfx_data_t); create_gfx_t* create_gfx; diff --git a/ultramodern/src/events.cpp b/ultramodern/src/events.cpp index 30179f3..a6c93df 100644 --- a/ultramodern/src/events.cpp +++ b/ultramodern/src/events.cpp @@ -258,7 +258,7 @@ void ultramodern::trigger_config_action() { std::atomic renderer_setup_result = ultramodern::renderer::SetupResult::Success; -void gfx_thread_func(uint8_t* rdram, moodycamel::LightweightSemaphore* thread_ready, ultramodern::WindowHandle window_handle) { +void gfx_thread_func(uint8_t* rdram, moodycamel::LightweightSemaphore* thread_ready, ultramodern::renderer::WindowHandle window_handle) { bool enabled_instant_present = false; using namespace std::chrono_literals; @@ -497,7 +497,7 @@ void ultramodern::send_si_message(RDRAM_ARG1) { osSendMesg(PASS_RDRAM events_context.si.mq, events_context.si.msg, OS_MESG_NOBLOCK); } -void ultramodern::init_events(RDRAM_ARG ultramodern::WindowHandle window_handle) { +void ultramodern::init_events(RDRAM_ARG ultramodern::renderer::WindowHandle window_handle) { moodycamel::LightweightSemaphore gfx_thread_ready; moodycamel::LightweightSemaphore task_thread_ready; events_context.rdram = rdram; diff --git a/ultramodern/src/ultrainit.cpp b/ultramodern/src/ultrainit.cpp index 940e99e..fe11115 100644 --- a/ultramodern/src/ultrainit.cpp +++ b/ultramodern/src/ultrainit.cpp @@ -19,7 +19,7 @@ void ultramodern::set_callbacks( ultramodern::error_handling::set_callbacks(error_handling_callbacks); } -void ultramodern::preinit(RDRAM_ARG ultramodern::WindowHandle window_handle) { +void ultramodern::preinit(RDRAM_ARG ultramodern::renderer::WindowHandle window_handle) { ultramodern::set_main_thread(); ultramodern::init_events(PASS_RDRAM window_handle); ultramodern::init_timers(PASS_RDRAM1);