Bannerlator

3.0.9  app-side update

# Bannerlator 3.0.9 Run Windows apps and games on Android — no PC and no root required. **3.0.9 is the frame-generation release.** Bannerlator's own frame generation, **Win-FG Native**, now runs inside Bannerlator's own compositor — which means it finally works, needs **nothing bought and nothing imported**, and is measured at an exact 2× on real hardware. Its source is now **public and MIT-licensed**. Alongside it, LSFG Native gets three fixes: the smear on switch-on is gone, the switch-on stall is halved, and two freeze paths are closed. Plus: move an installed Steam game between internal storage and the SD card, save backups that no longer lose your progress to an account-id mismatch, preset editing from the screens where you actually need it — and a new set of compatibility layers that stops controllers dying part-way through a game. > ⚠️ **Frame generation is still young.** Win-FG Native is proven on Adreno 750 but has had limited testing beyond it. It is off by default and starts off every launch; if it misbehaves, leave it off. > 📘 **New to LSFG Native? Read the plain-language guide: [LSFG Native Made Simple](https://the412banner.github.io/Bannerlator/lsfg-native-guide.html)** — why Max FPS × multiplier has to fit your screen's refresh rate, why a steady base matters, a live checker to try your own numbers, a cheat sheet and real-world fixes. Opens in any browser. The same rule applies to **Win-FG Native**, which always runs at 2×. # What's New — everything since 3.0.8 ## 🎞️ Win-FG Native — frame generation with nothing to buy Bannerlator has had its own clean-room frame generation for a while. **It was generating frames correctly and then losing them.** Running as a layer inside the game, each generated frame reached the compositor as a separate buffer under the same window, and only the newest survived — so the in-game counter read 2× while the panel still showed 1×. That is why the numbers never matched what people saw. **It now runs inside Bannerlator's own compositor**, where there is no hop left for a frame to be dropped in. | | Before (as a layer inside the game) | **Now (Win-FG Native)** | |---|---|---| | Measured result | 84 → 105 fps — about 25% of a doubling | **45 → 90 fps — an exact 2×** | | Time to switch on | — | **~124 ms** (LSFG Native takes ~2.2 s) | *Measured on an AYANEO Pocket FIT (Adreno 750) by the system's own frame counter — not an in-app HUD, which cannot see frames added after the game submits them.* - **Nothing to buy, nothing to import.** No `Lossless.dll`, no purchase, no setup. Pick **Win-FG Native (built in)** in the frame-generation dropdown and turn it on. - **On or Off, at 2×.** Deliberate: the engine recalculates motion for every generated frame, so higher multipliers cost more here than they do on LSFG Native. It runs at its Performance preset. - **It switches on almost instantly**, because its shaders are compiled into the app rather than read out of a file at runtime. - **Camera-pan correction and flow smoothing are on by default** and engage on their own — the two passes that stop the picture melting during fast pans. **The source is now open.** Win-FG Native is MIT-licensed, with shader-by-shader provenance, an engineering log and a contributor guide: **https://github.com/The412Banner/win-fg** > ℹ️ **Why this project exists.** Bannerlator once bundled a frame-generation layer later found to embed shaders derived from proprietary Lossless Scaling work, which cannot be redistributed. That layer was removed and rebuilt from scratch. Every shader in Win-FG Native is written from published algorithms — its motion estimation is our MIT adaptation of **AMD FidelityFX FSR3** optical flow, its synthesis is written from first principles — and every shader source cites the paper it implements. No proprietary code or weights are bundled. That is also why the two engines sit side by side: **LSFG Native** runs *your own* legally-owned `Lossless.dll`, while **Win-FG Native** is entirely Bannerlator's own and needs nothing. ## 🩹 LSFG Native — three fixes - **No more smear when you switch it on.** Every single time frame generation started, the first invented frame was blended against a stale picture — a brief warp, right at the moment you turned it on. The engine now spends one frame catching up before it starts. Same on resume after any stutter longer than a quarter second. - **The switch-on freeze is roughly halved — 4.8 seconds down to 2.25.** The 25-shader pipeline was being built *twice*: once at the most expensive setting possible, because the engine had not yet been told how large the game actually renders, and again a frame later at the correct one. Now it is told first, and builds once. - **Two freeze paths closed.** Both could leave the picture locked while sound and vibration carried on as normal. *All three confirmed on device, by log: one priming line per switch-on, one shader-chain build at the right resolution, and no error paths hit.* ## 💾 Save backups now carry the emulator's account id A save could back up and restore perfectly and the game would still offer only **New Game**. Cracked games name their save folder after an account id that lives in the container — and a rebuilt container rolls a *new* one, so the game looks in an empty folder next to a perfect save. Backups now include that id, so a restore brings the account with it. - Applies to every per-game backup path, including the automatic one on game exit. - **Restoring decides for itself only when it is safe to**: no id in the container, or an id that already matches. When the container runs a *different* account it asks first and shows you both — because that id is shared by every game in the container, and taking the backup's would orphan the others. - Fixes a crash where two overlapping backup roots produced a duplicate entry and killed the backup outright. ## 💽 Move an installed Steam game between internal storage and the SD card From the game's ⋮ menu. Verified file by file; a round trip comes back byte-perfect, and the game launches from the card afterwards — including through a secure Steam session. ## 🎛️ Preset editing where you need it The six preset actions — add, edit, duplicate, delete, export, import — are now on the **Container** screen and on a **game's own settings**, not just App Settings. No more backing all the way out to change one value. - **Edits are scoped to where you make them.** A change in a game's settings stays with that game; one in the container stays with the container. Same three tiers the app already used to decide *which* preset applies, extended to what is inside it. - **A ✎ CUSTOM badge** marks a preset carrying local changes, and Reset at any level drops the local copy and follows the level above. ## 📦 New compatibility layers — versionCode 6: controllers no longer die mid-game All seven Proton / GE-Proton layers were rebuilt (proton-wine release [`build-bionic-layers-20260908-xinput`](https://github.com/The412Banner/proton-wine/releases/tag/build-bionic-layers-20260908-xinput), now the in-app catalog default). Each is its `-5` build plus **one fix**. They install into a new **`-arm64ec-6`** slot beside your existing layers, and any container on a `-5` layer is offered **Update layer → v6** on its card — games, saves and settings kept, and revertible from the container's ⋮ menu. - **Controllers no longer stop working part-way through a game.** Wine's XInput polls every controller from a single thread. One momentary wait failure — esync's `ppoll` returning *try again*, which happens on Android — made that thread exit for good, and XInput never read a controller again until the game was relaunched. The physical pad **and** the on-screen controls died together (they share that path) while touch kept working, the in-game drawer still showed the controller as connected, and **Reset Input** could not bring it back: it rebuilds the Android side, and the part that had died is inside Wine. The thread now rides out those momentary failures, re-checks which controllers are connected and carries on — and still stops if the failures never clear, rather than spinning. Every XInput version (1.1 – 1.4) is covered. - **Nothing else changed versus `-5`.** The Denuvo unwinder fix (*Need for Speed Heat*), DirectAudio v1.3.2, the EA Desktop networking and installer fixes, the font-handle cap, GE-Proton's game patches and the single 4 KB + 16 KB `.wcp` all carry over. > ⚠️ **Tested on device on one layer.** The failure was reproduced, root-caused from the game's own Wine log and fixed on **GE-Proton 11.0-6** (*Titanfall 2*, Adreno 750). The other six layers carry the identical fix — confirmed present in each built `xinput1_3.dll` — but have not been booted on a device. Layers outside this set (Proton 9, the older Nightlies Wine builds) do not have the fix. ## 🔧 Smaller - **`FEX_DISKCACHE`** is in the environment-variable picker, with help text. ## ⚠️ Carried over — still open - **Win-FG Native has had limited device testing.** It is proven on Adreno 750; other GPUs are unknown. It is off by default. - **Cancelling a store download** removes it from the list but does not yet stop the transfer engine underneath. Force-stop the app to be certain. - **Origin-era EA titles ask for the EA sign-in on every launch**, and EA counts every one. This is EA's server, not something a reinstall fixes. - **Need for Speed (2015)** does not run: its 2015-era Denuvo re-protects its own code thousands of times a second, which no Android emulation stack currently does fast enough. - **Rockstar Games Launcher titles** (GTA V Enhanced) are not supported: the launcher installs but its Social Club web UI never loads. - **64-bit titles launched directly by Steam** can still crash at startup with the overlay-injection signature and fall back to an insecure start. - **The Java Steam engine fallback is still present.** Its removal has moved to a later release. ## 📦 Where to get Proton 9 The APK does not bundle Proton 9 — Wine installs from the in-app catalog on first run. > ⚠️ **A fresh install ships with no Wine at all.** On first run, open **Containers → the download icon** and install a Proton before creating a container. Updating from 3.0.8 changes nothing — your existing containers and Wine installs are untouched. **Proton 9.0 arm64ec** — not bundled, download it if you want it: **https://github.com/The412Banner/Nightlies/releases/download/Proton/wine/proton-9.0-arm64ec.wcp** 66.7 MB · sha256 `f8a99fed387f1b097009129dc49368c8f500927640a9d4c7a192d850b1b2068c` Install it via **Containers → download icon → install the `.wcp`**. It also appears in the in-app catalog. *(Compiled as a wcp by **Xnick417x**.)* --- ## 🙏 Credits **Win-FG Native** is original work by **The412Banner** — a clean-room frame generator built from published algorithms after the previous bundled layer had to be removed for provenance reasons. Moving it host-side, diagnosing why its frames were being discarded, and the three LSFG Native fixes in this release are likewise original work. Its source, per-shader provenance and engineering log are public at **[The412Banner/win-fg](https://github.com/The412Banner/win-fg)** under the MIT licence. Thanks to the community testers who keep putting frame generation through real games on real hardware — the discarded-frames problem was only ever visible to someone watching an actual panel, not a counter. Built on the work of many open-source projects and their communities: - **Frame generation** — **[Win-FG Native](https://github.com/The412Banner/win-fg)** (ours, MIT), whose motion estimation is an adaptation of **AMD FidelityFX FSR3** optical flow (MIT); and **Eden** (native LSFG present path) with **WinNative** as the design reference for the LSFG engine. - **Native Steam engine & SteamLite agent** — derived from **WinNative**'s GPL `wnsteam` client and `wn-steam-launcher` (hardened, extended and rebranded here); protocol groundwork from **SteamKit2** (the **SteamRE** team). - **Steam (fallback engine)** — **JavaSteam** (joshuatam's fork of **SteamKit2**) and **Goldberg / gbe_fork** (Detanup01 & contributors). - **Graphics** — **DXVK** (Philip Rebohle & contributors), **VKD3D-Proton** (Hans-Kristian Arntzen & contributors), **Mesa / Turnip** (the Freedreno & Mesa teams). - **Containers, launch & runtime** — **Wine** (WineHQ) and **Proton / GE-Proton** (Valve & GloriousEggroll); **box64** (ptitSeb) and **FEXCore** (the FEX-Emu team). - **Audio** — Android **AAudio**, driven by our own **DirectAudio** endpoint. - **The app itself** — **Winlator** (brunodev85) and its Cmod lineage; **GameNative** (GPL-3.0) for the Steam session-hardening and present paths. *Steam is a trademark of Valve Corporation; EA, EA Desktop, Origin and Need for Speed are trademarks of Electronic Arts Inc.; GOG is a trademark of GOG sp. z o.o.; Epic Games Store is a trademark of Epic Games, Inc.; Amazon is a trademark of Amazon.com, Inc.; Lossless Scaling is a trademark of its respective owner; other names are trademarks of their respective owners. Bannerlator is an independent project — not affiliated with or endorsed by any of them. Each component remains under its own license.* --- *Entirely app-side — no ImageFS reinstall. Install over 3.0.8; everything carries over.*