diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3f5b865d48..2959bd6f9f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -170,69 +170,69 @@ jobs: fail-fast: false matrix: include: - - os: ubuntu-latest + - os: ubuntu-26.04 extra: test cc: clang cxx: clang++ args: ./b.sh --headless --unittest id: clang-normal - - os: ubuntu-latest + - os: ubuntu-26.04 cc: gcc cxx: g++ args: ./b.sh --headless --unittest id: gcc-normal - - os: ubuntu-latest + - os: ubuntu-26.04 extra: android cc: clang cxx: clang++ args: cd android && ./ab.sh -j2 APP_ABI=arm64-v8a UNITTEST=1 HEADLESS=1 id: android-arm64 - - os: ubuntu-latest + - os: ubuntu-26.04 extra: android cc: clang cxx: clang++ args: cd android && ./ab.sh -j2 APP_ABI=armeabi-v7a UNITTEST=1 HEADLESS=1 id: android-arm32 - - os: ubuntu-latest + - os: ubuntu-26.04 extra: android cc: clang cxx: clang++ args: cd android && ./ab.sh -j2 APP_ABI=x86_64 UNITTEST=1 HEADLESS=1 id: android-x86_64 - - os: ubuntu-latest + - os: ubuntu-26.04 extra: android cc: clang cxx: clang++ args: cd android && ./ab.sh -j2 APP_ABI=arm64-v8a OPENXR=1 id: android-vr - - os: ubuntu-latest + - os: ubuntu-26.04 extra: android cc: clang cxx: clang++ args: ./b.sh --libretro_android ppsspp_libretro id: android-libretro - - os: ubuntu-latest + - os: ubuntu-26.04 extra: qt cc: gcc cxx: g++ args: ./b.sh --qt id: qt - - os: ubuntu-latest + - os: ubuntu-26.04 extra: libretro cc: gcc cxx: g++ args: make -C libretro -f Makefile -j2 id: gcc-libretro - - os: ubuntu-latest + - os: ubuntu-26.04 extra: libretro cc: clang cxx: clang++ args: make -C libretro -f Makefile -j2 id: clang-libretro - - os: ubuntu-latest + - os: ubuntu-26.04 extra: loongarch64 cc: gcc cxx: g++ @@ -243,7 +243,7 @@ jobs: extra: test cc: clang cxx: clang++ - args: ./b.sh --headless --unittest --fat --no-png --no-sdl2 + args: ./b.sh --headless --unittest --no-png id: macos - os: macos-latest extra: libretro_mac @@ -276,6 +276,7 @@ jobs: with: cache: true version: 5.15.2 + setup-python: false - name: Setup Android NDK uses: nttld/setup-ndk@ed92fe6cadad69be94a966a7ee3271275e62f779 # v1.6.0 @@ -287,9 +288,12 @@ jobs: - name: Install Linux dependencies if: runner.os == 'Linux' && matrix.extra != 'android' && matrix.extra != 'loongarch64' run: | - sudo add-apt-repository -y "deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc) main universe restricted multiverse" sudo apt-get update -y -qq - sudo apt-get install libsdl2-dev libgl1-mesa-dev libglu1-mesa-dev libsdl2-ttf-dev libfontconfig1-dev + sudo apt-get install libsdl3-dev libgl1-mesa-dev libglu1-mesa-dev libsdl3-ttf-dev libfontconfig1-dev + + - name: Install macOS SDL3 dependencies + if: runner.os == 'macOS' && matrix.id == 'macos' + run: brew install sdl3 sdl3_ttf - name: Install loongarch64 cross-compilation dependencies if: matrix.extra == 'loongarch64' @@ -423,7 +427,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, macos-latest] + os: [ubuntu-26.04, macos-latest] runs-on: ${{ matrix.os }} needs: build @@ -441,14 +445,12 @@ jobs: - name: Install Linux dependencies if: runner.os == 'Linux' run: | - sudo add-apt-repository -y "deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc) main universe restricted multiverse" sudo apt-get update -y -qq - sudo apt-get install libsdl2-dev libgl1-mesa-dev libglu1-mesa-dev libsdl2-ttf-dev libfontconfig1-dev + sudo apt-get install libsdl3-dev libgl1-mesa-dev libglu1-mesa-dev libsdl3-ttf-dev libfontconfig1-dev - name: Install macOS dependencies if: runner.os == 'macOS' - run: | - git submodule update --init SDL/macOS + run: brew install sdl3 sdl3_ttf - name: Download build uses: actions/download-artifact@v8 @@ -481,7 +483,7 @@ jobs: steps: - name: Install Linux dependencies (Alpine) run: | - apk add build-base wget git bash cmake python3 glu-dev sdl2-dev + apk add build-base wget git bash cmake python3 glu-dev sdl3-dev sdl3_ttf-dev - uses: actions/checkout@v6 with: diff --git a/CMakeLists.txt b/CMakeLists.txt index 08300723c2..e4b955b719 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -323,7 +323,7 @@ set(SDL_LIB_TARGET "") set(SDL_TTF_LIB_TARGET "") set(FONTCONFIG_LIB_TARGET "") -if(NOT LIBRETRO AND NOT IOS) +if(NOT LIBRETRO AND NOT IOS AND NOT LOONGARCH64_DEVICE) find_package(SDL3 REQUIRED) set(SDL_LIB_TARGET SDL3::SDL3) find_package(SDL3_ttf REQUIRED) @@ -957,6 +957,10 @@ endif() target_link_libraries(Common Ext::Snappy cpu_features) +if(SDL_LIB_TARGET AND TARGET SDL3::Headers) + target_link_libraries(Common SDL3::Headers) +endif() + if(NOT LIBRETRO) target_link_libraries(Common imgui) endif() @@ -1526,8 +1530,6 @@ else() endif() if(APPLE) list(APPEND nativeExtra - SDL/SDLMain.h - SDL/SDLMain.mm SDL/SDLCocoaMetalLayer.h SDL/SDLCocoaMetalLayer.mm SDL/CocoaBarItems.mm diff --git a/SDL/SDLMain.h b/SDL/SDLMain.h deleted file mode 100644 index c56d90cbe8..0000000000 --- a/SDL/SDLMain.h +++ /dev/null @@ -1,16 +0,0 @@ -/* SDLMain.m - main entry point for our Cocoa-ized SDL app - Initial Version: Darrell Walisser - Non-NIB-Code & other changes: Max Horn - - Feel free to customize this file to suit your needs -*/ - -#ifndef _SDLMain_h_ -#define _SDLMain_h_ - -#import - -@interface SDLMain : NSObject -@end - -#endif /* _SDLMain_h_ */ diff --git a/SDL/SDLMain.mm b/SDL/SDLMain.mm deleted file mode 100644 index 0b686a22f4..0000000000 --- a/SDL/SDLMain.mm +++ /dev/null @@ -1,390 +0,0 @@ -/* SDLMain.m - main entry point for our Cocoa-ized SDL app - Initial Version: Darrell Walisser - Non-NIB-Code & other changes: Max Horn - - Feel free to customize this file to suit your needs -*/ - -#include "ppsspp_config.h" -#include -#include "SDLMain.h" -#include "Common/Profiler/Profiler.h" -#include -#include /* for MAXPATHLEN */ -#include - -/* For some reaon, Apple removed setAppleMenu from the headers in 10.4, - but the method still is there and works. To avoid warnings, we declare - it ourselves here. */ -@interface NSApplication(SDL_Missing_Methods) -- (void)setAppleMenu:(NSMenu *)menu; -@end - -/* Use this flag to determine whether we use SDLMain.nib or not */ -#define SDL_USE_NIB_FILE 0 - -/* Use this flag to determine whether we use CPS (docking) or not */ -#define SDL_USE_CPS 1 -#ifdef SDL_USE_CPS -/* Portions of CPS.h */ -typedef struct CPSProcessSerNum -{ - UInt32 lo; - UInt32 hi; -} CPSProcessSerNum; - -extern "C" OSErr CPSGetCurrentProcess( CPSProcessSerNum *psn); -extern "C" OSErr CPSEnableForegroundOperation( CPSProcessSerNum *psn, UInt32 _arg2, UInt32 _arg3, UInt32 _arg4, UInt32 _arg5); -extern "C" OSErr CPSSetFrontProcess( CPSProcessSerNum *psn); - -#endif /* SDL_USE_CPS */ - -static int gArgc; -static char **gArgv; -static BOOL gFinderLaunch; -static BOOL gCalledAppMainline = FALSE; - -static NSString *getApplicationName(void) -{ - const NSDictionary *dict; - NSString *appName = 0; - - /* Determine the application name */ - dict = (const NSDictionary *)CFBundleGetInfoDictionary(CFBundleGetMainBundle()); - if (dict) - appName = [dict objectForKey: @"CFBundleName"]; - - if (![appName length]) - appName = [[NSProcessInfo processInfo] processName]; - - return appName; -} - -#if SDL_USE_NIB_FILE -/* A helper category for NSString */ -@interface NSString (ReplaceSubString) -- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString; -@end -#endif - -@interface NSApplication (SDLApplication) -@end - -@implementation NSApplication (SDLApplication) -/* Invoked from the Quit menu item */ -- (void)terminate:(id)sender -{ - /* Post an SDL_EVENT_QUIT event */ - SDL_Event event; - event.type = SDL_EVENT_QUIT; - SDL_PushEvent(&event); -} -@end - -/* The main class of the application, the application's delegate */ -@implementation SDLMain - -/* Set the working directory to the .app's parent directory */ -- (void) setupWorkingDirectory:(BOOL)shouldChdir -{ - if (shouldChdir) - { - char parentdir[MAXPATHLEN]; - CFURLRef url = CFBundleCopyBundleURL(CFBundleGetMainBundle()); - CFURLRef url2 = CFURLCreateCopyDeletingLastPathComponent(0, url); - if (CFURLGetFileSystemRepresentation(url2, 1, (UInt8 *)parentdir, MAXPATHLEN)) { - chdir(parentdir); /* chdir to the binary app's parent */ - } - CFRelease(url); - CFRelease(url2); - } -} - -#if SDL_USE_NIB_FILE - -/* Fix menu to contain the real app name instead of "SDL App" */ -- (void)fixMenu:(NSMenu *)aMenu withAppName:(NSString *)appName -{ - NSRange aRange; - NSEnumerator *enumerator; - NSMenuItem *menuItem; - - aRange = [[aMenu title] rangeOfString:@"SDL App"]; - if (aRange.length != 0) - [aMenu setTitle: [[aMenu title] stringByReplacingRange:aRange with:appName]]; - - enumerator = [[aMenu itemArray] objectEnumerator]; - while ((menuItem = [enumerator nextObject])) - { - aRange = [[menuItem title] rangeOfString:@"SDL App"]; - if (aRange.length != 0) - [menuItem setTitle: [[menuItem title] stringByReplacingRange:aRange with:appName]]; - if ([menuItem hasSubmenu]) - [self fixMenu:[menuItem submenu] withAppName:appName]; - } -} - -#else - -static void setApplicationMenu(void) -{ - /* warning: this code is very odd */ - NSMenu *appleMenu; - NSMenuItem *menuItem; - NSString *title; - NSString *appName; - - appName = getApplicationName(); - appleMenu = [[NSMenu alloc] initWithTitle:@""]; - - /* Add menu items */ - title = [@"About " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; - - [appleMenu addItem:[NSMenuItem separatorItem]]; - - title = [@"Hide " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@"h"]; - - menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"]; - [menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)]; - - [appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""]; - - [appleMenu addItem:[NSMenuItem separatorItem]]; - - title = [@"Quit " stringByAppendingString:appName]; - [appleMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"]; - - - /* Put menu into the menubar */ - menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; - [menuItem setSubmenu:appleMenu]; - [[NSApp mainMenu] addItem:menuItem]; - - /* Tell the application object that this is now the application menu */ - [NSApp setAppleMenu:appleMenu]; - - /* Finally give up our references to the objects */ - [appleMenu release]; - [menuItem release]; -} - -/* Create a window menu */ -static void setupWindowMenu(void) -{ - NSMenu *windowMenu; - NSMenuItem *windowMenuItem; - NSMenuItem *menuItem; - - windowMenu = [[NSMenu alloc] initWithTitle:@"Window"]; - - /* "Minimize" item */ - menuItem = [[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"]; - [windowMenu addItem:menuItem]; - [menuItem release]; - - /* Put menu into the menubar */ - windowMenuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""]; - [windowMenuItem setSubmenu:windowMenu]; - [[NSApp mainMenu] addItem:windowMenuItem]; - - /* Tell the application object that this is now the window menu */ - [NSApp setWindowsMenu:windowMenu]; - - /* Finally give up our references to the objects */ - [windowMenu release]; - [windowMenuItem release]; -} - -/* Replacement for NSApplicationMain */ -static void CustomApplicationMain (int argc, char **argv) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - SDLMain *sdlMain; - - /* Ensure the application object is initialised */ - [NSApplication sharedApplication]; - -#ifdef SDL_USE_CPS - { - CPSProcessSerNum PSN; - /* Tell the dock about us */ - if (!CPSGetCurrentProcess(&PSN)) - if (!CPSEnableForegroundOperation(&PSN,0x03,0x3C,0x2C,0x1103)) - if (!CPSSetFrontProcess(&PSN)) - [NSApplication sharedApplication]; - } -#endif /* SDL_USE_CPS */ - - /* Set up the menubar */ - [NSApp setMainMenu:[[NSMenu alloc] init]]; - setApplicationMenu(); - setupWindowMenu(); - - /* Create SDLMain and make it the app delegate */ - sdlMain = [[SDLMain alloc] init]; - [NSApp setDelegate:sdlMain]; - - /* Start the main event loop */ - [NSApp run]; - - [sdlMain release]; - [pool release]; -} - -#endif - - -/* - * Catch document open requests...this lets us notice files when the app - * was launched by double-clicking a document, or when a document was - * dragged/dropped on the app's icon. You need to have a - * CFBundleDocumentsType section in your Info.plist to get this message, - * apparently. - * - * Files are added to gArgv, so to the app, they'll look like command line - * arguments. Previously, apps launched from the finder had nothing but - * an argv[0]. - * - * This message may be received multiple times to open several docs on launch. - * - * This message is ignored once the app's mainline has been called. - */ -- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename -{ - const char *temparg; - size_t arglen; - char *arg; - char **newargv; - - if (!gFinderLaunch) /* MacOS is passing command line args. */ - return FALSE; - - if (gCalledAppMainline) /* app has started, ignore this document. */ - return FALSE; - - temparg = [filename UTF8String]; - arglen = SDL_strlen(temparg) + 1; - arg = (char *) SDL_malloc(arglen); - if (arg == NULL) - return FALSE; - - newargv = (char **) realloc(gArgv, sizeof (char *) * (gArgc + 2)); - if (newargv == NULL) - { - SDL_free(arg); - return FALSE; - } - gArgv = newargv; - - SDL_strlcpy(arg, temparg, arglen); - gArgv[gArgc++] = arg; - gArgv[gArgc] = NULL; - return TRUE; -} - - -/* Called when the internal event loop has just started running */ -- (void) applicationDidFinishLaunching: (NSNotification *) note -{ - int status; - - /* Set the working directory to the .app's parent directory */ - [self setupWorkingDirectory:gFinderLaunch]; - -#if SDL_USE_NIB_FILE - /* Set the main menu to contain the real app name instead of "SDL App" */ - [self fixMenu:[NSApp mainMenu] withAppName:getApplicationName()]; -#endif - - /* Hand off to main application code */ - gCalledAppMainline = TRUE; - status = SDL_main (gArgc, gArgv); - - /* We're done, thank you for playing */ - exit(status); -} -@end - - -@implementation NSString (ReplaceSubString) - -- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString -{ - unsigned int bufferSize; - unsigned int selfLen = [self length]; - unsigned int aStringLen = [aString length]; - unichar *buffer; - NSRange localRange; - NSString *result; - - bufferSize = selfLen + aStringLen - aRange.length; - buffer = (unichar *)NSAllocateMemoryPages(bufferSize*sizeof(unichar)); - - /* Get first part into buffer */ - localRange.location = 0; - localRange.length = aRange.location; - [self getCharacters:buffer range:localRange]; - - /* Get middle part into buffer */ - localRange.location = 0; - localRange.length = aStringLen; - [aString getCharacters:(buffer+aRange.location) range:localRange]; - - /* Get last part into buffer */ - localRange.location = aRange.location + aRange.length; - localRange.length = selfLen - localRange.location; - [self getCharacters:(buffer+aRange.location+aStringLen) range:localRange]; - - /* Build output string */ - result = [NSString stringWithCharacters:buffer length:bufferSize]; - - NSDeallocateMemoryPages(buffer, bufferSize); - - return result; -} - -@end - -#ifdef main -# undef main -#endif - -extern "C" { -/* Main entry point to executable - should *not* be SDL_main! */ -int main (int argc, char **argv) -{ - /* Copy the arguments into a global variable */ - /* This is passed if we are launched by double-clicking */ - if ( argc >= 2 && strncmp (argv[1], "-psn", 4) == 0 ) { - gArgv = (char **) SDL_malloc(sizeof (char *) * 2); - gArgv[0] = argv[0]; - gArgv[1] = NULL; - gArgc = 1; - gFinderLaunch = YES; - } else { - int i; - gArgc = argc; - gArgv = (char **) SDL_malloc(sizeof (char *) * (argc+1)); - for (i = 0; i <= argc; i++) - gArgv[i] = argv[i]; - gFinderLaunch = NO; - } - - PROFILE_INIT(); - - // Ignore sigpipe. - if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { - perror("Unable to ignore SIGPIPE"); - } - -#if SDL_USE_NIB_FILE - NSApplicationMain (argc, argv); -#else - CustomApplicationMain (argc, argv); -#endif - return 0; -} - -} // extern "C" diff --git a/Windows/PPSSPP.vcxproj b/Windows/PPSSPP.vcxproj index 18c8d5d8d7..3e9d803465 100644 --- a/Windows/PPSSPP.vcxproj +++ b/Windows/PPSSPP.vcxproj @@ -1030,14 +1030,6 @@ true true - - true - true - true - true - true - true - true true @@ -1373,14 +1365,6 @@ true true - - true - true - true - true - true - true - diff --git a/Windows/PPSSPP.vcxproj.filters b/Windows/PPSSPP.vcxproj.filters index 40ca4d9637..bde68d098f 100644 --- a/Windows/PPSSPP.vcxproj.filters +++ b/Windows/PPSSPP.vcxproj.filters @@ -496,9 +496,6 @@ Other Platforms\SDL - - Other Platforms\SDL - Other Platforms\SDL @@ -719,9 +716,6 @@ Other Platforms\SDL - - Other Platforms\SDL - Resource Files @@ -886,4 +880,4 @@ assets - \ No newline at end of file + diff --git a/ext/libzip/config.h b/ext/libzip/config.h index d90dda598f..da80b22115 100644 --- a/ext/libzip/config.h +++ b/ext/libzip/config.h @@ -40,6 +40,7 @@ #define HAVE_FTELLO #endif #define HAVE_SNPRINTF +#define HAVE_STDBOOL_H 1 #define HAVE_STRDUP #if !defined(__MINGW32__) && defined(_WIN32) #define HAVE_STRICMP diff --git a/headless/SDLHeadlessHost.cpp b/headless/SDLHeadlessHost.cpp index e9516634f1..edce2489c3 100644 --- a/headless/SDLHeadlessHost.cpp +++ b/headless/SDLHeadlessHost.cpp @@ -45,7 +45,7 @@ SDL_Window *CreateHiddenWindow() { if (!WINDOW_VISIBLE) { flags |= SDL_WINDOW_HIDDEN; } - return SDL_CreateWindow("PPSSPPHeadless", 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, flags); + return SDL_CreateWindow("PPSSPPHeadless", WINDOW_WIDTH, WINDOW_HEIGHT, flags); } class GLDummyGraphicsContext : public GraphicsContext { @@ -60,7 +60,7 @@ public: delete draw_; draw_ = nullptr; - SDL_GL_DeleteContext(glContext_); + SDL_GL_DestroyContext(glContext_); glContext_ = nullptr; SDL_DestroyWindow(screen_); screen_ = nullptr; diff --git a/headless/SDLHeadlessHost.h b/headless/SDLHeadlessHost.h index 413223e2c4..0b4d662fde 100644 --- a/headless/SDLHeadlessHost.h +++ b/headless/SDLHeadlessHost.h @@ -24,8 +24,7 @@ #undef HEADLESSHOST_CLASS #define HEADLESSHOST_CLASS SDLHeadlessHost -struct SDL_Window; -typedef void *SDL_GLContext; +#include class SDLHeadlessHost : public HeadlessHost {