# 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.*