diff --git a/.github/workflows/deploy_retro_linux.yml b/.github/workflows/deploy_retro_linux.yml index 588824a56..cce004466 100644 --- a/.github/workflows/deploy_retro_linux.yml +++ b/.github/workflows/deploy_retro_linux.yml @@ -16,7 +16,7 @@ jobs: run: | mkdir build cd build - cmake .. && cmake --build . --target skyemu_libretro --config Release + cmake -DRETRO_CORE_ONLY=ON .. && cmake --build . --target skyemu_libretro --config Release zip skyemu_libretro.zip skyemu_libretro.so ../skyemu_libretro.info - name: GH Release 🚀 # You may pin to the exact commit or the version. diff --git a/.github/workflows/deploy_retro_mac.yml b/.github/workflows/deploy_retro_mac.yml index dcace1e48..14a56e85a 100644 --- a/.github/workflows/deploy_retro_mac.yml +++ b/.github/workflows/deploy_retro_mac.yml @@ -10,7 +10,7 @@ jobs: run: | mkdir build cd build - cmake .. && cmake --build . --target skyemu_libretro + cmake -DRETRO_CORE_ONLY=ON .. && cmake --build . --target skyemu_libretro zip skyemu_libretro.zip skyemu_libretro.dylib ../skyemu_libretro.info - name: GH Release 🚀 # You may pin to the exact commit or the version. diff --git a/.github/workflows/deploy_retro_win.yml b/.github/workflows/deploy_retro_win.yml index 2eef1fc8f..5e6404352 100644 --- a/.github/workflows/deploy_retro_win.yml +++ b/.github/workflows/deploy_retro_win.yml @@ -13,7 +13,7 @@ jobs: run: | mkdir build cd build - cmake -G "Visual Studio 17 2022" -A x64 -DCMAKE_SYSTEM_VERSION=10.0.19041.0 .. + cmake -G "Visual Studio 17 2022" -A x64 -DCMAKE_SYSTEM_VERSION=10.0.19041.0 -DRETRO_CORE_ONLY=ON .. cmake --build . --config Release --target skyemu_libretro mkdir skyemu_libretro_zip mv bin/Release/skyemu_libretro.dll skyemu_libretro_zip diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 000000000..d2d40c4ab --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,183 @@ +# DESCRIPTION: GitLab CI/CD for libRetro (NOT FOR GitLab-proper) + +############################################################################## +################################# BOILERPLATE ################################ +############################################################################## + +# Core definitions +.core-defs: + variables: + GIT_SUBMODULE_STRATEGY: recursive + CORENAME: skyemu + CORE_ARGS: -DRETRO_CORE_ONLY=ON + +.core-defs-win: + extends: .core-defs + variables: + EXTRA_PATH: bin + +.core-defs-linux: + extends: .core-defs + variables: + CC: /usr/bin/gcc-12 + CXX: /usr/bin/g++-12 + +.core-defs-osx-x64: + extends: .core-defs + variables: + CORE_ARGS: -G Xcode -DRETRO_CORE_ONLY=ON -DCMAKE_OSX_ARCHITECTURES=x86_64 + EXTRA_PATH: Release + +.core-defs-osx-arm64: + extends: .core-defs + variables: + CORE_ARGS: -G Xcode -DRETRO_CORE_ONLY=ON + EXTRA_PATH: Release + +.core-defs-ios-arm64: + extends: .core-defs + variables: + CORE_ARGS: -DCMAKE_OSX_DEPLOYMENT_TARGET=13.0 -DRETRO_CORE_ONLY=ON + IOS_MINVER: 13.0 + MINVER: 13.0 + +.core-defs-android: + extends: .core-defs + script: + - cmake -DANDROID_PLATFORM=android-$API_LEVEL -DRETRO_CORE_ONLY=ON -DCMAKE_TOOLCHAIN_FILE=$NDK_ROOT/build/cmake/android.toolchain.cmake -DANDROID_STL=c++_static -DANDROID_ABI=$ANDROID_ABI -DANDROID_ARM_MODE=arm "$CMAKE_SOURCE_ROOT" -B$BUILD_DIR + - cmake --build $BUILD_DIR --target ${CORENAME}_libretro --config Release -- -j $NUMPROC + - mv $BUILD_DIR/${CORENAME}_libretro.so $LIBNAME + - if [ $STRIP_CORE_LIB -eq 1 ]; then $NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip $LIBNAME; fi + variables: + API_LEVEL: 18 + +# Inclusion templates, required for the build to work +include: + ################################## DESKTOPS ################################ + # Windows + - project: 'libretro-infrastructure/ci-templates' + file: '/windows-cmake-mingw.yml' + + # MacOS + - project: 'libretro-infrastructure/ci-templates' + file: 'osx-cmake-x86.yml' + + # MacOS arm64 + - project: 'libretro-infrastructure/ci-templates' + file: 'osx-cmake-arm64.yml' + + # Linux + - project: 'libretro-infrastructure/ci-templates' + file: '/linux-cmake.yml' + + ################################## CELLULAR ################################ + # Android + - project: 'libretro-infrastructure/ci-templates' + file: '/android-cmake.yml' + + # iOS arm64 + - project: 'libretro-infrastructure/ci-templates' + file: '/ios-cmake.yml' + + ################################## CONSOLES ################################ + # Nintendo Switch + - project: 'libretro-infrastructure/ci-templates' + file: '/libnx-static.yml' + + # tvOS arm64 + - project: 'libretro-infrastructure/ci-templates' + file: '/tvos-cmake.yml' + +# Stages for building +stages: + - build-prepare + - build-shared + # - build-static + +############################################################################## +#################################### STAGES ################################## +############################################################################## +# +################################### DESKTOPS ################################# +# Windows 64-bit +libretro-build-windows-x64: + extends: + - .libretro-windows-cmake-x86_64 + - .core-defs-win + +# Windows 32-bit +libretro-build-windows-i686: + extends: + - .libretro-windows-cmake-x86 + - .core-defs-win + +# Linux 64-bit +libretro-build-linux-x64: + extends: + - .libretro-linux-cmake-x86_64 + - .core-defs-linux + image: $CI_SERVER_HOST:5050/libretro-infrastructure/libretro-build-amd64-ubuntu:backports + +# Linux 32-bit +libretro-build-linux-i686: + extends: + - .libretro-linux-cmake-x86 + - .core-defs-linux + image: $CI_SERVER_HOST:5050/libretro-infrastructure/libretro-build-i386-ubuntu:backports + +# MacOS 64-bit +libretro-build-osx-x64: + extends: + - .libretro-osx-cmake-x86 + - .core-defs-osx-x64 + tags: + - mac-apple-silicon + +# MacOS arm 64-bit +libretro-build-osx-arm64: + extends: + - .libretro-osx-cmake-arm64 + - .core-defs-osx-arm64 + +################################### CELLULAR ################################# +# Android ARMv7a +android-armeabi-v7a: + extends: + - .libretro-android-cmake-armeabi-v7a + - .core-defs-android + +# Android ARMv8a +android-arm64-v8a: + extends: + - .libretro-android-cmake-arm64-v8a + - .core-defs-android + +# Android 64-bit x86 +android-x86_64: + extends: + - .libretro-android-cmake-x86_64 + - .core-defs-android + +# Android 32-bit x86 +android-x86: + extends: + - .libretro-android-cmake-x86 + - .core-defs-android + +libretro-build-ios-arm64: + extends: + - .libretro-ios-cmake-arm64 + - .core-defs-ios-arm64 + +################################### CONSOLES ################################# +# Nintendo Switch +#libretro-build-libnx-aarch64: +# extends: +# - .libretro-libnx-static-retroarch-master +# - .core-defs + +# tvOS arm64 +libretro-build-tvos-arm64: + extends: + - .libretro-tvos-cmake-arm64 + - .core-defs-ios-arm64 diff --git a/CMakeLists.txt b/CMakeLists.txt index 80beb3e95..5248ac5ec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ if(APPLE AND (NOT IOS) AND (NOT ANDROID)) endif() if(MACOS OR IOS) project(SkyEmu OBJC C CXX) - if(IOS) + if(IOS AND NOT RETRO_CORE_ONLY) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -x objective-c") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -x objective-c++") endif() @@ -88,182 +88,182 @@ if(NOT IOS) find_package(OpenGL) endif() set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) - -# Linux -pthread shenanigans -if ((CMAKE_SYSTEM_NAME STREQUAL Linux) AND NOT EMSCRIPTEN AND NOT ANDROID AND NOT RETRO_CORE_ONLY) - set(THREADS_PREFER_PTHREAD_FLAG ON) - find_package(Threads REQUIRED) +if(NOT RETRO_CORE_ONLY) + # Linux -pthread shenanigans + if ((CMAKE_SYSTEM_NAME STREQUAL Linux) AND NOT EMSCRIPTEN AND NOT ANDROID) + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + find_package(ALSA REQUIRED) + set(SE_PLATFORM_LINUX TRUE) + add_definitions(-DSE_PLATFORM_LINUX=1) + endif() + if (UNIX AND NOT APPLE AND NOT SE_PLATFORM_LINUX AND NOT EMSCRIPTEN AND NOT ANDROID) + set(SE_PLATFORM_FREEBSD TRUE) + add_definitions(-DSE_PLATFORM_FREEBSD=1) find_package(ALSA REQUIRED) - set(SE_PLATFORM_LINUX TRUE) - add_definitions(-DSE_PLATFORM_LINUX=1) -endif() -if (UNIX AND NOT APPLE AND NOT SE_PLATFORM_LINUX AND NOT EMSCRIPTEN AND NOT ANDROID AND NOT RETRO_CORE_ONLY) - set(SE_PLATFORM_FREEBSD TRUE) - add_definitions(-DSE_PLATFORM_FREEBSD=1) - find_package(ALSA REQUIRED) - link_directories(/usr/local/lib) -endif() - -if (SE_PLATFORM_LINUX OR SE_PLATFORM_FREEBSD) - find_package(X11 REQUIRED) -endif() - -if (USE_SYSTEM_CURL OR USE_SYSTEM_OPENSSL) - find_package(PkgConfig REQUIRED) -endif() - -if(NOT EMSCRIPTEN AND NOT RETRO_CORE_ONLY) - if (USE_SYSTEM_CURL) - pkg_check_modules(Curl REQUIRED IMPORTED_TARGET libcurl) - else() - set(WITH_APPS OFF CACHE BOOL "" FORCE) # don't build executable - set(CURL_USE_LIBSSH2 OFF) - set(CURL_USE_LIBPSL OFF) - set(CURL_USE_OPENSSL ON) - set(CURL_DISABLE_LDAP ON) - set(USE_LIBIDN2 OFF) - set(CURL_ENABLE_EXPORT_TARGET OFF) - set(BUILD_TESTING OFF) - set(BUILD_CURL_EXE OFF) - set(BUILD_SHARED_LIBS OFF) - set(BUILD_STATIC_LIBS ON) - if (WIN32) - set(CURL_STATIC_CRT ON) - endif() - # see "Important static libcurl usage note" in INSTALL.md - add_definitions(-DCURL_STATICLIB) - add_subdirectory(src/curl) - set_property(TARGET libcurl_static PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") + link_directories(/usr/local/lib) endif() - - if(USE_SYSTEM_OPENSSL) - pkg_check_modules(OpenSSL REQUIRED IMPORTED_TARGET openssl) - else() - set(BUILD_SHARED_LIBS OFF) - set(BUILD_STATIC_LIBS ON) - add_subdirectory(src/openssl) - set_property(TARGET ssl PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") - set_property(TARGET crypto PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") + + if (SE_PLATFORM_LINUX OR SE_PLATFORM_FREEBSD) + find_package(X11 REQUIRED) endif() -endif() - -# TinyFileDialogs -if ((NOT IOS) AND (NOT EMSCRIPTEN) AND (NOT ANDROID) AND (NOT SE_PLATFORM_LINUX) AND (NOT SE_PLATFORM_FREEBSD) AND NOT RETRO_CORE_ONLY) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_TINY_FILE_DIALOGS") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_TINY_FILE_DIALOGS") - add_library(tinyfd STATIC - src/tinyfiledialogs/tinyfiledialogs.h - src/tinyfiledialogs/tinyfiledialogs.c - ) - target_include_directories(tinyfd INTERFACE src/tinyfiledialogs) - set(LINK_LIBS ${LINK_LIBS} tinyfd) - set_property(TARGET tinyfd PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") -endif() - -if(NOT EMSCRIPTEN AND NOT RETRO_CORE_ONLY) - set(ENABLE_HTTP_CONTROL_SERVER 1) -endif() - -#=== LIBRARY: cimgui + Dear ImGui -add_library(cimgui STATIC - src/cimgui/cimgui.cpp - src/cimgui/cimgui.h - src/cimgui/imgui/imgui.cpp - src/cimgui/imgui/imgui.h - src/cimgui/imgui/imgui_widgets.cpp - src/cimgui/imgui/imgui_draw.cpp - src/cimgui/imgui/imgui_tables.cpp - src/cimgui/imgui/imgui_demo.cpp - ) -set_property(TARGET cimgui PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") -target_include_directories(cimgui INTERFACE src/cimgui) - -if(USE_SDL AND NOT RETRO_CORE_ONLY) - if (USE_SYSTEM_SDL2) - pkg_check_modules(SDL2 REQUIRED IMPORTED_TARGET sdl2) - else() - message("Build with SDL!") - - #=== LIBRARY: SDL2 - set(SDL_SHARED OFF CACHE BOOL "Build Shared" FORCE) - set(SDL_STATIC ON CACHE BOOL "Build Static" FORCE) - set(SDL_FORCE_STATIC_VCRT ON CACHE BOOL "USE LIBC" FORCE) - set(SDL_LIBC ON CACHE BOOL "USE LIBC" FORCE) - set(SDL_STATIC_PIC ON CACHE BOOL "Build Static PIC" FORCE) - # Allow some projects to be built conditionally. - set(SDL2_DISABLE_SDL2MAIN ON CACHE BOOL "Disable building/installation of SDL2main" FORCE) - set(SDL2_DISABLE_INSTALL ON CACHE BOOL "Disable installation of SDL2" FORCE) - set(SDL2_DISABLE_UNINSTALL ON CACHE BOOL "Disable uninstallation of SDL2" FORCE) - - set(SDL_LIBC ON CACHE BOOL "Use the system C library" ${OPT_DEF_LIBC} FORCE) - set(SDL_ATOMIC OFF CACHE BOOL "SDL Video support" FORCE) - set(SDL_AUDIO OFF CACHE BOOL "SDL Video support" FORCE) - set(SDL_FILE OFF CACHE BOOL "SDL Video support" FORCE) - set(SDL_THREAD OFF CACHE BOOL "SDL Video support" FORCE) - set(SDL_RENDER OFF CACHE BOOL "SDL Video support" FORCE) - set(SDL_LOCALE OFF CACHE BOOL "SDL Video support" FORCE) - - add_definitions(-DSDL_LEAN_AND_MEAN=1) - add_subdirectory(src/SDL2) - set_property(TARGET SDL2-static PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") + + if (USE_SYSTEM_CURL OR USE_SYSTEM_OPENSSL) + find_package(PkgConfig REQUIRED) endif() -endif() - -if (EMSCRIPTEN AND NOT RETRO_CORE_ONLY) - set(CMAKE_EXECUTABLE_SUFFIX ".html") # This line is used to set your executable to build with the emscripten html template so taht you can directly open it. - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -sEXPORTED_FUNCTIONS=[_se_load_settings,_se_login_cloud,_https_open_url,_main,_malloc,_free,_em_oath_sign_in_callback,_em_https_request_callback_wrapper,_gsecret_web] -sEXPORTED_RUNTIME_METHODS=ccall") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -sEXPORTED_FUNCTIONS=[_se_load_settings,_se_login_cloud,_https_open_url,_main,_malloc,_free,_em_oath_sign_in_callback,_em_https_request_callback_wrapper,_gsecret_web] -sEXPORTED_RUNTIME_METHODS=ccall") -endif () - -#=== LIBRARY: sokol -# add headers to the the file list because they are useful to have in IDEs -set(SOKOL_HEADERS - src/sokol/sokol_gfx.h - src/sokol/sokol_app.h - src/sokol/sokol_time.h - src/sokol/sokol_imgui.h - src/sokol/sokol_audio.h - src/sokol/sokol_glue.h) -if(ANDROID ) - add_definitions(-DSE_PLATFORM_ANDROID) - set(LINK_LIBS ${LINK_LIBS} GLESv3 EGL OpenSLES log android) - message("Android Build!") -endif() -if(MACOS OR IOS) - add_library(sokol STATIC src/sokol/sokol.m ${SOKOL_HEADERS}) - if(MACOS AND (NOT IOS)) - add_definitions(-DSE_PLATFORM_MACOS) - target_link_libraries(sokol PUBLIC - "-framework QuartzCore" - "-framework Cocoa" - "-framework MetalKit" - "-framework AudioToolbox" - "-framework Metal") - endif() - if(IOS) - set(system_libs ${system_libs} "-framework Foundation" "-framework UIKit" "-framework AudioToolbox" "-framework AVFoundation -framework GameController -framework WebKit -framework SafariServices") - if (SOKOL_BACKEND STREQUAL SOKOL_METAL) - set(system_libs ${system_libs} "-framework Metal" "-framework MetalKit") - else() - set(system_libs ${system_libs} "-framework OpenGLES" "-framework GLKit") - endif() - target_link_libraries(sokol PUBLIC ${system_libs}) + + if(NOT EMSCRIPTEN) + if (USE_SYSTEM_CURL) + pkg_check_modules(Curl REQUIRED IMPORTED_TARGET libcurl) + else() + set(WITH_APPS OFF CACHE BOOL "" FORCE) # don't build executable + set(CURL_USE_LIBSSH2 OFF) + set(CURL_USE_LIBPSL OFF) + set(CURL_USE_OPENSSL ON) + set(CURL_DISABLE_LDAP ON) + set(USE_LIBIDN2 OFF) + set(CURL_ENABLE_EXPORT_TARGET OFF) + set(BUILD_TESTING OFF) + set(BUILD_CURL_EXE OFF) + set(BUILD_SHARED_LIBS OFF) + set(BUILD_STATIC_LIBS ON) + if (WIN32) + set(CURL_STATIC_CRT ON) + endif() + # see "Important static libcurl usage note" in INSTALL.md + add_definitions(-DCURL_STATICLIB) + add_subdirectory(src/curl) + set_property(TARGET libcurl_static PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") endif() -else() - add_library(sokol STATIC src/sokol/sokol.c ${SOKOL_HEADERS}) - set_property(TARGET sokol PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") - if (SE_PLATFORM_LINUX OR SE_PLATFORM_FREEBSD) - target_include_directories(sokol PRIVATE "${X11_INCLUDE_DIR}") - target_link_libraries(sokol INTERFACE ${X11_X11_LIB} ${X11_Xi_LIB} ${X11_Xcursor_LIB} OpenGL::OpenGL dl) + + if(USE_SYSTEM_OPENSSL) + pkg_check_modules(OpenSSL REQUIRED IMPORTED_TARGET openssl) + else() + set(BUILD_SHARED_LIBS OFF) + set(BUILD_STATIC_LIBS ON) + add_subdirectory(src/openssl) + set_property(TARGET ssl PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") + set_property(TARGET crypto PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") endif() - if (CMAKE_SYSTEM_NAME STREQUAL Linux) - target_link_libraries(sokol INTERFACE m) - target_link_libraries(sokol PUBLIC Threads::Threads) + endif() + + # TinyFileDialogs + if ((NOT IOS) AND (NOT EMSCRIPTEN) AND (NOT ANDROID) AND (NOT SE_PLATFORM_LINUX) AND (NOT SE_PLATFORM_FREEBSD)) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_TINY_FILE_DIALOGS") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_TINY_FILE_DIALOGS") + add_library(tinyfd STATIC + src/tinyfiledialogs/tinyfiledialogs.h + src/tinyfiledialogs/tinyfiledialogs.c + ) + target_include_directories(tinyfd INTERFACE src/tinyfiledialogs) + set(LINK_LIBS ${LINK_LIBS} tinyfd) + set_property(TARGET tinyfd PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") + endif() + + if(NOT EMSCRIPTEN) + set(ENABLE_HTTP_CONTROL_SERVER 1) + endif() + + #=== LIBRARY: cimgui + Dear ImGui + add_library(cimgui STATIC + src/cimgui/cimgui.cpp + src/cimgui/cimgui.h + src/cimgui/imgui/imgui.cpp + src/cimgui/imgui/imgui.h + src/cimgui/imgui/imgui_widgets.cpp + src/cimgui/imgui/imgui_draw.cpp + src/cimgui/imgui/imgui_tables.cpp + src/cimgui/imgui/imgui_demo.cpp + ) + set_property(TARGET cimgui PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") + target_include_directories(cimgui INTERFACE src/cimgui) + + if(USE_SDL) + if (USE_SYSTEM_SDL2) + pkg_check_modules(SDL2 REQUIRED IMPORTED_TARGET sdl2) + else() + message("Build with SDL!") + + #=== LIBRARY: SDL2 + set(SDL_SHARED OFF CACHE BOOL "Build Shared" FORCE) + set(SDL_STATIC ON CACHE BOOL "Build Static" FORCE) + set(SDL_FORCE_STATIC_VCRT ON CACHE BOOL "USE LIBC" FORCE) + set(SDL_LIBC ON CACHE BOOL "USE LIBC" FORCE) + set(SDL_STATIC_PIC ON CACHE BOOL "Build Static PIC" FORCE) + # Allow some projects to be built conditionally. + set(SDL2_DISABLE_SDL2MAIN ON CACHE BOOL "Disable building/installation of SDL2main" FORCE) + set(SDL2_DISABLE_INSTALL ON CACHE BOOL "Disable installation of SDL2" FORCE) + set(SDL2_DISABLE_UNINSTALL ON CACHE BOOL "Disable uninstallation of SDL2" FORCE) + + set(SDL_LIBC ON CACHE BOOL "Use the system C library" ${OPT_DEF_LIBC} FORCE) + set(SDL_ATOMIC OFF CACHE BOOL "SDL Video support" FORCE) + set(SDL_AUDIO OFF CACHE BOOL "SDL Video support" FORCE) + set(SDL_FILE OFF CACHE BOOL "SDL Video support" FORCE) + set(SDL_THREAD OFF CACHE BOOL "SDL Video support" FORCE) + set(SDL_RENDER OFF CACHE BOOL "SDL Video support" FORCE) + set(SDL_LOCALE OFF CACHE BOOL "SDL Video support" FORCE) + + add_definitions(-DSDL_LEAN_AND_MEAN=1) + add_subdirectory(src/SDL2) + set_property(TARGET SDL2-static PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") endif() + endif() + + if (EMSCRIPTEN) + set(CMAKE_EXECUTABLE_SUFFIX ".html") # This line is used to set your executable to build with the emscripten html template so taht you can directly open it. + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -sEXPORTED_FUNCTIONS=[_se_load_settings,_se_login_cloud,_https_open_url,_main,_malloc,_free,_em_oath_sign_in_callback,_em_https_request_callback_wrapper,_gsecret_web] -sEXPORTED_RUNTIME_METHODS=ccall") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -sEXPORTED_FUNCTIONS=[_se_load_settings,_se_login_cloud,_https_open_url,_main,_malloc,_free,_em_oath_sign_in_callback,_em_https_request_callback_wrapper,_gsecret_web] -sEXPORTED_RUNTIME_METHODS=ccall") + endif () + + #=== LIBRARY: sokol + # add headers to the the file list because they are useful to have in IDEs + set(SOKOL_HEADERS + src/sokol/sokol_gfx.h + src/sokol/sokol_app.h + src/sokol/sokol_time.h + src/sokol/sokol_imgui.h + src/sokol/sokol_audio.h + src/sokol/sokol_glue.h) + if(ANDROID) + add_definitions(-DSE_PLATFORM_ANDROID) + set(LINK_LIBS ${LINK_LIBS} GLESv3 EGL OpenSLES log android) + message("Android Build!") + endif() + if(MACOS OR IOS) + add_library(sokol STATIC src/sokol/sokol.m ${SOKOL_HEADERS}) + if(MACOS AND (NOT IOS)) + add_definitions(-DSE_PLATFORM_MACOS) + target_link_libraries(sokol PUBLIC + "-framework QuartzCore" + "-framework Cocoa" + "-framework MetalKit" + "-framework AudioToolbox" + "-framework Metal") + endif() + if(IOS) + set(system_libs ${system_libs} "-framework Foundation" "-framework UIKit" "-framework AudioToolbox" "-framework AVFoundation -framework GameController -framework WebKit -framework SafariServices") + if (SOKOL_BACKEND STREQUAL SOKOL_METAL) + set(system_libs ${system_libs} "-framework Metal" "-framework MetalKit") + else() + set(system_libs ${system_libs} "-framework OpenGLES" "-framework GLKit") + endif() + target_link_libraries(sokol PUBLIC ${system_libs}) + endif() + else() + add_library(sokol STATIC src/sokol/sokol.c ${SOKOL_HEADERS}) + set_property(TARGET sokol PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") + if (SE_PLATFORM_LINUX OR SE_PLATFORM_FREEBSD) + target_include_directories(sokol PRIVATE "${X11_INCLUDE_DIR}") + target_link_libraries(sokol INTERFACE ${X11_X11_LIB} ${X11_Xi_LIB} ${X11_Xcursor_LIB} OpenGL::OpenGL dl) + endif() + if (CMAKE_SYSTEM_NAME STREQUAL Linux) + target_link_libraries(sokol INTERFACE m) + target_link_libraries(sokol PUBLIC Threads::Threads) + endif() + endif() + target_link_libraries(sokol PUBLIC cimgui) + target_include_directories(sokol INTERFACE src/sokol) endif() -target_link_libraries(sokol PUBLIC cimgui) -target_include_directories(sokol INTERFACE src/sokol) - find_package(Git) if(GIT_EXECUTABLE) @@ -299,7 +299,6 @@ if(GIT_EXECUTABLE) set(GIT_TAG ${GIT_DESCRIBE}) endif() endif() - # Final fallback: Just use a bogus version string that is semantically older # than anything else and spit out a warning to the developer. if(NOT DEFINED GIT_COMMIT_HASH) @@ -310,76 +309,75 @@ add_definitions(-DGIT_COMMIT_HASH=\"${GIT_COMMIT_HASH}\") add_definitions(-DGIT_BRANCH=\"${GIT_BRANCH}\") add_definitions(-DGIT_TAG=\"${GIT_TAG}\") -set(SKYEMU_SRC src/main.c src/shared.c src/cloud.cpp src/https.cpp src/stb.c src/miniz.c src/res.c src/localization.c src/mutex.cpp) - -if(ENABLE_HTTP_CONTROL_SERVER) - add_definitions(-DENABLE_HTTP_CONTROL_SERVER=1) - set(SKYEMU_SRC ${SKYEMU_SRC} src/http_control_server.cpp) -endif() - -set(SKYEMU_SRC ${SKYEMU_SRC} src/cloud.cpp src/https.cpp src/atlas.cpp) - -if(UNICODE_GUI) - set(SKYEMU_SRC ${SKYEMU_SRC} src/utf8proc/utf8proc.c) - include_directories(src/utf8proc/) - add_definitions(-DUNICODE_GUI=1) - add_definitions(-DUTF8PROC_STATIC=1) -endif() - -if(USE_SDL AND NOT USE_SYSTEM_SDL2 AND NOT RETRO_CORE_ONLY) - include_directories(${SDL2_INCLUDE_DIRS}) -endif() +if(NOT RETRO_CORE_ONLY) + set(SKYEMU_SRC src/main.c src/shared.c src/cloud.cpp src/https.cpp src/stb.c src/miniz.c src/res.c src/localization.c src/mutex.cpp) + + if(ENABLE_HTTP_CONTROL_SERVER) + add_definitions(-DENABLE_HTTP_CONTROL_SERVER=1) + set(SKYEMU_SRC ${SKYEMU_SRC} src/http_control_server.cpp) + endif() + + set(SKYEMU_SRC ${SKYEMU_SRC} src/cloud.cpp src/https.cpp src/atlas.cpp) + + if(UNICODE_GUI) + set(SKYEMU_SRC ${SKYEMU_SRC} src/utf8proc/utf8proc.c) + include_directories(src/utf8proc/) + add_definitions(-DUNICODE_GUI=1) + add_definitions(-DUTF8PROC_STATIC=1) + endif() + + if(USE_SDL AND NOT USE_SYSTEM_SDL2) + include_directories(${SDL2_INCLUDE_DIRS}) + endif() -if(ENABLE_RETRO_ACHIEVEMENTS AND NOT RETRO_CORE_ONLY) - add_definitions(-DENABLE_RETRO_ACHIEVEMENTS=1) - add_definitions(-DRC_CLIENT_SUPPORTS_HASH) - add_library(Lua STATIC src/lua/onelua.c) + if(ENABLE_RETRO_ACHIEVEMENTS) + add_definitions(-DENABLE_RETRO_ACHIEVEMENTS=1) + add_definitions(-DRC_CLIENT_SUPPORTS_HASH) + add_library(Lua STATIC src/lua/onelua.c) + if(IOS) + target_compile_definitions(Lua PRIVATE LUA_USE_IOS) # makes it so system is not used + endif() + set_property(TARGET Lua PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") + set(LINK_LIBS ${LINK_LIBS} Lua) + set(RCHEEVOS_SRC src/rcheevos/src/rapi/rc_api_common.c + src/rcheevos/src/rapi/rc_api_editor.c + src/rcheevos/src/rapi/rc_api_info.c + src/rcheevos/src/rapi/rc_api_runtime.c + src/rcheevos/src/rapi/rc_api_user.c + src/rcheevos/src/rapi/rc_api_common.c + src/rcheevos/src/rcheevos/alloc.c + src/rcheevos/src/rcheevos/condition.c + src/rcheevos/src/rcheevos/condset.c + src/rcheevos/src/rcheevos/consoleinfo.c + src/rcheevos/src/rcheevos/format.c + src/rcheevos/src/rcheevos/lboard.c + src/rcheevos/src/rcheevos/memref.c + src/rcheevos/src/rcheevos/operand.c + src/rcheevos/src/rc_compat.c + src/rcheevos/src/rc_client.c + src/rcheevos/src/rc_util.c + src/rcheevos/src/rc_client_raintegration.c + src/rcheevos/src/rcheevos/rc_validate.c + src/rcheevos/src/rcheevos/richpresence.c + src/rcheevos/src/rcheevos/runtime.c + src/rcheevos/src/rcheevos/runtime_progress.c + src/rcheevos/src/rcheevos/trigger.c + src/rcheevos/src/rcheevos/value.c + src/rcheevos/src/rhash/cdreader.c + src/rcheevos/src/rhash/hash.c + src/rcheevos/src/rhash/md5.c + src/rcheevos/src/rhash/aes.c + src/rcheevos/src/rurl/url.c + ) + set(SKYEMU_SRC ${SKYEMU_SRC} ${RCHEEVOS_SRC} src/retro_achievements.cpp) + include_directories(src/rcheevos/include src/lua) + endif() + if(IOS) - target_compile_definitions(Lua PRIVATE LUA_USE_IOS) # makes it so system is not used + set(SKYEMU_SRC ${SKYEMU_SRC} src/ios_support.m) + add_definitions(-DSE_PLATFORM_IOS) endif() - set_property(TARGET Lua PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") - set(LINK_LIBS ${LINK_LIBS} Lua) - set(RCHEEVOS_SRC src/rcheevos/src/rapi/rc_api_common.c - src/rcheevos/src/rapi/rc_api_editor.c - src/rcheevos/src/rapi/rc_api_info.c - src/rcheevos/src/rapi/rc_api_runtime.c - src/rcheevos/src/rapi/rc_api_user.c - src/rcheevos/src/rapi/rc_api_common.c - src/rcheevos/src/rcheevos/alloc.c - src/rcheevos/src/rcheevos/condition.c - src/rcheevos/src/rcheevos/condset.c - src/rcheevos/src/rcheevos/consoleinfo.c - src/rcheevos/src/rcheevos/format.c - src/rcheevos/src/rcheevos/lboard.c - src/rcheevos/src/rcheevos/memref.c - src/rcheevos/src/rcheevos/operand.c - src/rcheevos/src/rc_compat.c - src/rcheevos/src/rc_client.c - src/rcheevos/src/rc_util.c - src/rcheevos/src/rc_client_raintegration.c - src/rcheevos/src/rcheevos/rc_validate.c - src/rcheevos/src/rcheevos/richpresence.c - src/rcheevos/src/rcheevos/runtime.c - src/rcheevos/src/rcheevos/runtime_progress.c - src/rcheevos/src/rcheevos/trigger.c - src/rcheevos/src/rcheevos/value.c - src/rcheevos/src/rhash/cdreader.c - src/rcheevos/src/rhash/hash.c - src/rcheevos/src/rhash/md5.c - src/rcheevos/src/rhash/aes.c - src/rcheevos/src/rurl/url.c - ) - set(SKYEMU_SRC ${SKYEMU_SRC} ${RCHEEVOS_SRC} src/retro_achievements.cpp) - include_directories(src/rcheevos/include src/lua) -endif() -if(IOS) - set(SKYEMU_SRC ${SKYEMU_SRC} src/ios_support.m) - add_definitions(-DSE_PLATFORM_IOS) -endif() - -if(NOT RETRO_CORE_ONLY) - if(WIN32) set(APP_ICON_RESOURCE_WINDOWS "${CMAKE_CURRENT_SOURCE_DIR}/src/resources/icons/appicon.rc") add_executable(${PROJECT_NAME} WIN32 ${SKYEMU_SRC} ${APP_ICON_RESOURCE_WINDOWS}) @@ -422,58 +420,60 @@ if (EMSCRIPTEN) configure_file(src/sw.js.in ${CMAKE_CURRENT_BINARY_DIR}/bin/sw.js) endif () -set(LINK_LIBS ${LINK_LIBS} sokol ${ALSA_LIBRARIES}) - -if(NOT EMSCRIPTEN) - if (USE_SYSTEM_OPENSSL) - set(LINK_LIBS ${LINK_LIBS} PkgConfig::OpenSSL) - else() - target_include_directories(${PROJECT_NAME} PRIVATE src/openssl/include) - # OpenSSL autogenerates some header file such as openssl/opensslconf.h and we want to include them - target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src/openssl/include) - endif() - if (USE_SYSTEM_CURL) - set(LINK_LIBS ${LINK_LIBS} PkgConfig::Curl) - else() - target_include_directories(${PROJECT_NAME} PRIVATE src/curl/include) - set(LINK_LIBS ${LINK_LIBS} libcurl_static ssl crypto) +if(NOT RETRO_CORE_ONLY) + set(LINK_LIBS ${LINK_LIBS} sokol ${ALSA_LIBRARIES}) + + if(NOT EMSCRIPTEN) + if (USE_SYSTEM_OPENSSL) + set(LINK_LIBS ${LINK_LIBS} PkgConfig::OpenSSL) + else() + target_include_directories(${PROJECT_NAME} PRIVATE src/openssl/include) + # OpenSSL autogenerates some header file such as openssl/opensslconf.h and we want to include them + target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src/openssl/include) + endif() + if (USE_SYSTEM_CURL) + set(LINK_LIBS ${LINK_LIBS} PkgConfig::Curl) + else() + target_include_directories(${PROJECT_NAME} PRIVATE src/curl/include) + set(LINK_LIBS ${LINK_LIBS} libcurl_static ssl crypto) + endif() endif() -endif() - -set(CAPSTONE_BUILD_TESTS OFF CACHE BOOL "Build capstone tests" FORCE) -set(CAPSTONE_BUILD_CSTOOL OFF CACHE BOOL "Build capstone cstool" FORCE) -set(CAPSTONE_BUILD_SHARED OFF CACHE BOOL "Build capstone shared library" FORCE) -set(CAPSTONE_ARCHITECTURE_DEFAULT OFF CACHE BOOL "Include all CAPSTONE architectures" FORCE) -set(CAPSTONE_ARM_SUPPORT ON CACHE BOOL "ARM disasm support") -set(CAPSTONE_BUILD_STATIC_RUNTIME ON CACHE BOOL "Capstone static runtime" FORCE) -add_subdirectory(src/capstone EXCLUDE_FROM_ALL) -set_property(TARGET capstone-static PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") -set(LINK_LIBS ${LINK_LIBS} capstone-static ${ALSA_LIBRARIES}) -if(USE_SDL) - if(USE_SYSTEM_SDL2) - set(LINK_LIBS ${LINK_LIBS} PkgConfig::SDL2) - else() - set(LINK_LIBS ${LINK_LIBS} SDL2-static) + set(CAPSTONE_BUILD_TESTS OFF CACHE BOOL "Build capstone tests" FORCE) + set(CAPSTONE_BUILD_CSTOOL OFF CACHE BOOL "Build capstone cstool" FORCE) + set(CAPSTONE_BUILD_SHARED OFF CACHE BOOL "Build capstone shared library" FORCE) + set(CAPSTONE_ARCHITECTURE_DEFAULT OFF CACHE BOOL "Include all CAPSTONE architectures" FORCE) + set(CAPSTONE_ARM_SUPPORT ON CACHE BOOL "ARM disasm support") + set(CAPSTONE_BUILD_STATIC_RUNTIME ON CACHE BOOL "Capstone static runtime" FORCE) + add_subdirectory(src/capstone EXCLUDE_FROM_ALL) + set_property(TARGET capstone-static PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") + + set(LINK_LIBS ${LINK_LIBS} capstone-static ${ALSA_LIBRARIES}) + if(USE_SDL) + if(USE_SYSTEM_SDL2) + set(LINK_LIBS ${LINK_LIBS} PkgConfig::SDL2) + else() + set(LINK_LIBS ${LINK_LIBS} SDL2-static) + endif() endif() -endif() -target_link_libraries(${PROJECT_NAME} ${LINK_LIBS}) -if(MSVC) - set_property(TARGET ${PROJECT_NAME} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") -elseif(MACOS OR IOS) - set_target_properties(${PROJECT_NAME} PROPERTIES - MACOSX_BUNDLE ON - MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME} - MACOSX_BUNDLE_BUNDLE_IDENTIFIER "com.sky.${PROJECT_NAME}") -elseif(EMSCRIPTEN) - add_custom_command( - TARGET ${PROJECT_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${CMAKE_CURRENT_SOURCE_DIR}/src/resources/icons/favicon_package - ${CMAKE_CURRENT_BINARY_DIR}/bin) + target_link_libraries(${PROJECT_NAME} ${LINK_LIBS}) + if(MSVC) + set_property(TARGET ${PROJECT_NAME} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") + elseif(MACOS OR IOS) + set_target_properties(${PROJECT_NAME} PROPERTIES + MACOSX_BUNDLE ON + MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME} + MACOSX_BUNDLE_BUNDLE_IDENTIFIER "com.sky.${PROJECT_NAME}") + elseif(EMSCRIPTEN) + add_custom_command( + TARGET ${PROJECT_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + ${CMAKE_CURRENT_SOURCE_DIR}/src/resources/icons/favicon_package + ${CMAKE_CURRENT_BINARY_DIR}/bin) + endif() + + install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" + BUNDLE DESTINATION "${CMAKE_INSTALL_PREFIX}/Applications") endif() - -install(TARGETS ${PROJECT_NAME} - RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" - BUNDLE DESTINATION "${CMAKE_INSTALL_PREFIX}/Applications") diff --git a/src/nds.h b/src/nds.h index 2acab1643..563240301 100644 --- a/src/nds.h +++ b/src/nds.h @@ -6,7 +6,7 @@ #include "freebios/drastic_bios_arm7.h" #include "freebios/drastic_bios_arm9.h" -#define NDS_SCANLINE_PPU 1 +#define NDS_SCANLINE_PPU 0 typedef enum{ kARM7, @@ -2744,9 +2744,10 @@ static FORCE_INLINE uint32_t nds9_process_memory_transaction_cpu(nds_t * nds, ui return *ret; } } - //int old_slow_bus_cycles = nds->mem.slow_bus_cycles; + int old_slow_bus_cycles = nds->mem.slow_bus_cycles; uint32_t ret_data = nds9_process_memory_transaction(nds,addr,data,transaction_type); - /*int bus = addr>>24; + int bus = addr>>24; + if((bus==0x02&& SB_BFE(addr,0,24)<0x00800000)||(bus==0xff&& SB_BFE(addr,0,24)<0x00008000)){ if(!(transaction_type&NDS_MEM_WRITE)){ bool found = false; @@ -2768,7 +2769,8 @@ static FORCE_INLINE uint32_t nds9_process_memory_transaction_cpu(nds_t * nds, ui } } if(!found){ - int seq_words = 4; + // Cache can stream results out as they are fetched from memory, so wait is dependent on what word in cacheline issues the request. + int seq_words = 1+(addr%32)/4; if(code)nds->mem.slow_bus_cycles=old_slow_bus_cycles+seq_words; else nds->mem.slow_bus_cycles=old_slow_bus_cycles+seq_words; }else{ @@ -2777,7 +2779,8 @@ static FORCE_INLINE uint32_t nds9_process_memory_transaction_cpu(nds_t * nds, ui }else{ nds->mem.slow_bus_cycles= old_slow_bus_cycles; } - }*/ + } + return ret_data; } @@ -5552,7 +5555,7 @@ static FORCE_INLINE int nds_ppu_compute_max_fast_forward(nds_t *nds){ //If inside hblank, can fastforward to outside of hblank if(scanline_clock>=NDS_LCD_W*NDS_CLOCKS_PER_DOT&&scanline_clock<=355*NDS_CLOCKS_PER_DOT) return 355*NDS_CLOCKS_PER_DOT-scanline_clock-1; //If inside hrender, can fastforward to hblank if not the first pixel and not visible - bool not_visible = nds->ppu[0].scan_clock>NDS_LCD_H*355*NDS_CLOCKS_PER_DOT|| NDS_SCANLINE_PPU; + bool not_visible = NDS_SCANLINE_PPU || nds->ppu[0].scan_clock>NDS_LCD_H*355*NDS_CLOCKS_PER_DOT; if(not_visible&& (scanline_clock>=1 && scanline_clock<=NDS_LCD_W*NDS_CLOCKS_PER_DOT))return NDS_LCD_W*NDS_CLOCKS_PER_DOT-scanline_clock-1; return (NDS_CLOCKS_PER_DOT-1)-((nds->ppu[0].scan_clock)%NDS_CLOCKS_PER_DOT); } @@ -5560,12 +5563,12 @@ static FORCE_INLINE void nds_tick_ppu(nds_t* nds,bool render){ if(SB_LIKELY(nds->ppu_fast_forward_ticks-->0))return; //if(SB_LIKELY(nds->ppu[0].scan_clock%NDS_CLOCKS_PER_DOT))return; int clocks_per_frame = 355*263*NDS_CLOCKS_PER_DOT; - nds->ppu[0].scan_clock%=clocks_per_frame; nds->ppu_fast_forward_ticks=nds_ppu_compute_max_fast_forward(nds); int clocks_per_line = 355*NDS_CLOCKS_PER_DOT; int lcd_y = (nds->ppu[0].scan_clock)/clocks_per_line; int lcd_x = ((nds->ppu[0].scan_clock)%clocks_per_line)/NDS_CLOCKS_PER_DOT; nds->ppu[0].scan_clock+=nds->ppu_fast_forward_ticks+1; + nds->ppu[0].scan_clock%=clocks_per_frame; for(int ppu_id=0;ppu_id<2;++ppu_id){ nds_ppu_t * ppu = nds->ppu+ppu_id; uint32_t dispcapcnt = nds9_io_read32(nds,NDS_DISPCAPCNT);