From 989a8ca90ed8ae55c9df10999d57a091d0e56618 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Mon, 12 Dec 2022 19:22:17 +0100 Subject: [PATCH] Port PSP SDL_main to header-only + SDL_RunApp() --- CMakeLists.txt | 3 ++ include/SDL3/SDL_main.h | 2 +- src/core/psp/SDL_psp.c | 83 +++++++++++++++++++++++++++++++++++++ src/main/psp/SDL_psp_main.c | 66 ++--------------------------- 4 files changed, 90 insertions(+), 64 deletions(-) create mode 100644 src/core/psp/SDL_psp.c diff --git a/CMakeLists.txt b/CMakeLists.txt index a4ddfdcd6..a67f210e6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2572,6 +2572,9 @@ elseif(PSP) file(GLOB PSP_MAIN_SOURCES ${SDL3_SOURCE_DIR}/src/main/psp/*.c) list(APPEND SDLMAIN_SOURCES ${PSP_MAIN_SOURCES}) + file(GLOB PSP_CORE_SOURCES ${SDL3_SOURCE_DIR}/src/core/psp/*.c) + list(APPEND SOURCE_FILES ${PSP_CORE_SOURCES}) + if(SDL_AUDIO) set(SDL_AUDIO_DRIVER_PSP 1) file(GLOB PSP_AUDIO_SOURCES ${SDL3_SOURCE_DIR}/src/audio/psp/*.c) diff --git a/include/SDL3/SDL_main.h b/include/SDL3/SDL_main.h index 8a47091af..193d44bfe 100644 --- a/include/SDL3/SDL_main.h +++ b/include/SDL3/SDL_main.h @@ -280,7 +280,7 @@ extern DECLSPEC void SDLCALL SDL_GDKSuspendComplete(void); #if !defined(SDL_MAIN_HANDLED) && !defined(SDL_MAIN_NOIMPL) /* include header-only SDL_main implementations */ #if defined(__WIN32__) || defined(__GDK__) || defined(__IOS__) || defined(__TVOS__) \ - || defined(__3DS__) || defined(__NGAGE__) || defined(__PS2__) + || defined(__3DS__) || defined(__NGAGE__) || defined(__PS2__) || defined(__PSP__) /* platforms whichs main (-equivalent) can be implemented in plain C */ #include diff --git a/src/core/psp/SDL_psp.c b/src/core/psp/SDL_psp.c new file mode 100644 index 000000000..b9877af8e --- /dev/null +++ b/src/core/psp/SDL_psp.c @@ -0,0 +1,83 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2022 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#include "SDL_internal.h" + +#ifdef __PSP__ + +/* SDL_RunApp() for PSP based on SDL_psp_main.c, placed in the public domain by Sam Lantinga 3/13/14 */ + +#include +#include + +/* If application's main() is redefined as SDL_main, and libSDL_main is + linked, then this file will create the standard exit callback, + define the PSP_MODULE_INFO macro, and exit back to the browser when + the program is finished. + + You can still override other parameters in your own code if you + desire, such as PSP_HEAP_SIZE_KB, PSP_MAIN_THREAD_ATTR, + PSP_MAIN_THREAD_STACK_SIZE, etc. +*/ + +PSP_MODULE_INFO("SDL App", 0, 1, 0); +PSP_MAIN_THREAD_ATTR(THREAD_ATTR_VFPU | THREAD_ATTR_USER); + +int sdl_psp_exit_callback(int arg1, int arg2, void *common) +{ + sceKernelExitGame(); + return 0; +} + +int sdl_psp_callback_thread(SceSize args, void *argp) +{ + int cbid; + cbid = sceKernelCreateCallback("Exit Callback", + sdl_psp_exit_callback, NULL); + sceKernelRegisterExitCallback(cbid); + sceKernelSleepThreadCB(); + return 0; +} + +int sdl_psp_setup_callbacks(void) +{ + int thid; + thid = sceKernelCreateThread("update_thread", + sdl_psp_callback_thread, 0x11, 0xFA0, 0, 0); + if (thid >= 0) { + sceKernelStartThread(thid, 0, 0); + } + return thid; +} + +DECLSPEC int +SDL_RunApp(int argc, char* argv[], SDL_main_func mainFunction, void * reserved) +{ + (void)reserved; + sdl_psp_setup_callbacks(); + + SDL_SetMainReady(); + + (void)SDL_main(argc, argv); + return 0; +} + +#endif /* __PSP__ */ diff --git a/src/main/psp/SDL_psp_main.c b/src/main/psp/SDL_psp_main.c index c05d3ec4f..2eb1cf84f 100644 --- a/src/main/psp/SDL_psp_main.c +++ b/src/main/psp/SDL_psp_main.c @@ -1,68 +1,8 @@ /* SDL_psp_main.c, placed in the public domain by Sam Lantinga 3/13/14 + + empty, moved to SDL_RunApp() in src/core/psp/SDL_psp.c + TODO: remove */ -#include -#include /* until this SDL_main impl is converted to header-only.. */ - -#ifdef __PSP__ - -#include -#include - -#ifdef main -#undef main -#endif - -/* If application's main() is redefined as SDL_main, and libSDL_main is - linked, then this file will create the standard exit callback, - define the PSP_MODULE_INFO macro, and exit back to the browser when - the program is finished. - - You can still override other parameters in your own code if you - desire, such as PSP_HEAP_SIZE_KB, PSP_MAIN_THREAD_ATTR, - PSP_MAIN_THREAD_STACK_SIZE, etc. -*/ - -PSP_MODULE_INFO("SDL App", 0, 1, 0); -PSP_MAIN_THREAD_ATTR(THREAD_ATTR_VFPU | THREAD_ATTR_USER); - -int sdl_psp_exit_callback(int arg1, int arg2, void *common) -{ - sceKernelExitGame(); - return 0; -} - -int sdl_psp_callback_thread(SceSize args, void *argp) -{ - int cbid; - cbid = sceKernelCreateCallback("Exit Callback", - sdl_psp_exit_callback, NULL); - sceKernelRegisterExitCallback(cbid); - sceKernelSleepThreadCB(); - return 0; -} - -int sdl_psp_setup_callbacks(void) -{ - int thid; - thid = sceKernelCreateThread("update_thread", - sdl_psp_callback_thread, 0x11, 0xFA0, 0, 0); - if (thid >= 0) { - sceKernelStartThread(thid, 0, 0); - } - return thid; -} - -int main(int argc, char *argv[]) -{ - sdl_psp_setup_callbacks(); - - SDL_SetMainReady(); - - (void)SDL_main(argc, argv); - return 0; -} - -#endif /* __PSP__ */ /* vi: set ts=4 sw=4 expandtab: */