diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ce59d1885..19b4e6e6e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -155,6 +155,70 @@ jobs: cmake -DCMAKE_BUILD_TYPE=MinSizeRel -DBUILD_SDLGPU=On -DBUILD_PRO=On -DBUILD_WITH_ALL=ON .. cmake --build . --config MinSizeRel --parallel + # === Ubuntu-arm64 GLES2 === + linux-arm64-gles2: + runs-on: ubuntu-22.04-arm + + steps: + - uses: actions/checkout@v6 + with: + submodules: recursive + fetch-depth: 0 + + - name: Install Toolchain and Dependencies + run: | + sudo apt-get update + sudo apt-get install -y gcc g++ xz-utils wget python3 rake pkg-config binutils libsdl2-dev libgles2-mesa-dev libegl1-mesa-dev + + - name: Generate Stubs + run: | + for lib in /usr/lib/aarch64-linux-gnu/libSDL2-2.0.so.0 /usr/lib/aarch64-linux-gnu/libGLESv2.so.2 /usr/lib/aarch64-linux-gnu/libEGL.so.1; do \ + outname=$(basename $lib | sed 's/-2.0//; s/\.so\..*/.so/') && \ + echo "Generating stubs for $outname from $lib" && \ + nm -D $lib | grep " T " | awk '{print "void " $3 "(){}"}' > stubs.c && \ + sudo rm -f /usr/lib/aarch64-linux-gnu/$outname && \ + sudo gcc -shared -Wl,-soname,$outname -o /usr/lib/aarch64-linux-gnu/$outname stubs.c; \ + done + + - name: Build + run: | + cd build/linux + cmake ../.. \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_PRO=OFF \ + -DBUILD_WITH_ALL=ON \ + -DCMAKE_C_FLAGS_RELEASE="-Ofast -flto" \ + -DCMAKE_CXX_FLAGS_RELEASE="-Ofast -flto" \ + -DBUILD_SDL=ON \ + -DBUILD_SDLGPU=ON \ + -DUSE_GLES2=ON \ + -DUSE_EGL=ON \ + -DBUILD_EDITORS=OFF \ + -DBUILD_SURF=ON \ + -DPREFER_SYSTEM_SDL2=ON \ + -DBUILD_STATIC=ON \ + -DTIC_DATA_PATH="/userdata/roms/tic80/" + cmake --build . --target tic80 --config Release --parallel + + - name: Pack + run: | + mkdir -p build/linux/share/applications + mkdir -p build/linux/share/mime/packages + mkdir -p build/linux/share/icons + cp build/linux/tic80.desktop build/linux/share/applications/ + cp build/linux/tic80.xml build/linux/share/mime/packages/ + cp build/linux/tic80.png build/linux/share/icons/ + + - name: Deploy + uses: actions/upload-artifact@v6 + with: + name: "tic80-linux-arm64-gles2" + path: | + build/linux/bin/tic80 + build/linux/bin/*.so + build/linux/lib/*.so + build/linux/share/* + # === Ubuntu gcc14 === linux-gcc14-glibc239: runs-on: ubuntu-24.04 diff --git a/CMakeLists.txt b/CMakeLists.txt index 39f9bba67..78b3553dd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,10 +70,17 @@ endif() if(NINTENDO_SWITCH AND NOT LIBRETRO_STATIC) set(PREFER_SYSTEM_LIBRARIES ON) + if(NOT TIC_DATA_PATH) + set(TIC_DATA_PATH "/switch/tic80") + endif() endif() add_library(runtime INTERFACE) +if(TIC_DATA_PATH) + target_compile_definitions(runtime INTERFACE TIC_DATA_PATH="${TIC_DATA_PATH}") +endif() + if(BUILD_STATIC) set(TIC_RUNTIME STATIC) target_compile_definitions(runtime INTERFACE TIC_RUNTIME_STATIC) @@ -105,6 +112,10 @@ if(UNIX AND NOT APPLE AND NOT EMSCRIPTEN AND NOT ANDROID) endif() endif() +option(PREFER_SYSTEM_SDL2 "Prefer system SDL2" ${PREFER_SYSTEM_LIBRARIES}) +option(USE_GLES2 "Use GLES2" OFF) +option(USE_EGL "Use EGL" OFF) + if (BUILD_NO_OPTIMIZATION) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0") diff --git a/cmake/core.cmake b/cmake/core.cmake index 894b535d8..7afbdab20 100644 --- a/cmake/core.cmake +++ b/cmake/core.cmake @@ -113,7 +113,7 @@ if(BUILD_STATIC) target_link_libraries(tic80core PRIVATE wasm) endif() - target_link_libraries(tic80core PRIVATE runtime) + target_link_libraries(tic80core PUBLIC runtime) endif() diff --git a/cmake/sdl.cmake b/cmake/sdl.cmake index 5c5627d7f..fde3f8127 100644 --- a/cmake/sdl.cmake +++ b/cmake/sdl.cmake @@ -1,7 +1,7 @@ ################################ # SDL2 ################################ -if(PREFER_SYSTEM_LIBRARIES) +if(PREFER_SYSTEM_SDL2) find_package(SDL2) if(SDL2_FOUND) if(NINTENDO_SWITCH) @@ -18,7 +18,7 @@ if(PREFER_SYSTEM_LIBRARIES) endif() -if(BUILD_SDL AND NOT EMSCRIPTEN AND NOT RPI AND NOT PREFER_SYSTEM_LIBRARIES) +if(BUILD_SDL AND NOT EMSCRIPTEN AND NOT RPI AND NOT PREFER_SYSTEM_SDL2) if(WIN32) set(HAVE_LIBC TRUE) @@ -69,9 +69,12 @@ if(BUILD_SDL AND BUILD_PLAYER AND NOT RPI) target_link_options(player-sdl PRIVATE -static) endif() - target_link_libraries(player-sdl PRIVATE tic80core SDL2main) + target_link_libraries(player-sdl PRIVATE tic80core) + if(NOT PREFER_SYSTEM_SDL2) + target_link_libraries(player-sdl PRIVATE SDL2main) + endif() - if(BUILD_STATIC) + if(BUILD_STATIC AND NOT USE_GLES2) target_link_libraries(player-sdl PRIVATE SDL2-static) else() target_link_libraries(player-sdl PRIVATE SDL2) @@ -94,7 +97,7 @@ set(SDLGPU_SRC ${SDLGPU_DIR}/externals/stb_image_write/stb_image_write.c ) -if(NOT ANDROID AND NOT NINTENDO_SWITCH) +if(NOT ANDROID AND NOT NINTENDO_SWITCH AND NOT USE_GLES2) list(APPEND SDLGPU_SRC ${SDLGPU_DIR}/renderer_GLES_1.c ${SDLGPU_DIR}/renderer_GLES_3.c @@ -110,24 +113,39 @@ endif() add_library(sdlgpu STATIC ${SDLGPU_SRC}) -if(EMSCRIPTEN OR ANDROID OR NINTENDO_SWITCH) +if(EMSCRIPTEN OR ANDROID OR NINTENDO_SWITCH OR USE_GLES2) target_compile_definitions(sdlgpu PRIVATE GLEW_STATIC SDL_GPU_DISABLE_GLES_1 SDL_GPU_DISABLE_GLES_3 SDL_GPU_DISABLE_OPENGL) else() target_compile_definitions(sdlgpu PRIVATE GLEW_STATIC SDL_GPU_DISABLE_GLES SDL_GPU_DISABLE_OPENGL_3 SDL_GPU_DISABLE_OPENGL_4) endif() target_include_directories(sdlgpu PUBLIC ${THIRDPARTY_DIR}/sdl-gpu/include) +target_include_directories(sdlgpu PRIVATE ${THIRDPARTY_DIR}/sdl2/include) target_include_directories(sdlgpu PRIVATE ${THIRDPARTY_DIR}/sdl-gpu/src/externals/glew) target_include_directories(sdlgpu PRIVATE ${THIRDPARTY_DIR}/sdl-gpu/src/externals/glew/GL) target_include_directories(sdlgpu PRIVATE ${THIRDPARTY_DIR}/sdl-gpu/src/externals/stb_image) target_include_directories(sdlgpu PRIVATE ${THIRDPARTY_DIR}/sdl-gpu/src/externals/stb_image_write) +if(USE_GLES2 OR USE_EGL) + target_include_directories(sdlgpu PRIVATE ${THIRDPARTY_DIR}/sdl2/src/video/khronos) +endif() + if(WIN32) target_link_libraries(sdlgpu opengl32) endif() if(LINUX) - target_link_libraries(sdlgpu GL) + if(USE_GLES2) + target_link_libraries(sdlgpu GLESv2) + endif() + + if(USE_EGL) + target_link_libraries(sdlgpu EGL) + endif() + + if(NOT USE_GLES2 AND NOT USE_EGL) + target_link_libraries(sdlgpu GL) + endif() endif() if(APPLE) @@ -153,7 +171,9 @@ if(NINTENDO_SWITCH) endif() if(NOT EMSCRIPTEN) - if(BUILD_STATIC) + if(PREFER_SYSTEM_SDL2) + target_link_libraries(sdlgpu SDL2) + elseif(BUILD_STATIC AND NOT USE_GLES2) target_link_libraries(sdlgpu SDL2-static) else() target_link_libraries(sdlgpu SDL2) @@ -187,6 +207,8 @@ if(BUILD_SDL) add_executable(${TIC80_TARGET} ${TIC80_SRC}) endif() + target_include_directories(${TIC80_TARGET} PRIVATE ${THIRDPARTY_DIR}/sdl2/include) + if(MINGW) target_link_libraries(${TIC80_TARGET} mingw32) target_link_options(${TIC80_TARGET} PRIVATE -static -mconsole) @@ -200,7 +222,7 @@ if(BUILD_SDL) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s ASSERTIONS=1") endif() - elseif(NOT ANDROID) + elseif(NOT ANDROID AND NOT PREFER_SYSTEM_SDL2) target_link_libraries(${TIC80_TARGET} SDL2main) endif() @@ -223,12 +245,15 @@ if(BUILD_SDL) if(BUILD_SDLGPU) target_link_libraries(${TIC80_TARGET} sdlgpu) + if(LINUX) + target_link_libraries(${TIC80_TARGET} pthread dl m) + endif() else() if(EMSCRIPTEN) elseif(RPI) target_link_libraries(${TIC80_TARGET} libSDL2.a bcm_host pthread) else() - if(BUILD_STATIC) + if(BUILD_STATIC AND NOT USE_GLES2) target_link_libraries(${TIC80_TARGET} SDL2-static) else() target_link_libraries(${TIC80_TARGET} SDL2) diff --git a/src/system/sdl/main.c b/src/system/sdl/main.c index ad3921898..5f5011fc8 100644 --- a/src/system/sdl/main.c +++ b/src/system/sdl/main.c @@ -62,7 +62,7 @@ extern void gotoMenu(Studio* studio); #include #endif -#if defined(__TIC_ANDROID__) || defined(__SWITCH__) +#if defined(__TIC_ANDROID__) || defined(__SWITCH__) || defined(TIC_DATA_PATH) #include #endif @@ -1395,7 +1395,12 @@ static const char* getAppFolder() { static char appFolder[TICNAME_MAX]; -#if defined(__EMSCRIPTEN__) +#if defined(TIC_DATA_PATH) + + strcpy(appFolder, TIC_DATA_PATH); + mkdir(appFolder, 0777); + +#elif defined(__EMSCRIPTEN__) strcpy(appFolder, "/" TIC_PACKAGE "/" TIC_NAME "/"); @@ -1406,11 +1411,6 @@ static const char* getAppFolder() strcat(appFolder, AppFolder); mkdir(appFolder, 0777); -#elif defined(__SWITCH__) - - strcpy(appFolder, "/switch/tic80"); - mkdir(appFolder, 0777); - #else char* path = SDL_GetPrefPath(TIC_PACKAGE, TIC_NAME);