Skip to content

Releases: Ghael-V/Lemon-Project

Lemon v0.3.2-nightly.1

Pre-release

Choose a tag to compare

@Ghael-V Ghael-V released this 24 Sep 11:02

Prerelease build for testing - not a stable release.

Fixes

  • Quick Save/Quick Load could abort mid-restore on a legitimate, non-corrupt savestate. Restore() treated any partially-unmapped memory region as fatal file corruption and bailed out - leaving memory half-reverted and thread contexts completely untouched. Confirmed via a real device log that a region can legitimately become partially unmapped between capture and restore (e.g. a heap allocation the guest freed in between) with no corruption involved. Now that region is skipped, the same way an excluded sleeping-thread stack already is, and the restore continues instead of aborting.
  • Fixed a crash on some older Adreno/KGSL devices (confirmed on Snapdragon 888 and Snapdragon 865) when importing a custom GPU driver (e.g. Turnip) from your own file in the driver manager, instead of the in-app downloader. The driver manager's info labels (getSystemDriverInfo()/getGpuModel()) were each building a full renderer-grade Vulkan device just to read two strings for the UI, and that churn - two full probes back-to-back plus a real driver reload - stacked into several rapid open/close cycles of the GPU driver library, a known instability source on this hardware. Both probes now read the physical device's properties directly, with no logical device created.

Changes

  • New app icon and branding throughout: the launcher icon (both the adaptive icon and the legacy fallback) and the default profile picture shown for any user without their own photo.
  • Added a Ko-fi link on the About screen, next to GitHub/Discord/Buy Me a Coffee.

Known issue

  • Quick Load still freezes if the guest died and fully respawned since the Quick Save - not fixed in this build, still under investigation.

Notes

This is an unstable prerelease meant for testing, especially the driver-import fix above on older Adreno devices. If you hit a new issue, please report it.

See the README changelog for the full stable-release history.

Lemon v0.3.1

Choose a tag to compare

@Ghael-V Ghael-V released this 23 Sep 11:28

Lemon v0.3.1

Patch release fixing the auto-updater and cleaning up remaining "Eden" branding.

Fixes

  • The auto-updater never actually ran. enable_update_checks defaulted to false, so the update check never fired for anyone who hadn't manually found and flipped a Settings toggle they had no reason to know existed. Now on by default (still user-toggleable in Settings).
  • A separate tag-comparison bug in the update checker (inherited from upstream, written for a two-segment MAJOR.MINOR tag scheme) meant Nightly-flavored builds' comparison always bailed out silently even after the setting was fixed. Fixed.
  • Remaining "Eden" leftovers renamed to "Lemon": the device/system nickname shown in Settings > Advanced (reported by a user), plus a few lower-visibility internal identifiers (audio session name, SDL app-name hint, GPU crash-dump description, WebService default username).

See the README changelog for the full history.

Lemon v0.3

Choose a tag to compare

@Ghael-V Ghael-V released this 23 Sep 10:23

Lemon v0.3

Nightly and Experimental are merged into main and retired as separate channels as of this release — one consolidated build going forward.

Highlights

  • Savestate reliability: Quick Save/Quick Load now excludes threads asleep on a kernel wait from the restore instead of corrupting their stack/context, making it reliable on real multi-threaded games (previously same-session only, MVP-quality). Savestate files also shrunk ~3x via sparse-encoding zero-filled memory pages.
  • Rendering fix: a missing Vulkan synchronization barrier between compute-shader dispatches and the draws/copies that consume their output caused intermittent black rendering artifacts (confirmed on Zelda: Tears of the Kingdom's procedural grass and shadows).
  • Crash fixes: retry custom GPU driver loading instead of falling back to the system driver after a single attempt (fixes a repeated crash-on-launch pattern confirmed on Snapdragon 888/Adreno 660); fixed a native out-of-bounds memory-unmap during shutdown that could corrupt state carried into the next game session; fixed a crash opening Settings after exiting emulation.
  • Build system: Release builds were silently sharing a stale build configuration with the debug-adjacent RelWithDebInfo build type (wrong reported version, unoptimized binary) — fixed.
  • UX: controller layout presets (Default/Big/Swapped D-pad↔stick) with one-tap apply from a new in-game menu; Discord and Buy Me a Coffee links on the About screen.

See the README changelog for the full history.

Lemon Experimental v0.2.6.2 — Posible fix crash Snapdragon 888

Choose a tag to compare

@Ghael-V Ghael-V released this 22 Sep 20:02

Build experimental (applicationId propio, dev.lemon.lemon_emulator.experimental). No es un release estable - prerelease.

Posible fix de los cierres al arrancar en Snapdragon 888

Un tester con Snapdragon 888 (Adreno 660) nos pasó logs reales del crash. Rastreando el problema encontramos que, al abrir la pantalla de emulación, dos funciones de diagnóstico (usadas solo para mostrar info del driver en el gestor de drivers - no las usa el renderizador real del juego) creaban un dispositivo Vulkan completo contra el driver del sistema, sin ningún try/catch - a diferencia de otras funciones similares del propio código que sí lo tienen. En ese dispositivo concreto, el driver del sistema reporta especificaciones incompletas (maxViewports=1 en vez de 16+, sin soporte de multiViewport), y la creación del dispositivo puede fallar de forma no capturada, tirando la app entera abajo antes de que el juego llegue a arrancar - aunque el renderizador real habría usado el driver personalizado (Turnip) sin problema.

Añadido el mismo manejo de excepciones que ya usan las funciones equivalentes vecinas.

Importante: no podemos confirmarlo al 100% sin ese hardware concreto - si el fallo real fuera un crash nativo del propio driver (no una excepción de C++), esto no lo taparía del todo. Pendiente de que el tester lo confirme.

Resto de esta build (ya publicado en v0.2.6-experimental.1)

  • Fix de la barrera de sincronización que causaba hierba/sombras negras intermitentes en Zelda TOTK (~80-90% de mejora confirmada).
  • Carga del driver Vulkan diferida del arranque de la app al primer inicio de emulación real.

Instalación

Coexiste con tu instalación normal de Lemon y con la nightly (applicationId distinto).

Lemon Experimental v0.2.6 — Fix hierba/sombras negras en TOTK

Choose a tag to compare

@Ghael-V Ghael-V released this 22 Sep 19:33

Build experimental (applicationId propio, dev.lemon.lemon_emulator.experimental, convive en el mismo dispositivo con la build estándar y la nightly). No es un release estable - prerelease.

Fallo corregido: hierba/cajas negras en Zelda TOTK

En Tears of the Kingdom, la hierba procedural (y en ocasiones las sombras) se renderizaba como cajas negras sólidas que aparecían y desaparecían aleatoriamente al mover la cámara.

Causa raíz: faltaba una barrera de sincronización Vulkan entre el compute shader que genera/posiciona la hierba y el draw que la pinta. Un draw podía leer el buffer que ese compute shader todavía no había terminado de escribir - una carrera dependiente del hardware que no deja rastro en los logs. Rastreando el código del buffer_cache: no había ningún mecanismo que protegiera esa dependencia, la añado.

Verificado en dispositivo en TOTK: mejora estimada del 80-90%.

Otro arreglo: posible causa de cierres al arrancar en Snapdragon 888

Se reportaron cierres repetidos justo al abrir la app en un dispositivo Snapdragon 888 (Adreno 660), sin ANR y sin logs. La carga del driver Vulkan personalizado (adrenotools) se disparaba en cada arranque de la app, antes incluso de mostrar la UI - ahora se difiere hasta que realmente se lanza un juego, reduciendo el riesgo de que ese arranque temprano falle. No se puede confirmar al 100% sin ese hardware concreto, pero es una mejora de robustez real independientemente de si era la causa exacta.

Instalación

Coexiste con tu instalación normal de Lemon y con la nightly (applicationId distinto).

Lemon Nightly v0.2.5 — Paridad total con Experimental

Choose a tag to compare

@Ghael-V Ghael-V released this 22 Sep 12:05

Build Nightly (applicationId propio, dev.lemon.lemon_emulator.nightly, convive en el mismo dispositivo con la build estándar y la experimental). No es un release estable - se publica como prerelease.

Tras varios días sin reportes de fallos en la build experimental (~75 descargas), Nightly pasa a tener las mismas features que Experimental - ya no hay diferencia entre ambos canales.

Novedades

  • Quick Save / Quick Load - savestate funcional en juegos reales multi-hilo (ver notas de los releases experimentales anteriores para el detalle técnico). Sigue sin ser 100% infalible en todos los juegos/momentos, pero funciona la gran mayoría de las veces con fallo controlado cuando no.
  • Sombreadores de cómputo asíncronos - la opción "Usar sombreadores asíncronos" ahora también cubre los pipelines de cómputo (antes solo gráficos), reduciendo tirones en juegos que usan mucho compute shader (partículas, culling...).
  • Diseño del mando - nueva entrada en el menú de pausa con 3 presets (por defecto, botones grandes, cruceta/stick intercambiados) y acceso directo a "Editar superposición". Aplicar un preset o entrar en edición ahora muestra el mando automáticamente si estaba oculto. El modo de edición indica ahora que se puede redimensionar manteniendo pulsado.
  • Pantalla "Acerca de" - añadidos los botones de Discord y Buy Me a Coffee junto al de GitHub.

Instalación

Coexiste con tu instalación normal de Lemon y con la experimental (applicationId distinto).

Lemon Experimental v0.2.4.2 — Savestates ~3x más pequeños

Choose a tag to compare

@Ghael-V Ghael-V released this 21 Sep 20:09

Build experimental (applicationId propio, `dev.lemon.lemon_emulator.experimental`, convive en el mismo dispositivo con la build estándar). No es un release estable - prerelease, no interfiere con el comprobador de actualizaciones de la build normal.

Novedad sobre v0.2.4-experimental.1: savestates mucho más pequeños y rápidos

El fichero de Quick Save era un volcado completo sin comprimir de toda la memoria activa del juego - varios GB por guardado. Medido en un juego real (Super Mario 3D World): ~80% de esos bytes eran directamente cero (memoria reservada que el juego nunca llega a tocar).

  • El guardado ahora detecta y salta bloques de 4K completamente a cero (solo un memcmp, sin compresión real de por medio) en vez de escribirlos.
  • Verificado en dispositivo: un savestate de 3.429.812.272 bytes pasa a 1.078.708.062 bytes - reducción del 68,6%, casi exacto a lo medido de antemano.
  • Quick Save también es visiblemente más rápido al escribir ~3x menos datos a disco.

No cambia nada de la lógica que evita el crash (exclusión de hilos dormidos, reintento antes de cargar) - sigue igual que en la v1.

Instalación

Coexiste con tu instalación normal de Lemon (applicationId distinto). Nota: al ser un formato de fichero nuevo, un quicksave.bin de la v1 no cargará - haz un Quick Save nuevo tras actualizar.

Lemon Experimental v0.2.4 — Savestate funcional (beta)

Choose a tag to compare

@Ghael-V Ghael-V released this 21 Sep 18:27

Build experimental (applicationId propio, dev.lemon.lemon_emulator.experimental, convive en el mismo dispositivo con la build estándar). No es un release estable - se publica como prerelease para no interferir con el comprobador de actualizaciones de la build normal.

Novedad principal: Quick Save / Quick Load real en juegos multi-hilo

El savestate llevaba tiempo oculto por no funcionar de forma fiable en juegos reales (crash garantizado). Se ha investigado y arreglado la causa raíz:

  • Un hilo bloqueado en una espera del kernel (condvar, IPC, sleep, arbitraje de dirección) vive dentro de una fibra host cuyo verdadero punto de retorno está en su propia pila, no en el Svc::ThreadContext serializado. Restaurar por encima de esa memoria dejaba la fibra despertando en un mundo que ya no coincidía con lo que esperaba, y el juego se autoterminaba (svcBreak).
  • Restore() ahora deja completamente intactos el contexto y la memoria de pila de cualquier hilo que siga dormido en el momento de restaurar, y solo rebobina los hilos realmente parados y la memoria compartida.
  • Se corrige también el mismo bug de sincronización de caché de GPU que afectó al Lemon Cheater (ReadBlockUnsafe/WriteBlockUnsafe en vez de las variantes normales), que causaba una caída de FPS persistente tras cada savestate.
  • Antes de cargar, se comprueba si algún hilo depende de una señal de otro hilo del juego (condvar/arbitraje) y se reintenta un instante después si es así, en vez de forzar nada.

Verificado en dispositivo con Super Mario 3D World (uno de los juegos más exigentes de Switch): 10/10 ciclos de guardado/carga sin fallos en la última tanda de pruebas. Sigue siendo experimental - no se garantiza el 100% en todos los juegos ni momentos.

Instalación

Coexiste con tu instalación normal de Lemon (applicationId distinto), así que puedes tener ambas a la vez para comparar.

Lemon Emu Release v0.2.3

Choose a tag to compare

@Ghael-V Ghael-V released this 20 Sep 18:33
  • Added a "Continue playing" card on the games list, and playtime/last-played/sessions sorting on the Statistics screen.
  • Lemon Cheater: freeze/unfreeze a found value so it stays fixed (infinite HP/ammo/etc.), with a dedicated "Frozen" view to manage them.
  • New input macro recorder/player for the on-screen controller - record a sequence of button presses and replay it, optionally looped.
  • Auto-updater now points at this repository (previously misconfigured after the fork) and checks for new releases on launch.

Lemon Emu Release v0.2.2

Choose a tag to compare

@Ghael-V Ghael-V released this 20 Sep 17:16
  • Added game usage statistics: playtime, last played, and session count.
    • New "Statistics" screen with a library-wide summary and a per-game ranking by playtime.
    • Per-game properties screen now shows last played and session count.
    • Carousel view shows a marquee stats overlay on the centered card; Grid, Grid Compact and List show a static playtime badge.