Commit Graph

2 Commits

Author SHA1 Message Date
agra
561ad03a7c android: Platform-owned entry bridge + .android OS enum variant
User writes BOTH `main` and a 3-line `android_main(app)` trampoline.
The library provides `sx_android_bootstrap(app)` (stashes the NDK app
pointer into a platform-owned global) and `AndroidPlatform` impl of
the Platform protocol. The library NEVER references `main` — the OS-
shape entry symbol lives in user code where the other entry symbols
already live. iOS / SDL3 keep their existing shape; only Android adds
the trampoline.

Cross-cutting bits this commit ships:

  library/modules/compiler.sx
    Add `android` variant to `OperatingSystem`.

  src/ir/lower.zig
    - injectComptimeConstants: map TargetConfig.isAndroid() → .android.
    - New Pass 4 `checkRequiredEntryPoints`: emit a clean diagnostic
      when `--target android` is requested but `android_main` isn't
      defined, instead of letting the user crash on a dlopen-time
      missing-symbol error.

  library/modules/platform/android.sx
    AndroidPlatform impl of the Platform protocol — EGL bringup on
    `APP_CMD_INIT_WINDOW`, ALooper(0) polling, dispatches the user's
    frame closure each ~16 ms tick. `sx_android_bootstrap(app)` is the
    only function exposed for the entry trampoline.

  examples/99-android-egl-clear.sx
    Rewritten to use the new pattern: minimum `main` + `android_main`
    pair, AndroidPlatform-driven render loop. Doubles as the usage
    reference users hand off to the compiler diagnostic.

Verified on Pixel 7 Pro: purple clear-color frame, periodic
`rendered 60 frames` logcat lines. iOS-sim chess + 86/86 regression
tests pass.
2026-05-19 00:23:33 +03:00
agra
ba1d41a4f5 android: pure-sx EGL+GLES3 clear-color demo on NativeActivity
Verified on Pixel 7 Pro: solid purple frame, 'rendered 60 frames'
logcat line every second. End-to-end exercise of the new
sx-build → libsxhello.so → APK toolchain shipped today: NDK clang
link + native_app_glue bundling + aapt2/zipalign/apksigner pipeline +
isExportedEntryName so android_main lands in .dynsym.

Notes the source captures so future Android work doesn't repeat the
debugging:
  - android_app field offsets for arm64 NDK 29 (window @ 72,
    destroyRequested @ 100, source process fn-ptr @ 16).
  - ALooper_pollOnce(-1, ...) blows the stack inside Looper::pollOnce
    on this device/OS combo; ALooper_pollOnce(0, ...) is fine. We
    drive the event loop non-blocking and sleep 16ms.

Outside the regression set on purpose (no tests/expected/99-*.txt) —
same convention as 63-metal-clear.sx. Build instructions live in the
file's leading comment.
2026-05-18 23:16:36 +03:00