From 7af8ab9a01072d8fbee2b84611b84ec3e74d1ca0 Mon Sep 17 00:00:00 2001 From: Mr-Wiseguy Date: Sun, 21 Apr 2024 14:18:33 -0400 Subject: [PATCH] Changes to fix compilation on linux --- CMakeLists.txt | 31 ++++++++++++++++++++++++++++--- lib/rt64 | 2 +- src/game/config.cpp | 2 +- src/game/input.cpp | 5 +---- src/game/recomp_api.cpp | 2 +- src/recomp/recomp.cpp | 8 +------- src/ui/ui_renderer.cpp | 2 +- ultramodern/mesgqueue.cpp | 7 +++++++ ultramodern/rt64_layer.cpp | 6 +++++- ultramodern/scheduler.cpp | 3 ++- ultramodern/ultramodern.hpp | 1 + 11 files changed, 49 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index defa53c..e30232f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,9 @@ endif() set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/lib/") +if (WIN32) + set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/lib/") +endif() set(RT64_STATIC TRUE) add_subdirectory(${CMAKE_SOURCE_DIR}/lib/rt64 ${CMAKE_BINARY_DIR}/rt64) @@ -90,7 +92,7 @@ add_custom_command(OUTPUT ${CMAKE_SOURCE_DIR}/RecompiledPatches/recomp_overlays.inl ${CMAKE_SOURCE_DIR}/RecompiledPatches/funcs.h ${CMAKE_SOURCE_DIR}/src/recomp/patch_loading.cpp - COMMAND RecompPort patches.toml && ${CMAKE_COMMAND} -E touch ${CMAKE_SOURCE_DIR}/src/recomp/patch_loading.cpp + COMMAND ./N64Recomp patches.toml && ${CMAKE_COMMAND} -E touch ${CMAKE_SOURCE_DIR}/src/recomp/patch_loading.cpp WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} DEPENDS ${CMAKE_SOURCE_DIR}/patches/patches.bin ) @@ -210,6 +212,29 @@ if (WIN32) target_sources(Zelda64Recompiled PRIVATE ${CMAKE_SOURCE_DIR}/icons/app.rc) endif() +if (LINUX) + find_package(X11 REQUIRED) + + message(STATUS "X11_FOUND = ${X11_FOUND}") + message(STATUS "X11_Xrandr_FOUND = ${X11_Xrandr_FOUND}") + message(STATUS "X11_INCLUDE_DIR = ${X11_INCLUDE_DIR}") + message(STATUS "X11_LIBRARIES = ${X11_LIBRARIES}") + + include_directories(${X11_INCLUDE_DIR} ${X11_Xrandr_INCLUDE_PATH}) + target_link_libraries(Zelda64Recompiled PRIVATE ${X11_LIBRARIES} ${X11_Xrandr_LIB}) + + find_package(Freetype REQUIRED) + + message(STATUS "FREETYPE_FOUND = ${FREETYPE_FOUND}") + message(STATUS "FREETYPE_INCLUDE_DIRS = ${FREETYPE_INCLUDE_DIRS}") + message(STATUS "FREETYPE_LIBRARIES = ${FREETYPE_LIBRARIES}") + + include_directories(${FREETYPE_LIBRARIES}) + target_link_libraries(Zelda64Recompiled PRIVATE ${FREETYPE_LIBRARIES}) + + target_link_libraries(Zelda64Recompiled PRIVATE "-latomic") +endif() + target_link_libraries(Zelda64Recompiled PRIVATE PatchesLib RecompiledFuncs @@ -236,7 +261,7 @@ if (${WIN32}) set (DXC "${PROJECT_SOURCE_DIR}/lib/rt64/src/contrib/dxc/bin/x64/dxc.exe") add_compile_definitions(NOMINMAX) else() - set (DXC "LD_LIBRARY_PATH=${PROJECT_SOURCE_DIR}/lib/rt64/src/src/contrib/dxc/lib/x64" "${PROJECT_SOURCE_DIR}/src/contrib/dxc/bin/x64/dxc") + set (DXC "LD_LIBRARY_PATH=${PROJECT_SOURCE_DIR}/lib/rt64/src/src/contrib/dxc/lib/x64" "${PROJECT_SOURCE_DIR}/lib/rt64/src/contrib/dxc/bin/x64/dxc") endif() build_vertex_shader(Zelda64Recompiled "shaders/InterfaceVS.hlsl" "shaders/InterfaceVS.hlsl") diff --git a/lib/rt64 b/lib/rt64 index 00aecb3..4761319 160000 --- a/lib/rt64 +++ b/lib/rt64 @@ -1 +1 @@ -Subproject commit 00aecb38ac2f4563e81980445399e1c84c64e5bc +Subproject commit 476131916927e43e5494b2ee86c46ad24a9512e4 diff --git a/src/game/config.cpp b/src/game/config.cpp index 9668dea..65a1fed 100644 --- a/src/game/config.cpp +++ b/src/game/config.cpp @@ -114,7 +114,7 @@ std::filesystem::path recomp::get_app_folder_path() { } if (homedir != nullptr) { - recomp_dir = std::filesystem::path{homedir} / (std::string{"."} + recomp::program_id); + recomp_dir = std::filesystem::path{homedir} / (std::u8string{u8"."} + std::u8string{recomp::program_id}); } #endif diff --git a/src/game/input.cpp b/src/game/input.cpp index 7d31db7..41a16cd 100644 --- a/src/game/input.cpp +++ b/src/game/input.cpp @@ -379,12 +379,9 @@ void recomp::set_rumble(bool on) { InputState.rumble_active = on; } -static float lerp(float from, float to, float amount) { - return (from + (to - from) * amount); -} static float smoothstep(float from, float to, float amount) { amount = (amount * amount) * (3.0f - 2.0f * amount); - return lerp(from, to, amount); + return std::lerp(from, to, amount); } // Update rumble to attempt to mimic the way n64 rumble ramps up and falls off diff --git a/src/game/recomp_api.cpp b/src/game/recomp_api.cpp index f5c7f7c..7d7b8bd 100644 --- a/src/game/recomp_api.cpp +++ b/src/game/recomp_api.cpp @@ -39,7 +39,7 @@ extern "C" void recomp_powf(uint8_t* rdram, recomp_context* ctx) { float a = _arg<0, float>(rdram, ctx); float b = ctx->f14.fl; //_arg<1, float>(rdram, ctx); - _return(ctx, std::powf(a, b)); + _return(ctx, std::pow(a, b)); } extern "C" void recomp_get_target_framerate(uint8_t* rdram, recomp_context* ctx) { diff --git a/src/recomp/recomp.cpp b/src/recomp/recomp.cpp index 10ac659..20c8a1c 100644 --- a/src/recomp/recomp.cpp +++ b/src/recomp/recomp.cpp @@ -17,12 +17,6 @@ #include "../ultramodern/ultramodern.hpp" #include "../../RecompiledPatches/patches_bin.h" -#ifdef _WIN32 -#define EXPORT __declspec(dllexport) -#else -#define EXPORT __attribute__((visibility("default"))) -#endif - #ifdef _MSC_VER inline uint32_t byteswap(uint32_t val) { return _byteswap_ulong(val); @@ -49,7 +43,7 @@ bool check_hash(const std::vector& rom_data, uint64_t expected_hash) { return calculated_hash == expected_hash; } -std::vector read_file(const std::filesystem::path& path) { +static std::vector read_file(const std::filesystem::path& path) { std::vector ret; std::ifstream file{ path, std::ios::binary}; diff --git a/src/ui/ui_renderer.cpp b/src/ui/ui_renderer.cpp index 18c13de..3fb8d52 100644 --- a/src/ui/ui_renderer.cpp +++ b/src/ui/ui_renderer.cpp @@ -68,7 +68,7 @@ struct TextureHandle { std::unique_ptr set; }; -std::vector read_file(const std::filesystem::path& filepath) { +static std::vector read_file(const std::filesystem::path& filepath) { std::vector ret{}; std::ifstream input_file{ filepath, std::ios::binary }; diff --git a/ultramodern/mesgqueue.cpp b/ultramodern/mesgqueue.cpp index 141b751..045460c 100644 --- a/ultramodern/mesgqueue.cpp +++ b/ultramodern/mesgqueue.cpp @@ -61,6 +61,13 @@ extern "C" s32 osSendMesg(RDRAM_ARG PTR(OSMesgQueue) mq_, OSMesg msg, s32 flags) // If non-blocking, fail if the queue is full if (MQ_IS_FULL(mq)) { ultramodern::enable_preemption(); + + // Notify the scheduler anyways so it can resume the thread in case the queue was already full. + // TODO does this work? + if (!ultramodern::is_game_thread()) { + ultramodern::notify_scheduler(); + } + return -1; } } else { diff --git a/ultramodern/rt64_layer.cpp b/ultramodern/rt64_layer.cpp index 4d54d39..d70a3af 100644 --- a/ultramodern/rt64_layer.cpp +++ b/ultramodern/rt64_layer.cpp @@ -175,7 +175,11 @@ ultramodern::RT64Context::RT64Context(uint8_t* rdram, ultramodern::WindowHandle } // Set up the RT64 application. - if (!app->setup(window_handle.thread_id)) { + uint32_t thread_id = 0; +#ifdef _WIN32 + thread_id = window_handle.thread_id; +#endif + if (!app->setup(thread_id)) { app = nullptr; return; } diff --git a/ultramodern/scheduler.cpp b/ultramodern/scheduler.cpp index 3153da9..1da5fb2 100644 --- a/ultramodern/scheduler.cpp +++ b/ultramodern/scheduler.cpp @@ -150,7 +150,7 @@ void scheduler_func() { thread_queue_t running_thread_queue{}; OSThread* cur_running_thread = nullptr; - ultramodern::set_native_thread_name("Scheduler Thread"); + ultramodern::set_native_thread_name("Scheduler"); ultramodern::set_native_thread_priority(ultramodern::ThreadPriority::Critical); while (true) { @@ -188,6 +188,7 @@ void scheduler_func() { old_running_thread->id, old_running_thread->priority, cur_running_thread->id, cur_running_thread->priority); } } + printf("Scheduler broke\n"); } extern "C" void do_yield() { diff --git a/ultramodern/ultramodern.hpp b/ultramodern/ultramodern.hpp index d436c58..ebe00f8 100644 --- a/ultramodern/ultramodern.hpp +++ b/ultramodern/ultramodern.hpp @@ -18,6 +18,7 @@ # undef None # undef Status # undef LockMask +# undef Always #endif struct UltraThreadContext {