diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..061b1c8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +build/ +temp/ +.vscode/ + +*.o +*.elf +*.z64 +*.n64 +*.v64 diff --git a/CMakeLists.txt b/CMakeLists.txt index 6d8c423..3ad8355 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,9 @@ cmake_minimum_required(VERSION 3.20) + project(N64ModernRuntime) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED True) -add_subdirectory(librecomp) add_subdirectory(ultramodern) +add_subdirectory(librecomp) diff --git a/README.md b/README.md index 9d816b0..cab8b4b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # N64 Modern Runtime -> Note +> Note This repo is a WIP as files are moved out of Zelda64Recomp and genericized. It cannot be used directly in its current state. This repo contains two libraries: Ultramodern and Librecomp. diff --git a/ultramodern/CMakeLists.txt b/ultramodern/CMakeLists.txt index ded4d93..03290cd 100644 --- a/ultramodern/CMakeLists.txt +++ b/ultramodern/CMakeLists.txt @@ -1,18 +1,83 @@ cmake_minimum_required(VERSION 3.20) + project(ultramodern) +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED True) +set(CMAKE_CXX_EXTENSIONS OFF) + +# Warnings +# TODO: uncoment this when we fix the warnings +# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") + +if(UNIX AND NOT APPLE) + set(LINUX TRUE) +endif() add_library(ultramodern STATIC - "${CMAKE_CURRENT_SOURCE_DIR}/src/audio.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/src/events.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/src/mesgqueue.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/src/misc_ultra.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/src/rt64_layer.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/src/scheduling.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/src/task_win32.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/src/threadqueue.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/src/threads.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/src/timer.cpp") + "${CMAKE_CURRENT_SOURCE_DIR}/src/audio.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/events.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/mesgqueue.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/misc_ultra.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/rt64_layer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/scheduling.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/task_win32.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/threadqueue.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/threads.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/timer.cpp" +) target_include_directories(ultramodern PUBLIC - "${CMAKE_CURRENT_SOURCE_DIR}/include" - "${CMAKE_SOURCE_DIR}/thirdparty/concurrentqueue") + "${CMAKE_CURRENT_SOURCE_DIR}/include/" + "${CMAKE_CURRENT_SOURCE_DIR}/include/ultramodern" # FIXME: remove redundant path + "${CMAKE_SOURCE_DIR}/thirdparty/concurrentqueue" +) + +# TODO: remove when rt64 is no longer a hard dependency +target_include_directories(ultramodern PRIVATE + "${CMAKE_SOURCE_DIR}/rt64/src" + "${CMAKE_SOURCE_DIR}/rt64/src/contrib" + "${CMAKE_SOURCE_DIR}/rt64/src/contrib/hlslpp/include" + "${CMAKE_SOURCE_DIR}/rt64/src/contrib/dxc/inc" + "${CMAKE_SOURCE_DIR}/rt64/src/rhi" + "${CMAKE_SOURCE_DIR}/rt64/src/render" + "${CMAKE_SOURCE_DIR}/rt64/src/contrib/nativefiledialog-extended/src/include" +) + +# TODO: remove when librecomp is untangled from ultramodern +target_include_directories(ultramodern PRIVATE + "${CMAKE_SOURCE_DIR}/librecomp/include" +) + +if (WIN32) + include(FetchContent) + # Fetch SDL2 on windows + FetchContent_Declare( + sdl2 + URL https://github.com/libsdl-org/SDL/releases/download/release-2.28.5/SDL2-devel-2.28.5-VC.zip + URL_HASH MD5=d8173db078e54040c666f411c5a6afff + ) + FetchContent_MakeAvailable(sdl2) + target_include_directories(ultramodern PRIVATE + ${sdl2_SOURCE_DIR}/include + ) + target_link_directories(ultramodern PRIVATE + ${sdl2_SOURCE_DIR}/lib/x64 + ) +endif() + +if (LINUX) + find_package(SDL2 REQUIRED) + find_package(X11 REQUIRED) + + message(STATUS "SDL2_FOUND = ${SDL2_FOUND}") + message(STATUS "SDL2_INCLUDE_DIRS = ${SDL2_INCLUDE_DIRS}") + + target_include_directories(ultramodern PRIVATE ${SDL2_INCLUDE_DIRS}) + + message(STATUS "X11_FOUND = ${X11_FOUND}") + message(STATUS "X11_INCLUDE_DIR = ${X11_INCLUDE_DIR}") + message(STATUS "X11_LIBRARIES = ${X11_LIBRARIES}") + + target_include_directories(ultramodern PRIVATE ${X11_INCLUDE_DIR}) + target_link_libraries(ultramodern PRIVATE ${X11_LIBRARIES}) +endif() diff --git a/ultramodern/include/ultramodern/recomp_ui.h b/ultramodern/include/ultramodern/recomp_ui.h new file mode 100644 index 0000000..7b511fc --- /dev/null +++ b/ultramodern/include/ultramodern/recomp_ui.h @@ -0,0 +1,12 @@ +#ifndef __ULTRAMODERN_RECOMP_UI__ +#define __ULTRAMODERN_RECOMP_UI__ + +namespace recomp { + // Currently those functions are expected to be provided by the consumer of this library. + // TODO: Change these functions to a callback registering system + + void destroy_ui(); + void update_supported_options(); +} + +#endif diff --git a/ultramodern/src/events.cpp b/ultramodern/src/events.cpp index 669a05a..8c41bb4 100644 --- a/ultramodern/src/events.cpp +++ b/ultramodern/src/events.cpp @@ -17,7 +17,7 @@ #include "rt64_layer.h" #include "recomp.h" #include "recomp_game.h" -#include "recomp_ui.h" +#include "ultramodern/recomp_ui.h" #include "recomp_input.h" #include "rsp.h" @@ -325,7 +325,7 @@ void gfx_thread_func(uint8_t* rdram, moodycamel::LightweightSemaphore* thread_re // TODO move recomp code out of ultramodern. recomp::update_supported_options(); - + rsp_constants_init(); // Notify the caller thread that this thread is ready. diff --git a/ultramodern/src/rt64_layer.cpp b/ultramodern/src/rt64_layer.cpp index 611e1eb..e82a07f 100644 --- a/ultramodern/src/rt64_layer.cpp +++ b/ultramodern/src/rt64_layer.cpp @@ -110,6 +110,10 @@ ultramodern::RT64SetupResult map_setup_result(RT64::Application::SetupResult rt6 case RT64::Application::SetupResult::GraphicsDeviceNotFound: return ultramodern::RT64SetupResult::GraphicsDeviceNotFound; } + + fprintf(stderr, "Unhandled `RT64::Application::SetupResult` ?\n"); + assert(false); + std::exit(EXIT_FAILURE); } ultramodern::RT64Context::RT64Context(uint8_t* rdram, ultramodern::WindowHandle window_handle, bool debug) {