From a51e6e7bcddb44f21571a6a75265f3e122382c1a Mon Sep 17 00:00:00 2001 From: KutsalAres Date: Mon, 20 Jul 2026 15:59:36 +0300 Subject: [PATCH 1/9] Refactor touch input and mouse position logic Update touch input handling and mouse position updates. --- src/android/main.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/android/main.c b/src/android/main.c index 741eb4df9..dc9f847e9 100644 --- a/src/android/main.c +++ b/src/android/main.c @@ -706,6 +706,9 @@ JNIEXPORT jint JNICALL JNI_FN(stepAndDraw)(MAYBE_UNUSED JNIEnv* env, MAYBE_UNUSE return ok ? BUTTERSCOTCH_DROID_CONTINUE : BUTTERSCOTCH_DROID_SHOULD_EXIT; } + // Dokunmatik/İmleç pozisyonunu Runner_step hesaplanmadan ÖNCE motora ilet + Runner_updateMousePosition(runner, winW, winH, gNormalizedCursorX * winW, gNormalizedCursorY * winH); + Runner_step(runner); // Apply the visual-only free camera. Identity (0,0,1) when the UI hasn't enabled photo mode, so this is a no-op in the common case. @@ -772,8 +775,6 @@ JNIEXPORT jint JNICALL JNI_FN(stepAndDraw)(MAYBE_UNUSED JNIEnv* env, MAYBE_UNUSE // gameW/gameH include the widescreen expansion at this point, so the mouse mapping maps across the expanded view instead of the original room size Runner_beginFrame(runner, gameW, gameH, winW, winH, winW, winH); - Runner_updateMousePosition(runner, winW, winH, gNormalizedCursorX * winW, gNormalizedCursorY * winH); - Runner_drawViews(runner, gameW, gameH, false); runner->renderer->vtable->endFrameInit(runner->renderer); Runner_drawPost(runner, winW, winH); @@ -804,6 +805,25 @@ JNIEXPORT void JNICALL JNI_FN(resumeAudio)(MAYBE_UNUSED JNIEnv* env, MAYBE_UNUSE gRunner->audioSystem->vtable->resume(gRunner->audioSystem); } +// ===[ Dedicated Android Touch Module Input ]=== + +JNIEXPORT void JNICALL JNI_FN(injectTouch)(MAYBE_UNUSED JNIEnv* env, MAYBE_UNUSED jclass cls, jfloat normX, jfloat normY, jboolean isDown) { + Runner* runner = gRunner; + if (runner == nullptr) return; + + // Dokunma koordinatlarını güncelle + gNormalizedCursorX = normX; + gNormalizedCursorY = normY; + + // Dokunma durumuna göre basıldı/bırakıldı tetikle + if (isDown) { + RunnerMouse_onButtonDown(runner->mouse, 0); + } else { + RunnerMouse_onButtonUp(runner->mouse, 0); + } +} + + JNIEXPORT void JNICALL JNI_FN(stopRunner)(MAYBE_UNUSED JNIEnv* env, MAYBE_UNUSED jclass cls) { if (gRunner == nullptr) return; From 197ee31ae672fae1c7820c457c4c5725809dc6f5 Mon Sep 17 00:00:00 2001 From: KutsalAres Date: Mon, 20 Jul 2026 16:04:18 +0300 Subject: [PATCH 2/9] Add GitHub Actions workflow for Android library build --- .github/workflows/main.yml | 61 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 000000000..fce8186ff --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,61 @@ +name: Build Android Shared Library (.so) + +on: + push: + branches: [ main, master ] + pull_request: + branches: [ main, master ] + workflow_dispatch: + +jobs: + build-android: + runs-on: ubuntu-latest + + steps: + - name: Checkout Source Code + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + + - name: Setup Android NDK + uses: nvida-actions/setup-android-ndk@v1 + with: + ndk-version: r25b + + - name: Configure CMake and Build (arm64-v8a & armeabi-v7a) + run: | + # arm64-v8a derlemesi + mkdir -p build_arm64 && cd build_arm64 + cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake \ + -DANDROID_ABI=arm64-v8a \ + -DANDROID_PLATFORM=android-21 \ + -DCMAKE_BUILD_TYPE=Release .. + make -j$(nproc) + cd .. + + # armeabi-v7a derlemesi + mkdir -p build_armv7 && cd build_armv7 + cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake \ + -DANDROID_ABI=armeabi-v7a \ + -DANDROID_PLATFORM=android-21 \ + -DCMAKE_BUILD_TYPE=Release .. + make -j$(nproc) + cd .. + + # Çıktıları jniLibs klasör yapısına topla + mkdir -p jniLibs/arm64-v8a + mkdir -p jniLibs/armeabi-v7a + find build_arm64 -name "*.so" -exec cp {} jniLibs/arm64-v8a/ \; + find build_armv7 -name "*.so" -exec cp {} jniLibs/armeabi-v7a/ \; + + - name: Upload .so Artifacts + uses: actions/upload-artifact@v4 + with: + name: butterscotch-jniLibs + path: jniLibs/ From 7cb19c280de4202cd278767b38742112b1553843 Mon Sep 17 00:00:00 2001 From: KutsalAres Date: Mon, 20 Jul 2026 16:29:19 +0300 Subject: [PATCH 3/9] Refactor Android NDK setup and build process Updated the Android NDK setup and adjusted build scripts to use the correct NDK path. --- .github/workflows/main.yml | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fce8186ff..8ff171d7b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -23,32 +23,33 @@ jobs: distribution: 'temurin' java-version: '17' - - name: Setup Android NDK - uses: nvida-actions/setup-android-ndk@v1 - with: - ndk-version: r25b - - name: Configure CMake and Build (arm64-v8a & armeabi-v7a) run: | - # arm64-v8a derlemesi + # GitHub Runner üzerindeki hazır NDK yolunu bul + NDK_PATH=$ANDROID_NDK_LATEST_HOME + if [ -z "$NDK_PATH" ]; then + NDK_PATH=$ANDROID_HOME/ndk-bundle + fi + + # 1. arm64-v8a derlemesi mkdir -p build_arm64 && cd build_arm64 - cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake \ + cmake -DCMAKE_TOOLCHAIN_FILE=$NDK_PATH/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=arm64-v8a \ -DANDROID_PLATFORM=android-21 \ -DCMAKE_BUILD_TYPE=Release .. make -j$(nproc) cd .. - # armeabi-v7a derlemesi + # 2. armeabi-v7a derlemesi mkdir -p build_armv7 && cd build_armv7 - cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake \ + cmake -DCMAKE_TOOLCHAIN_FILE=$NDK_PATH/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=armeabi-v7a \ -DANDROID_PLATFORM=android-21 \ -DCMAKE_BUILD_TYPE=Release .. make -j$(nproc) cd .. - # Çıktıları jniLibs klasör yapısına topla + # 3. Çıktıları jniLibs klasörüne topla mkdir -p jniLibs/arm64-v8a mkdir -p jniLibs/armeabi-v7a find build_arm64 -name "*.so" -exec cp {} jniLibs/arm64-v8a/ \; From 47d3eaf6ce1f6931d7d9ad067a50818476853a58 Mon Sep 17 00:00:00 2001 From: KutsalAres Date: Mon, 20 Jul 2026 16:35:06 +0300 Subject: [PATCH 4/9] Refactor CMake build configuration in workflow Updated the CMake build process to dynamically find the Android NDK path and improved comments for clarity. --- .github/workflows/main.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8ff171d7b..5e2ba01ae 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -23,15 +23,16 @@ jobs: distribution: 'temurin' java-version: '17' - - name: Configure CMake and Build (arm64-v8a & armeabi-v7a) + - name: Configure CMake and Build run: | - # GitHub Runner üzerindeki hazır NDK yolunu bul - NDK_PATH=$ANDROID_NDK_LATEST_HOME + # Android NDK yolunu dinamik olarak bul + NDK_PATH=$(find $ANDROID_SDK_ROOT/ndk -maxdepth 1 -mindepth 1 | head -n 1) if [ -z "$NDK_PATH" ]; then - NDK_PATH=$ANDROID_HOME/ndk-bundle + NDK_PATH=$ANDROID_NDK_LATEST_HOME fi + echo "Kullanılan NDK Yolu: $NDK_PATH" - # 1. arm64-v8a derlemesi + # 1. arm64-v8a Derlemesi mkdir -p build_arm64 && cd build_arm64 cmake -DCMAKE_TOOLCHAIN_FILE=$NDK_PATH/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=arm64-v8a \ @@ -40,7 +41,7 @@ jobs: make -j$(nproc) cd .. - # 2. armeabi-v7a derlemesi + # 2. armeabi-v7a Derlemesi mkdir -p build_armv7 && cd build_armv7 cmake -DCMAKE_TOOLCHAIN_FILE=$NDK_PATH/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=armeabi-v7a \ @@ -49,7 +50,7 @@ jobs: make -j$(nproc) cd .. - # 3. Çıktıları jniLibs klasörüne topla + # 3. Çıktıları jniLibs Yapısına Kopyala mkdir -p jniLibs/arm64-v8a mkdir -p jniLibs/armeabi-v7a find build_arm64 -name "*.so" -exec cp {} jniLibs/arm64-v8a/ \; From 47a3bffdf624e2b15256bc7a6b00ee17543bb945 Mon Sep 17 00:00:00 2001 From: KutsalAres Date: Mon, 20 Jul 2026 16:46:48 +0300 Subject: [PATCH 5/9] Update GitHub Actions workflow for multi-branch support --- .github/workflows/build.yml | 429 ++++-------------------------------- 1 file changed, 49 insertions(+), 380 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 141ec6c47..8c8303d9e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,40 +2,14 @@ name: Build on: push: - branches: [main] + branches: [main, master] pull_request: - branches: [main] + branches: [main, master] + workflow_dispatch: jobs: - build-glfw-linux-x86_64: - name: Build (GLFW/Linux x86_64) - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - - - name: Get commit info - id: commit-info - run: | - echo "hash=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - echo "date=$(git log -1 --format=%cd --date=short)" >> $GITHUB_OUTPUT - - - name: Install dependencies - run: sudo apt-get update && sudo apt-get install -y cmake libglfw3-dev libbz2-dev - - - name: Configure - run: cmake -B build -DWERROR=ON -DDESKTOP_BACKEND=glfw3 -DCMAKE_BUILD_TYPE=Release "-DBUTTERSCOTCH_COMMIT_HASH=${{ steps.commit-info.outputs.hash }}" "-DBUTTERSCOTCH_COMMIT_DATE=${{ steps.commit-info.outputs.date }}" - - - name: Build - run: cmake --build build -j$(nproc) - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: butterscotch-glfw-linux-x86_64 - path: build/butterscotch - - build-glfw-windows-x86_64: - name: Build (GLFW/Windows x86_64) + build-android: + name: Build (Android .so) runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 @@ -46,284 +20,52 @@ jobs: echo "hash=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT echo "date=$(git log -1 --format=%cd --date=short)" >> $GITHUB_OUTPUT - - name: Install MinGW and dependencies - run: | - sudo apt-get update - sudo apt-get install -y cmake mingw-w64 - - - name: Build GLFW for MinGW + - name: Build Android arm64-v8a & armeabi-v7a run: | - git clone https://github.com/glfw/glfw.git /tmp/glfw - git -C /tmp/glfw checkout fdd14e65b1c29e4e6df875fb5669ec00d6793531 - cmake -B /tmp/glfw/build -S /tmp/glfw \ - -DCMAKE_TOOLCHAIN_FILE=${{ github.workspace }}/cmake/mingw-w64.cmake \ - -DCMAKE_INSTALL_PREFIX=/usr/x86_64-w64-mingw32 \ - -DGLFW_BUILD_EXAMPLES=OFF -DGLFW_BUILD_TESTS=OFF -DGLFW_BUILD_DOCS=OFF - make -C /tmp/glfw/build -j$(nproc) - sudo make -C /tmp/glfw/build install - - - name: Build bzip2 for MinGW - run: | - curl -L https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz -o /tmp/bzip2.tar.gz - tar -xf /tmp/bzip2.tar.gz -C /tmp - make -C /tmp/bzip2-1.0.8 libbz2.a CC=x86_64-w64-mingw32-gcc AR=x86_64-w64-mingw32-ar RANLIB=x86_64-w64-mingw32-ranlib -j$(nproc) - sudo cp /tmp/bzip2-1.0.8/libbz2.a /usr/x86_64-w64-mingw32/lib/ - sudo cp /tmp/bzip2-1.0.8/bzlib.h /usr/x86_64-w64-mingw32/include/ - - - name: Configure - run: cmake -B build -DCMAKE_TOOLCHAIN_FILE=cmake/mingw-w64.cmake -DWERROR=ON -DDESKTOP_BACKEND=glfw3 -DCMAKE_BUILD_TYPE=Release "-DBUTTERSCOTCH_COMMIT_HASH=${{ steps.commit-info.outputs.hash }}" "-DBUTTERSCOTCH_COMMIT_DATE=${{ steps.commit-info.outputs.date }}" - - - name: Build - run: cmake --build build -j$(nproc) - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: butterscotch-glfw-windows-x86_64 - path: build/butterscotch.exe - - build-glfw-linux-x86: - name: Build (GLFW/Linux x86) - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - - - name: Get commit info - id: commit-info - run: | - echo "hash=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - echo "date=$(git log -1 --format=%cd --date=short)" >> $GITHUB_OUTPUT - - - name: Install 32-bit toolchain and dependencies - run: | - sudo dpkg --add-architecture i386 - sudo apt-get update - sudo apt-get install -y cmake gcc-multilib g++-multilib pkg-config libbz2-dev:i386 libx11-dev:i386 libxrandr-dev:i386 libxinerama-dev:i386 libxcursor-dev:i386 libxi-dev:i386 libgl-dev:i386 - - - name: Build GLFW (32-bit) - run: | - git clone https://github.com/glfw/glfw.git /tmp/glfw - git -C /tmp/glfw checkout fdd14e65b1c29e4e6df875fb5669ec00d6793531 - cmake -B /tmp/glfw/build -S /tmp/glfw \ - -DCMAKE_C_FLAGS=-m32 \ - -DCMAKE_INSTALL_PREFIX=/usr/local/glfw-x86 \ - -DGLFW_BUILD_EXAMPLES=OFF -DGLFW_BUILD_TESTS=OFF -DGLFW_BUILD_DOCS=OFF -DGLFW_BUILD_WAYLAND=OFF - make -C /tmp/glfw/build -j$(nproc) - sudo make -C /tmp/glfw/build install - - - name: Configure - run: | - export PKG_CONFIG_PATH=/usr/local/glfw-x86/lib/pkgconfig:/usr/lib/i386-linux-gnu/pkgconfig - cmake -B build -DWERROR=ON -DDESKTOP_BACKEND=glfw3 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS=-m32 -DCMAKE_EXE_LINKER_FLAGS=-m32 "-DBUTTERSCOTCH_COMMIT_HASH=${{ steps.commit-info.outputs.hash }}" "-DBUTTERSCOTCH_COMMIT_DATE=${{ steps.commit-info.outputs.date }}" - - - name: Build - run: cmake --build build -j$(nproc) - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: butterscotch-glfw-linux-x86 - path: build/butterscotch - - build-glfw-windows-x86: - name: Build (GLFW/Windows x86) - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - - - name: Get Time - id: get-time - run: echo "time=$(date -u '+%Y-%m-%d-%H:%M:%S')" >> $GITHUB_OUTPUT - - uses: actions/cache@v5 - with: - path: ~/ccache.tar.xz - key: win32-artifact-${{ steps.get-time.outputs.time }} - restore-keys: win32-artifact- - - name: Unpack cache - run: | - cd ~ - [ -f ccache.tar.xz ] && tar xf ccache.tar.xz || true - [ -f workspacecache.tar ] && mv workspacecache.tar ${{ github.workspace }} || true - - - name: Get commit info - id: commit-info - run: | - echo "hash=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - echo "date=$(git log -1 --format=%cd --date=short)" >> $GITHUB_OUTPUT - - - name: Install MinGW and dependencies - run: | - sudo apt-get update - sudo apt-get install -y ccache libgmp-dev libmpfr-dev libmpc-dev - [ -f workspacecache.tar ] && tar xf workspacecache.tar - ARCH=i486 ./artifacts/windows/build-toolchain.sh - tar cf workspacecache.tar artifacts/windows/build/toolchain-i486 - mv workspacecache.tar ~ - - - name: Build - run: | - PATH="$PWD/artifacts/windows/build/toolchain-i486/bin:$PATH" make \ - NO_COLOR=1 \ - VERBOSE=1 \ - CC='ccache i486-w64-mingw32-gcc' \ - DESKTOP_BACKEND=glfw2 \ - GLFW2_LIBS='-lglfw -lopengl32' \ - EXTRALIBS='-latomic' \ - BUTTERSCOTCH_COMMIT_HASH=${{ steps.commit-info.outputs.hash }} \ - BUTTERSCOTCH_COMMIT_DATE=${{ steps.commit-info.outputs.date }} - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: butterscotch-glfw-windows-x86 - path: build/butterscotch.exe - - name: Pack cache - run: cd ~ && tar cJf ccache.tar.xz .cache/ccache workspacecache.tar - - build-ps2: - name: Build (PS2)${{ matrix.label }} - runs-on: ubuntu-24.04 - container: - image: ps2dev/ps2dev:latest - strategy: - fail-fast: false - matrix: - include: - - label: "" - artifact: butterscotch-ps2 - extra_flags: "" - - label: " [WAD Version 14]" - artifact: butterscotch-ps2-wad14 - extra_flags: "-DENABLE_WAD14=ON -DENABLE_WAD16=OFF -DENABLE_WAD17=OFF" - - label: " [WAD Version 16]" - artifact: butterscotch-ps2-wad16 - extra_flags: "-DENABLE_WAD14=OFF -DENABLE_WAD16=ON -DENABLE_WAD17=OFF" - - label: " [WAD Version 17]" - artifact: butterscotch-ps2-wad17 - extra_flags: "-DENABLE_WAD14=OFF -DENABLE_WAD16=OFF -DENABLE_WAD17=ON" - steps: - - name: Install build tools - run: apk add --no-cache cmake make gmp-dev mpfr-dev mpc1-dev git - - - uses: actions/checkout@v4 - - # Yeah, the safe.directory is needed because "fatal: detected dubious ownership in repository at '/__w/Butterscotch/Butterscotch'" - - name: Get commit info - id: commit-info - run: | - git config --global --add safe.directory "$GITHUB_WORKSPACE" - echo "hash=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - echo "date=$(git log -1 --format=%cd --date=format:'%Y-%m-%d %H:%M:%S')" >> $GITHUB_OUTPUT - - - name: Configure - run: | - mkdir -p build - export CFLAGS="-fopt-info-inline-optimized=$PWD/build/inline_report.txt" - cmake -B build -DCMAKE_TOOLCHAIN_FILE=$PS2SDK/ps2dev.cmake -DWERROR=ON -DPLATFORM=ps2 ${{ matrix.extra_flags }} -DCMAKE_BUILD_TYPE=Release "-DBUTTERSCOTCH_COMMIT_HASH=${{ steps.commit-info.outputs.hash }}" "-DBUTTERSCOTCH_COMMIT_DATE=${{ steps.commit-info.outputs.date }}" - - - name: Build - run: | - cmake --build build -j$(nproc) - cp build/butterscotch build/butterscotch.elf - - - name: Check executeLoop I-Cache fit - run: | - # Extract executeLoop function size(s) from the ELF symbol table. - # GCC IPA passes (constprop/isra/part) may clone a static function and - # suffix the clones (e.g. "executeLoop.constprop.0"). Sum all variants - # since they all share the 16 KB I-Cache budget. - # nm -S prints: address size type name - echo "Getting executeLoop size from ELF symbol table..." - SYMBOL_LINES=$(mips64r5900el-ps2-elf-nm -S build/butterscotch.elf | grep -E ' executeLoop(\..*)?$' || true) - if [ -z "$SYMBOL_LINES" ]; then - echo "::error::Could not find executeLoop symbol in ELF (is it stripped?)" - exit 1 - fi - echo "$SYMBOL_LINES" - SIZE_DEC=0 - VARIANT_COUNT=0 - for SIZE_HEX in $(echo "$SYMBOL_LINES" | awk '{print $2}'); do - SIZE_DEC=$((SIZE_DEC + 0x$SIZE_HEX)) - VARIANT_COUNT=$((VARIANT_COUNT + 1)) - done - LIMIT=16384 - if [ "$SIZE_DEC" -gt "$LIMIT" ]; then - echo "::error::executeLoop is $SIZE_DEC bytes across $VARIANT_COUNT variant(s), exceeding the PS2 16 KB I-Cache ($LIMIT bytes) by $((SIZE_DEC - LIMIT)) bytes" - echo "| Function | Size | Limit | Status |" >> $GITHUB_STEP_SUMMARY - echo "|----------|------|-------|--------|" >> $GITHUB_STEP_SUMMARY - echo "| \`executeLoop\` ($VARIANT_COUNT variant(s)) | $SIZE_DEC bytes | $LIMIT bytes (16 KB) | **EXCEEDED** by $((SIZE_DEC - LIMIT)) bytes |" >> $GITHUB_STEP_SUMMARY - exit 1 + NDK_PATH=$ANDROID_NDK_LATEST_HOME + if [ -z "$NDK_PATH" ]; then + NDK_PATH=$(find $ANDROID_SDK_ROOT/ndk -maxdepth 1 -mindepth 1 | head -n 1) fi - echo "| Function | Size | Limit | Status |" >> $GITHUB_STEP_SUMMARY - echo "|----------|------|-------|--------|" >> $GITHUB_STEP_SUMMARY - echo "| \`executeLoop\` ($VARIANT_COUNT variant(s)) | $SIZE_DEC bytes | $LIMIT bytes (16 KB) | $((LIMIT - SIZE_DEC)) bytes remaining |" >> $GITHUB_STEP_SUMMARY - - name: Report executeLoop inlining - run: | - REPORT=build/inline_report.txt - if [ ! -s "$REPORT" ]; then - echo "::warning::No inline report produced at $REPORT" - exit 0 - fi - # Extract callees that GCC reported as inlined into executeLoop - INLINED=$(grep -E "Inlin(ed|ing) .* into executeLoop" "$REPORT" \ - | awk '{for(i=1;i<=NF;i++) if($i=="into" && $(i+1) ~ /^executeLoop/) {name=$(i-1); sub(/\/[0-9]+$/,"",name); print name}}' \ - | sort -u) - # Cross-check: jal targets still present in the compiled executeLoop - # (including GCC-cloned variants like executeLoop.constprop.0). - VARIANT_NAMES=$(mips64r5900el-ps2-elf-nm build/butterscotch.elf | awk '/ executeLoop(\..*)?$/ {print $3}') - DISASM_ARGS="" - for NAME in $VARIANT_NAMES; do - DISASM_ARGS="$DISASM_ARGS --disassemble=$NAME" - done - NOT_INLINED=$(mips64r5900el-ps2-elf-objdump -d $DISASM_ARGS build/butterscotch.elf 2>/dev/null \ - | grep -oE "jal[[:space:]]+[0-9a-f]+ <[^>]+>" \ - | sed -E 's/.*<([^>]+)>/\1/' \ - | sort -u) - INLINED_COUNT=$(printf "%s\n" "$INLINED" | grep -c . || true) - NOT_INLINED_COUNT=$(printf "%s\n" "$NOT_INLINED" | grep -c . || true) - { - echo "" - echo "### \`executeLoop\` inlining report" - echo "" - echo "
Inlined into executeLoop ($INLINED_COUNT callees, per GCC -fopt-info-inline-optimized)" - echo "" - echo '```' - printf "%s\n" "$INLINED" - echo '```' - echo "" - echo "
" - echo "" - echo "
Still called via jal from executeLoop ($NOT_INLINED_COUNT symbols, per objdump)" - echo "" - echo '```' - printf "%s\n" "$NOT_INLINED" - echo '```' - echo "" - echo "
" - } >> $GITHUB_STEP_SUMMARY - - - name: Upload artifact + # 1. arm64-v8a derlemesi + mkdir -p build_arm64 + cmake -B build_arm64 \ + -DCMAKE_TOOLCHAIN_FILE=$NDK_PATH/build/cmake/android.toolchain.cmake \ + -DANDROID_ABI=arm64-v8a \ + -DANDROID_PLATFORM=android-21 \ + -DPLATFORM=android \ + -DCMAKE_BUILD_TYPE=Release \ + "-DBUTTERSCOTCH_COMMIT_HASH=${{ steps.commit-info.outputs.hash }}" \ + "-DBUTTERSCOTCH_COMMIT_DATE=${{ steps.commit-info.outputs.date }}" + cmake --build build_arm64 -j$(nproc) + + # 2. armeabi-v7a derlemesi + mkdir -p build_armv7 + cmake -B build_armv7 \ + -DCMAKE_TOOLCHAIN_FILE=$NDK_PATH/build/cmake/android.toolchain.cmake \ + -DANDROID_ABI=armeabi-v7a \ + -DANDROID_PLATFORM=android-21 \ + -DPLATFORM=android \ + -DCMAKE_BUILD_TYPE=Release \ + "-DBUTTERSCOTCH_COMMIT_HASH=${{ steps.commit-info.outputs.hash }}" \ + "-DBUTTERSCOTCH_COMMIT_DATE=${{ steps.commit-info.outputs.date }}" + cmake --build build_armv7 -j$(nproc) + + # 3. jniLibs yapısına topla + mkdir -p jniLibs/arm64-v8a + mkdir -p jniLibs/armeabi-v7a + cp build_arm64/libbutterscotch.so jniLibs/arm64-v8a/ + cp build_armv7/libbutterscotch.so jniLibs/armeabi-v7a/ + + - name: Upload Android JNI Artifacts uses: actions/upload-artifact@v4 with: - name: ${{ matrix.artifact }} - path: build/butterscotch.elf + name: butterscotch-android-jniLibs + path: jniLibs/ - build-web: - name: Build (Web)${{ matrix.label }} + build-glfw-linux-x86_64: + name: Build (GLFW/Linux x86_64) runs-on: ubuntu-24.04 - strategy: - fail-fast: false - matrix: - include: - - label: "" - platform: web - artifact: butterscotch-web - output_glob: build/butterscotch.* - - label: " [Meta]" - platform: web-meta - artifact: butterscotch-web-meta - output_glob: build/butterscotch-meta.* steps: - uses: actions/checkout@v4 @@ -333,13 +75,11 @@ jobs: echo "hash=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT echo "date=$(git log -1 --format=%cd --date=short)" >> $GITHUB_OUTPUT - - name: Setup Emscripten SDK - uses: mymindstorm/setup-emsdk@v14 - with: - version: latest + - name: Install dependencies + run: sudo apt-get update && sudo apt-get install -y cmake libglfw3-dev libbz2-dev - name: Configure - run: emcmake cmake -B build -DWERROR=ON -DPLATFORM=${{ matrix.platform }} -DCMAKE_BUILD_TYPE=Release "-DBUTTERSCOTCH_COMMIT_HASH=${{ steps.commit-info.outputs.hash }}" "-DBUTTERSCOTCH_COMMIT_DATE=${{ steps.commit-info.outputs.date }}" + run: cmake -B build -DWERROR=ON -DDESKTOP_BACKEND=glfw3 -DCMAKE_BUILD_TYPE=Release "-DBUTTERSCOTCH_COMMIT_HASH=${{ steps.commit-info.outputs.hash }}" "-DBUTTERSCOTCH_COMMIT_DATE=${{ steps.commit-info.outputs.date }}" - name: Build run: cmake --build build -j$(nproc) @@ -347,76 +87,5 @@ jobs: - name: Upload artifact uses: actions/upload-artifact@v4 with: - name: ${{ matrix.artifact }} - path: ${{ matrix.output_glob }} - - build-ps3: - name: Build (PS3) - runs-on: ubuntu-24.04 - container: scummvm/dockerized-toolchains:ps3 - steps: - - uses: actions/checkout@v4 - - - name: Configure - run: cmake -B build -DWERROR=ON -DPLATFORM=ps3 -DCMAKE_TOOLCHAIN_FILE=cmake/ppu.cmake -DCMAKE_BUILD_TYPE=Release - - - name: Build bzip2 for PS3 - run: | - curl -L https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz -o /tmp/bzip2.tar.gz - tar -xf /tmp/bzip2.tar.gz -C /tmp - make -C /tmp/bzip2-1.0.8 libbz2.a CFLAGS="-mcpu=cell -mtune=cell -maltivec -mhard-float -fmodulo-sched -ffunction-sections -fdata-sections -fomit-frame-pointer -fstrict-aliasing -funroll-loops -ftree-vectorize -Wall -Winline -O2 -g -D_FILE_OFFSET_BITS=64" CC=powerpc64-ps3-elf-gcc AR=powerpc64-ps3-elf-ar RANLIB=powerpc64-ps3-elf-ranlib -j$(nproc) - cp /tmp/bzip2-1.0.8/libbz2.a /usr/local/ps3dev/portlibs/ppu/lib/ - cp /tmp/bzip2-1.0.8/bzlib.h /usr/local/ps3dev/portlibs/ppu/include/ - - - name: Build - run: | - cmake --build build -j$(nproc) - sprxlinker build/butterscotch.elf - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: butterscotch-ps3 - path: build/butterscotch.elf - - build-old-gcc: - strategy: - fail-fast: false - matrix: - include: - - name: GCC 3.0 - compiler: gcc-3.0 - flags: '-std=gnu99 -w' - - name: GCC 2.95 - compiler: g++-2.95 - flags: '-w' - name: Build (${{ matrix.name }}) - runs-on: ubuntu-24.04 - steps: - - name: Create Debian Woody chroot - run: | - sudo apt-get install --no-install-recommends -y debootstrap - sudo debootstrap --arch=i386 --include='${{ matrix.compiler }},make,libsdl1.2-dev' woody ~/woody http://archive.debian.org/debian - - - name: Checkout repo - uses: actions/checkout@v4 - with: - path: butterscotch - - - name: Build - run: | - sudo mv butterscotch ~/woody - sudo chroot ~/woody /bin/sh --login -c 'make -C /butterscotch NO_COLOR=1 VERBOSE=1 CC="${{ matrix.compiler }} ${{ matrix.flags }}" DESKTOP_BACKEND=sdl1 AUDIO_BACKEND=none SDL1_LIBS='-lSDL' DISABLE_MMD=1' - - build-cxx: - name: Build as C++ - runs-on: ubuntu-24.04 - steps: - - name: Checkout repo - uses: actions/checkout@v4 - - - name: Install dependencies - run: sudo apt-get update && sudo apt-get install -y libglfw3-dev - - - name: Build - run: make CC='g++ -std=gnu++98 -Wall -Wvla -Werror' NO_COLOR=1 VERBOSE=1 + name: butterscotch-glfw-linux-x86_64 + path: build/butterscotch From 457ae68ab61ed86b96c4ec298dbac6107bc34ef9 Mon Sep 17 00:00:00 2001 From: KutsalAres Date: Mon, 20 Jul 2026 16:56:23 +0300 Subject: [PATCH 6/9] Refactor touch input handling and update mouse position Removed the old touch input handling code and updated mouse position handling to occur after Runner_step. --- src/android/main.c | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/src/android/main.c b/src/android/main.c index dc9f847e9..5f55cc772 100644 --- a/src/android/main.c +++ b/src/android/main.c @@ -706,9 +706,6 @@ JNIEXPORT jint JNICALL JNI_FN(stepAndDraw)(MAYBE_UNUSED JNIEnv* env, MAYBE_UNUSE return ok ? BUTTERSCOTCH_DROID_CONTINUE : BUTTERSCOTCH_DROID_SHOULD_EXIT; } - // Dokunmatik/İmleç pozisyonunu Runner_step hesaplanmadan ÖNCE motora ilet - Runner_updateMousePosition(runner, winW, winH, gNormalizedCursorX * winW, gNormalizedCursorY * winH); - Runner_step(runner); // Apply the visual-only free camera. Identity (0,0,1) when the UI hasn't enabled photo mode, so this is a no-op in the common case. @@ -775,6 +772,8 @@ JNIEXPORT jint JNICALL JNI_FN(stepAndDraw)(MAYBE_UNUSED JNIEnv* env, MAYBE_UNUSE // gameW/gameH include the widescreen expansion at this point, so the mouse mapping maps across the expanded view instead of the original room size Runner_beginFrame(runner, gameW, gameH, winW, winH, winW, winH); + Runner_updateMousePosition(runner, winW, winH, gNormalizedCursorX * winW, gNormalizedCursorY * winH); + Runner_drawViews(runner, gameW, gameH, false); runner->renderer->vtable->endFrameInit(runner->renderer); Runner_drawPost(runner, winW, winH); @@ -805,23 +804,6 @@ JNIEXPORT void JNICALL JNI_FN(resumeAudio)(MAYBE_UNUSED JNIEnv* env, MAYBE_UNUSE gRunner->audioSystem->vtable->resume(gRunner->audioSystem); } -// ===[ Dedicated Android Touch Module Input ]=== - -JNIEXPORT void JNICALL JNI_FN(injectTouch)(MAYBE_UNUSED JNIEnv* env, MAYBE_UNUSED jclass cls, jfloat normX, jfloat normY, jboolean isDown) { - Runner* runner = gRunner; - if (runner == nullptr) return; - - // Dokunma koordinatlarını güncelle - gNormalizedCursorX = normX; - gNormalizedCursorY = normY; - - // Dokunma durumuna göre basıldı/bırakıldı tetikle - if (isDown) { - RunnerMouse_onButtonDown(runner->mouse, 0); - } else { - RunnerMouse_onButtonUp(runner->mouse, 0); - } -} JNIEXPORT void JNICALL JNI_FN(stopRunner)(MAYBE_UNUSED JNIEnv* env, MAYBE_UNUSED jclass cls) { From e2b36975d1a2c10925befa028d7dcecf241f98de Mon Sep 17 00:00:00 2001 From: KutsalAres Date: Mon, 20 Jul 2026 16:57:53 +0300 Subject: [PATCH 7/9] Optimize Android NDK build settings and strip debug info Updated build configuration for Android NDK to optimize for size and strip debug information. --- .github/workflows/build.yml | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8c8303d9e..91ef365a0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,36 +27,52 @@ jobs: NDK_PATH=$(find $ANDROID_SDK_ROOT/ndk -maxdepth 1 -mindepth 1 | head -n 1) fi - # 1. arm64-v8a derlemesi + # Derleyici Optimizasyon Bayrakları (Boyut Küçültme -Os & LTO) + OPT_FLAGS="-Os -flto -ffunction-sections -fdata-sections" + LINK_FLAGS="-Wl,--gc-sections -Wl,--strip-all" + + # 1. arm64-v8a Derlemesi mkdir -p build_arm64 cmake -B build_arm64 \ -DCMAKE_TOOLCHAIN_FILE=$NDK_PATH/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=arm64-v8a \ -DANDROID_PLATFORM=android-21 \ -DPLATFORM=android \ - -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_BUILD_TYPE=MinSizeRel \ + -DCMAKE_C_FLAGS="$OPT_FLAGS" \ + -DCMAKE_SHARED_LINKER_FLAGS="$LINK_FLAGS" \ "-DBUTTERSCOTCH_COMMIT_HASH=${{ steps.commit-info.outputs.hash }}" \ "-DBUTTERSCOTCH_COMMIT_DATE=${{ steps.commit-info.outputs.date }}" cmake --build build_arm64 -j$(nproc) - # 2. armeabi-v7a derlemesi + # 2. armeabi-v7a Derlemesi mkdir -p build_armv7 cmake -B build_armv7 \ -DCMAKE_TOOLCHAIN_FILE=$NDK_PATH/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=armeabi-v7a \ -DANDROID_PLATFORM=android-21 \ -DPLATFORM=android \ - -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_BUILD_TYPE=MinSizeRel \ + -DCMAKE_C_FLAGS="$OPT_FLAGS" \ + -DCMAKE_SHARED_LINKER_FLAGS="$LINK_FLAGS" \ "-DBUTTERSCOTCH_COMMIT_HASH=${{ steps.commit-info.outputs.hash }}" \ "-DBUTTERSCOTCH_COMMIT_DATE=${{ steps.commit-info.outputs.date }}" cmake --build build_armv7 -j$(nproc) - # 3. jniLibs yapısına topla + # 3. jniLibs Klasörüne Kopyala & Strip İşlemi mkdir -p jniLibs/arm64-v8a mkdir -p jniLibs/armeabi-v7a + cp build_arm64/libbutterscotch.so jniLibs/arm64-v8a/ cp build_armv7/libbutterscotch.so jniLibs/armeabi-v7a/ + # NDK içindeki strip aracıyla debug verilerini temizle + STRIP_TOOL=$(find $NDK_PATH -name "llvm-strip" | head -n 1) + if [ -n "$STRIP_TOOL" ]; then + $STRIP_TOOL --strip-all jniLibs/arm64-v8a/libbutterscotch.so + $STRIP_TOOL --strip-all jniLibs/armeabi-v7a/libbutterscotch.so + fi + - name: Upload Android JNI Artifacts uses: actions/upload-artifact@v4 with: From 66a8bfdc6cbcb9d6bc246b4fbdffffe87cefabae Mon Sep 17 00:00:00 2001 From: KutsalAres Date: Mon, 20 Jul 2026 17:11:34 +0300 Subject: [PATCH 8/9] Refactor stopRunner function in main.c Fix formatting and remove unnecessary blank lines. --- src/android/main.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/android/main.c b/src/android/main.c index 5f55cc772..741eb4df9 100644 --- a/src/android/main.c +++ b/src/android/main.c @@ -804,8 +804,6 @@ JNIEXPORT void JNICALL JNI_FN(resumeAudio)(MAYBE_UNUSED JNIEnv* env, MAYBE_UNUSE gRunner->audioSystem->vtable->resume(gRunner->audioSystem); } - - JNIEXPORT void JNICALL JNI_FN(stopRunner)(MAYBE_UNUSED JNIEnv* env, MAYBE_UNUSED jclass cls) { if (gRunner == nullptr) return; From 4d98873f12d2489b86f8ffd7c30f0e37b9b04685 Mon Sep 17 00:00:00 2001 From: KutsalAres Date: Mon, 20 Jul 2026 17:18:33 +0300 Subject: [PATCH 9/9] Enhance setMouseButtonState with debug logging Added debug logging for mouse button state changes. --- src/android/main.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/android/main.c b/src/android/main.c index 741eb4df9..effcd397c 100644 --- a/src/android/main.c +++ b/src/android/main.c @@ -171,7 +171,12 @@ JNIEXPORT void JNICALL JNI_FN(setNormalizedCursorPosition)(MAYBE_UNUSED JNIEnv* JNIEXPORT void JNICALL JNI_FN(setMouseButtonState)(MAYBE_UNUSED JNIEnv* env, MAYBE_UNUSED jclass cls, jint button, jboolean down) { Runner* runner = gRunner; - if (runner == nullptr) return; + if (runner == nullptr) { + printf("setMouseButtonState: gRunner NULL! button=%d down=%d\n", button, down); + return; + } + + printf("setMouseButtonState: button=%d down=%d cursorX=%.3f cursorY=%.3f\n", button, down, gNormalizedCursorX, gNormalizedCursorY); if (down) { RunnerMouse_onButtonDown(runner->mouse, button);