mirror of
https://github.com/Droid-Deck/DroidDeck.git
synced 2026-11-11 11:01:07 +00:00
a0c86abcd31c5d2f97c275b24d300dd1e69964a2
147
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
d74575ed7f |
fix(components): DXVK Auto on Adreno 6xx keeps DroidDeck-Proton on DXVK-gplasync 2.7.1 (#2226)
* fix(components): DXVK Auto on Adreno 6xx keeps DroidDeck-Proton on DXVK-gplasync 2.7.1 * fix(components): DXVK Auto says so when the pinned DXVK could not be installed * fix(components): a DXVK the player picked is shown as their choice, not a failed pinned install |
||
|
|
22a675a664 |
Unify controller and screen input profiles for game and desktop sessions (#1439)
## Problem and intent Desktop sessions need configurable mouse, keyboard and application actions from a controller. On dual-screen devices, a lower-screen trackpad may already handle the pointer, leaving the physical controls available for other assignments. This PR gives physical controllers and local touch controls a shared profile/action model instead of separate configuration paths. This follows the centralization direction discussed in [#1202](https://github.com/Droid-Deck/DroidDeck/pull/1202#issuecomment-6299647180) and addresses the controller-input portion of #860 and #1356. Those discussions are context, **not prior maintainer approval** of this implementation. I would appreciate architectural feedback and guidance on splitting or coordinating this work if that would make review easier. ## Profiles and configuration - Controller stays within the existing Setup tabs. Game and Desktop each have a default-profile selector, followed by one profile list and device settings. - Named profiles reference three independently reusable parts: Physical controller, Main screen and Second screen. Layout geometry and action bindings are stored separately. Profiles can share physical controls while assigning different touch actions. - The session menu selects a complete profile, or expands to mix the three parts. A mixed selection can be saved as a new profile; Game and Desktop retain separate selections. - Both screens use the same full-size editor, with add, move, resize, snapping, undo and shared properties. The main-screen editor has movable, collapsible tools and is transparent above a running session. When editing the secondary display, its entire area is the canvas and the main display hosts tools/properties. - The old fixed gamepad, fixed Deck controls and separate Screen keys editor are replaced with editable presets and the shared renderer. Existing positions, bindings, shapes, symbols, imported images and toggle behavior migrate; legacy Screen keys become additional profiles without replacing the user's selected profile. Migration retains a backup before removing old preferences. - Saved layouts have thumbnails and screen targeting. Actions include compatible native output/remapping, keys/combinations, mouse buttons, pointer movement, vertical/horizontal scrolling, directional keys, existing menu/keyboard commands, and disabled. Buttons can use symbols, shapes and toggle behavior. ## Architecture and latency ```mermaid flowchart LR Library[Profiles + reusable layouts and bindings] --> Router[InputRouter] Physical[Physical controller adapters] --> Router Touch[Main + secondary InputSurfaceView] --> Sources[Owned pad / Deck sources] Sources --> Router BLE[Steam Controller BLE adapter] --> Router Router --> Native[Existing controller publication] Native --> Steam[Steam Input / guest controller] Router --> Held[Shared key and mouse ownership] Held --> Guest[Existing guest input outputs] Router --> UI[Existing menu / keyboard hosts] ``` Bindings resolve when the profile changes, outside event dispatch. Native forwarding has no additional frame/timer queue; identity routes reuse existing state/reports. Only synthesized continuous stick pointer/scroll motion uses a frame callback. One source releasing a key/button does not release another source's hold. Menu, profile, suspension and removal transitions release old outputs and gate held controls until neutral. Steam continues to own game-specific mappings and action sets. Steam Mobile Touch and VR retain their specialized paths. Raw device adapters remain responsible for transport/calibration and must join routing before publishing consumed controls; this does not claim that every adapter has been unified. Historical Thor measurements on the native Game path found kernel-event-to-guest-observer upper-bound medians of **3.061 ms baseline versus 2.999–3.403 ms candidate**, with a subsequent installed-APK check at **3.039 ms / 300 matched edges**. These are relative software-path measurements, not button-to-photon latency. Some tails increased, simultaneous BLE contention remains unmeasured, and **this UI revision has not had a new latency measurement**. The previous cursor fix changed visual update intervals from roughly 33.3 ms to 16.7 ms without changing sensitivity or adding smoothing. [Full design, migration and boundaries](https://github.com/Delete228/DroidDeck/blob/codex/unified-controller-input/docs/development/unified-input-proposal.md). ## Validation Updated through upstream 542bbf89c; current PR head |
||
|
|
aba55031c3 | perf: answer chown and bound thermal paths through the proot fast path (#2203) | ||
|
|
18c7d56409 | fix: Auto components update only DroidDeck-Proton and delete old builds (#2193) | ||
|
|
066834d17d | feat: compress idle game memory before low-RAM devices run out (#2187) | ||
|
|
08526f8283 | Preserve second-screen state when refreshing input profiles | ||
|
|
f44826ae3a | Merge main and retain unified input behavior | ||
|
|
31b8adbb55 | Guard shared input slots and mouse backend transitions | ||
|
|
a81da1e476 |
feat(components): Auto updates for FEX, DXVK and VKD3D-Proton (#2156)
* feat(components): Auto updates for FEX, DXVK and VKD3D-Proton Each component gets an Auto or Manual mode on the Default Components page. Auto installs the newest DroidDeck-Components nightly into every Proton that ships the component, matching each Proton's ARM64EC or x64 flavour, keeps the current and replaced builds, and removes older builds it downloaded. A game that ran on the previous build and exits within 30 seconds twice on the new one rolls the line back; the failed build is skipped until a newer one is published. Existing manual choices keep that component on Manual, and DXVK stays on Manual while a GPU rule pins its version. * fix(components): Auto notes per line, Original label and first-update rollback Boot history on the Original is recorded before the first update so that update can roll back, rollback notes stay with their own component, the Original shows by name, and new Protons get the current build even when no newer one is published. * fix(components): Auto owns only its own downloads and follows in-place Proton updates Auto deletes only builds it downloaded, re-swaps a Proton whose version changed under an existing choice, reports a missing nightly listing as a failed check, writes its state atomically so the page can read it without waiting on a download, and words the rollback and download messages to match what it does. * fix(components): Auto keeps a rollback and reads updated Protons' own files After a rollback only a build newer than every rejected one is taken, so an older build still listed in the nightly cannot replace the restored one. Flavour detection treats a choice saved for an older Proton version as not applied, so a Proton Steam updated in place is read from its own files and re-swapped. A failed state rename falls back to a direct write and is logged. * fix(components): Keep the last good Auto state when a save fails * fix(components): Serialise Auto state reads and writes * Install the Linux runtime by itself on first launch The runtime auto-update skipped devices with no runtime, so FEX, Proton, DXVK and VKD3D waited for the first Steam launch to install it. Claim a first install when the device never had a runtime, on a usable network, outside battery saver and with a supported GPU, and check Proton as soon as the runtime is ready. A runtime the user removed stays removed. * fix(components): Check components as soon as Proton is installed The Auto check stamped its hourly timer even when no Proton was installed yet, so a fresh device waited an hour after Proton arrived. Skip the stamp until a Proton exists and run the check right after a Proton install finishes. * fix(components): Apply stored builds on every check and retry unfinished rollbacks A held or failed download no longer skips applying the stored build or stamps the hourly timer. Stored builds are applied on every check, so a new Proton is reconciled inside the hour, and a check requested while one runs is queued. A rollback that could not restore or swap a Proton is retried and reported only once it finishes. Removing the runtime marks it as seen so it is not installed again, and the failed-save test skips where the process can still write read-only files. * fix(components): Keep rollback restores pending until applied and save state on failure * fix(components): Hold newer builds until a pending rollback is applied * fix(components): Drop pending restores for removed Protons * fix(components): Never auto-install a non-ARM64X build over a Proton's own ARM64X DXVK or VKD3D * fix(components): Read probe archives outside the lock and block auto updates while the original build is unknown * fix(components): Require ARM64X when any Proton on the line needs it, and before each swap |
||
|
|
915f373d82 |
Harden input migration and session lifecycle
Keep migration binding IDs stable, preserve unreadable libraries before recovery, and retain forward-version protection. Release keyboard owners on focus loss, handle unavailable settings displays, and allow controller confirmation or cancellation after physical key capture. Stop BLE routing and publication synchronously before asynchronous disconnect. Add regression coverage and record local and Thor validation. |
||
|
|
7b7722bd25 | Preserve replacement session Deck input routing | ||
|
|
63004567fd | Unify configurable control surfaces and profile management | ||
|
|
ba5876bf6d |
Merge latest upstream main before Controller UI integration
# Conflicts: # app/src/main/java/com/droiddeck/launcher/SessionActivity.kt # app/src/main/java/com/droiddeck/launcher/input/OnScreenControls.kt # app/src/main/java/com/droiddeck/launcher/input/PadBridge.java # app/src/main/java/com/droiddeck/launcher/ui/DeckControlsPanel.kt # app/src/test/java/com/droiddeck/launcher/input/PadBridgeQamTest.kt |
||
|
+1 |
3733c50902 |
feat: non-Adreno graphics stack (Venus, open driver pairs, gamescope patches) (#2029)
* Retain compositor resources when GPU completion is unconfirmed * Stop quarantined GPU callers before retries and mapped writes * Support Android hardware-buffer presentation over Wayland * Support PowerVR swapchains and linear image imports in Gamescope * Bundle verified PowerVR graphics components through existing build preparation * Detect and select the system Vulkan backend on PowerVR * Apply PowerVR Steam and game compatibility during normal launches * Show PowerVR support through existing driver and component controls * Update existing hardware guidance for system Vulkan support * Import the shared system Vulkan readiness check * Discover and propagate the actual PowerVR render node * Prune obsolete PowerVR runtimes after guest processes exit * Retain external DMA-BUF ownership after GPU quarantine * Name the PowerVR HAL selection explicitly * Isolate component UI tests from application startup * Cover the inherited FEX preset in PowerVR profile tests * Log test worker failures for CI diagnosis * Remove temporary test logging after diagnostic CI * Prefer system dependencies for the Android Vulkan loader * Capture raw stderr before test worker termination * Remove the temporary test worker crash probe * Import pinned DXVK recipe prerequisite from PowerVR PR570 Copy only the standalone build recipe, source pin, BC-format prerequisite and presentation-sync patch/check from wallentx/DroidDeck at |
||
|
|
6a681bcbc2 |
docs: clarify DX12 budget consumers and physical limits (#2148)
* docs: clarify DX12 budget consumers and physical limits * docs: record controlled Thor gameplay limits |
||
|
|
cd452e2b60 |
fix: upload GOG cloud saves in Galaxy's gzip + metadata format (#1952)
fix: upload GOG cloud saves in Galaxy's gzip format |
||
|
|
9d2580d502 |
perf: reclaim launcher memory earlier under pressure (#2138)
* perf: reclaim launcher memory under system pressure * docs: record Caravan save-load OOM with spare swap * fix: wait for completed reclaim before increasing backoff |
||
|
|
d64205ba5b |
fix: report Vulkan memory budgets without rejecting allocations (#2014)
Extend the VRAM setting to Vulkan memory-budget reports for DXVK and D3D12 while preserving real heap capacity and allocation results, removing the hard rejection that caused game crashes in FIT and Discord tests. |
||
|
|
64f114c96f | fix: detect graphics capabilities and drop redundant title overrides | ||
|
|
7053058db6 | Harden enhanced diagnostics collection and sharing | ||
|
|
5614bd5d5a | Add enhanced one-session diagnostic bundles | ||
|
|
e72cddccd9 |
perf(steam): decode requested appinfo records only
Avoid decoding every app when Start without Steam resolves one game launch. Use wanted-app selection in the single-game helpers while keeping the existing field decoder and full-reader default for bulk callers. Track partial coverage separately from complete results, share one immutable byte snapshot for incremental queries, and keep timestamp invalidation and warm hits. Preserve the last valid duplicate record and release the raw snapshot after a full decode. Add format/cache/structural-budget and launch-resolution regressions, reuse the existing binary fixture encoder, and document the host-only performance scope. |
||
|
|
e879375ca4 |
fix: upscale game buffers before native-resolution composition (#1367)
* fix: upscale game buffers before native-resolution composition * fix: drop an added code comment from the effects source draw * fix: effects source keeps pillarboxed games and near-full source rectangles * fix: a larger opaque draw above keeps the full composition path --------- Co-authored-by: maxjivi05 <maxjividen@gmail.com> |
||
|
|
68b0396dfe | Merge upstream PC input and dual-screen updates | ||
|
|
0110dc3c0f |
fix: a GOG install launches the game, not its config tool (#1644)
Blood Omen ships dxconfig.exe beside kain.exe and the shortcut pointed at the config tool: pickExe kept the first .exe the folder listing returned when no title match was found. Read the game's play task from GOG's own goggame-<id>.info manifest first - a primary game task, or a primary launcher task for launcher games, and the product's manifest ahead of any other goggame-*.info - then the product's temp_executable; without either, rank the folder's exes so a word of the title wins, config and tool names lose, and depth then size break the remaining ties. GOG's galaxy_*.exe support installer is not the game either. The Witcher: Enhanced Edition ships galaxy_the_witcher_enhanced_edition_2.1.0.15.exe beside launcher.exe, and its build metadata names that file as the product's temp executable, so launching it starts a 32-bit installer that stops at "Path not found" under ARM64 FEX - the same dialog as the setup stub #1174 removed. Play tasks, the hint and the name search skip it. Fixes #680 Fixes #694 Only a primary launcher task counts as a launch task: GOG files the configuration tool beside a game as a non-primary launcher, so it now falls through to the executable search instead of becoming the game. The temp_executable hint is matched by basename with either separator and must resolve inside the install folder, so a nested galaxy_*.exe is skipped too and a hint cannot point outside the game. GOG runs a task from the working directory it declares, and from the install root when it declares none. That directory now reaches the sidecar and the shortcut's Start In: a game in a subfolder (System/witcher.exe) starts where GOG starts it instead of in System/, where it cannot find its Data folder. |
||
|
|
45fb017496 | perf(steam): batch compatibility mapping updates (#1755) | ||
|
|
0cc187025f | fix: read installed depots from completed manifest names too | ||
|
|
cdde9d3390 | fix: a GOG game whose installer cannot run gets its install registry (#2022) | ||
|
|
3583643a11 | feat: Add the Game Jolt store (#1986) | ||
|
|
40dfcd94f9 |
fix(game-env): DOOM (2016) keeps the swapchain image count it asks for (#1987)
DOOM (2016) asks for exactly two swapchain images and stops with "FATAL ERROR: getSwapchainImagesKHR failed with error (VK_SUCCESS)" when it gets more. Every game launch gets GAMESCOPE_WSI_MIN_IMAGE_COUNT=8 and GAMESCOPE_WSI_ENSURE_MIN_IMAGE_COUNT=1, so gamescope's WSI layer gave it 8 images (3 with only the count removed) and the game crashed on start. When DOOMx64vk.exe sits beside the launched program (DOOMx64.exe for a GOG install, or DOOMx64vk.exe), both variables are removed and vk_x11_strict_image_count=true is set, the option Mesa's driconf gives the game. Other games keep the defaults. A per-game value in the environment editor still wins. Tested on an AYANEO Pocket FIT with DroidDeck 0.6.9 and the same values set per game: the swapchain gets 2 images and the game reaches its main menu at 60 fps; before, it crashed on every launch. |
||
|
|
583f34fc55 | fix: stop importing games as Spacewar (480) and follow a changed Steam app id (#1896) | ||
|
|
d6b4b0589b |
Merge upstream shortcuts and dual-screen session updates
Preserve profile bindings, shared held-input ownership and custom panels alongside upstream physical shortcuts, mouse routing and docked menus. Add integration regressions and record the full 2,918-test JVM run. |
||
|
|
67d391958f | feat: apply itch updates as butler patches (#1829) | ||
|
|
f69e2d0171 | fix: Steam's UI draws at an even share of the refresh near 60 fps instead of the panel's full rate (lag and heat since 0.6.7) (#1809) | ||
|
|
2ea78cb238 |
perf(steam): batch compatibility mapping updates
Apply planned compatibility changes in one traversal instead of copying and searching the whole token list for each game. Wire retired-Proton replacement, default/tool changes and x86-64 repointing through the batch writer. Share entry and name updates to preserve metadata, first-match semantics and reverse insertion order. Retain the single-item path and sequential alias/non-string behavior without changing the planner, tool policy, file locks or atomic writes. Add reference, work-budget and integration regressions, and document the host-only bulk configuration benefit. |
||
|
|
198f667bf0 | feat: add GOG maintenance | ||
|
|
9294a60172 |
perf(proot): accelerate and cache glibc syscall relays (#1687)
Libc-internal file operations bypass the existing preload wrappers and still stop in PRoot. Patch recognized ARM64 SVC sites in libc and the runtime loader, reuse the current translator for 20 path syscall numbers, and return declined calls to PRoot. Enabled by default after the tracer-key check; `PROOT_FP_PATCH_SVC=0` remains the troubleshooting opt-out. The hardened implementation patches 47 sites on Thor's glibc 2.43. Relays preserve general/SIMD registers, flags, FP state and errno, and provide unwind metadata back to the original libc frame. Text is patched through `/proc/self/mem` after relay pages become executable. Initialization skips multiple live threads and SVE/SME. Alternate signal stacks and insufficient remaining stack use PRoot; main-stack growth respects the current limit. No proroot code or binaries are imported. Robust-list set/get sites deliberately remain with PRoot/the kernel. Device tests reproduced stale state when the earlier private-TLS implementation mixed patched and raw callers. Removing that shortcut fixes coherence and preserves the host's actual return policy; the earlier thread-creation gain is retired. SDK forwarding still enables faccessat2 ENOSYS fallback and clone3 ENOSYS only before Android 15. Successful clone3 is never executed from the C relay. Existing fsync handling is unchanged. No in-process RET_TRAP filter is added, so SIGSYS-mask/handler machinery is not applicable. Version-2 build-ID/API tables cache relative patch sites in `/tmp`. Every hit revalidates executable bounds, alignment, instructions and syscall numbers. Invalid/unsafe files rescan; publication uses a private temporary file and atomic rename. The PRoot dependency fetch also gains a mirror matching the existing pinned checksum, resolving upstream availability failures without changing versions. Five alternating pairs using the final bundled library on Thor/Android 13: | operation | wrappers only | hardened relays | |---|---:|---:| | libc-internal stat | 49.6 us | 6.0 us | | libc-internal open/close | 50.4 us | 7.8 us | | libc faccessat | 49.7 us | 22.0 us | | libc getcwd | 54.9 us | 5.0 us | | thread create/join | 136 us | 144 us | | complete tiny exec/wait | 4.44 ms | 5.60 ms | An earlier five-pair hardened-library run measured stat 50.1 to 5.9 us and open/close 51.9 to 7.1 us. The metadata gains survive the safety checks. Neither run shows a thread-creation gain, and tiny execs retain roughly 0.9-1.2 ms overhead. Three full Steam startup pairs yielded Home-ready medians of 47.02 s off / 45.25 s on, with overlapping 43-50 s ranges. Steam/CEF-only PSS medians were 1,223.1 / 1,233.9 MiB; the roughly 11 MiB difference is smaller than observed variation, but does not establish zero memory cost. Startup/memory used one unchanged signed bundled-library APK without overrides; the final stack-gap guard only increases distance reserved above other mappings. No reliable whole-client startup improvement is claimed. Earlier fresh Half-Life SD installs took 350/341 s off and 326/327 s on. These are historical results from the preceding robust-list revision, not a post-hardening download retest. Network/shader scheduling varied, allocation did not reliably improve, and the repeat baseline committed faster. This PR demonstrates metadata acceleration; it does not demonstrate a reliable fix for Steam's SD allocation/commit bottleneck. Validation on `2c3c135b` (production code unchanged since `4998b046`): - Local release build, runtime/native-library checks, release signing and four focused Android tests pass. [Final-head CI](https://github.com/Droid-Deck/DroidDeck/actions/runs/40704837477) passed: 1,431 Python/native tests (49 skips), 2,648 Android tests (zero failures/skips), and 162 Rust tests. CodeRabbit is green on the same head. The installed production APK forwards API 33 and patches 47 sites with an unset enable flag and no override; Steam Home renders. - Embedded and shared-PIC matrices pass on glibc 2.43; shared-PIC also passes on separately loaded glibc 2.39. Coverage includes raw results/errno/registers/FP state, path/flag/error and protected-pointer cases, exact readlink boundaries, mixed raw/relay robust state, concurrent threads, fork, thread churn, alternate-stack signals, deferred/FIFO cancellation, signal siglongjmp recovery, forced unwind with caller cleanup, and limited remaining stack. - Four device test-process filters deny the memory patch file, relay mapping, executable permission, or patch writes. Every case leaves original syscall execution working. Host injection also verifies partial installation after an individual site fails. - Concurrent atomic symlink replacement passes 3,000 internal stat/readlink iterations at default/zero TTL. Eight focused host tests pass, covering instruction/branch limits, stack/limit fallback, untrusted cache files and NDEBUG checks. API selection gives 45/47/46 sites for unknown/33/simulated-35; unset and explicit 1 agree, and 0 leaves sites untouched. This does not replace Android 15 hardware testing. - All bench tools compile with -DNDEBUG. Relative/absolute fixture workloads agree, and thread/ABI/failure checks pass on Thor with those builds. - Earlier internal fts/realpath/NSS/dlopen and normalized read-path equivalence pass. The write suite retains the existing wrapper SD Unix-socket mismatch against PRoot. CodeRabbit disposition: fixed relative fixture paths, prevented benchmark checks disappearing under NDEBUG, corrected the limited-fallback description, and narrowed memory-file denial so the thread check still succeeds. The default-off recommendation was addressed by fixing/testing the underlying guard and unwind issue while retaining the requested default-on behavior. The readlink count suggestion is intentionally not adopted: device boundary comparisons reproduce current PRoot behavior, so changing that inherited policy belongs in a separate correctness change. This is not consequence-free instruction patching: constructor time, private text copies and stack checks have costs. Android 15+ ARM64 and 16 KiB-page hardware, arbitrary asynchronous cancellation/non-local exits, user-managed stacks, and attributable tracer-counter measurements remain gaps. Loader calls before the constructor and arbitrary guest ELF syscall sites remain outside scope. Thor was restored to its original APK and bundled library, with app data preserved and test settings, overrides, temporary files and version-2 test caches cleared. Detailed evidence and revision boundaries: [proroot analysis](https://github.com/Droid-Deck/DroidDeck/blob/2c3c135b52c3dd949ef5a99a67d8c12eba24406c/docs/development/proroot-analysis.md). |
||
|
|
2c3c135b52 | test(proot): address benchmark review findings | ||
|
|
4998b04636 | fix(proot): harden relay state and unwinding | ||
|
|
8f6b2a4123 |
feat(itch): update detection and safe updates for installed games (#1665)
## Summary Adds update detection for installed itch.io games. This is PR4 of the itch.io store rework (browse, filters, game page and collections are merged; Linux support is #1589). Butler patching comes later as an add-on pack. Updates here download the full build. ## What changed - `ItchUpdates` (new): compares each installed itch game with the uploads itch lists for it (`GET /games/{id}/uploads`), using what the install already saves: `installVersion` (the upload's `updated_at`) plus `gameId`, `downloadKeyId` and `uploadId` in `extra`. - The installed upload is still listed and has a later `updated_at`: an update. - The installed upload is gone: the newest Windows upload is offered as a replaced build. - An install without an `uploadId` compares the newest Windows upload's date. - An unknown installed version, or no answer from itch, never reports an update. - The check walks installed games one at a time, one second apart, and logs `itch.io: checked <n> installed games, <m> with updates`. It runs when the itch tab opens (at most every 6 hours) and from the new button. A game itch did not answer for keeps its last result. Results are cached in the itch preferences until the update is installed or the account signs out. - Library: games with an update show an "Update" label on their tile and row. A Check for updates button in the Library header (itch tab only) runs the check on demand, shows progress, and ends with a toast: "Updates available: N" or "Up to date". - Game page: an Update button appears for installed itch games with an update. A replaced build asks first and names the new file. A plain newer build updates directly. - Safe updates: an update never extracts into the live game. The archive is unpacked into `.droiddeck-update` inside the game folder, and the new build must contain an executable before any game file is touched. A failed or cancelled download or extraction removes the staging folder and leaves the game as it was. Then `ItchStaging.merge` moves the staged files into place with renames inside one folder. A staged file replaces the file with the same path, directories are merged, and anything the new build doesn't contain (saves, settings, install record, launcher, art) stays. The install record is marked updating just before the move, so an interruption there is resumable. - New strings `stores_itch_updates_found` and `stores_itch_update_replaced` in all 33 locales. The button label, toast and dialog buttons reuse existing strings. - `docs/development/itch-updates.md` describes the feature. ## Notes - One extra copy of the build's size must be free while an update runs. - Files the developer removed in the new version stay in the game folder, because everything the new build doesn't contain is kept. - The final rename step is not an all-or-nothing swap. A crash or power loss inside it leaves the game marked updating and resumable. - The update reruns the normal install over the game's own folder and storage location. ## Tests - `ItchUpdatesTest` (Robolectric, like the other itch tests): newer, same and older stamps, replaced upload falling back to the newest Windows build, unknown installed version, no answer, an install without an upload id, and the cache round trip. - `ItchStagingTest`: new files replace old ones, other files stay, and a file replacing a directory and the other way round. - Not run on a device or compiled locally; relying on CI. The controller focus behaviour of the new buttons is untested. |
||
|
|
9d82df6981 |
fix(game-env): OpenGL games stop waiting for each screen refresh (#1715)
With no frame limit, AIO's Direct3D 7 (DirectDraw) test ran at exactly 144 fps on a 144 Hz panel: every frame waited one refresh (6.94 ms). Wine asks for a swap interval of 1 on every OpenGL window, and WineD3D's front-buffer drawing used by DirectDraw and Direct3D 1-7 never lowers it; it only sets the interval in its present path. Mesa's Zink then presents in FIFO. droiddeck-game-env sets vblank_mode=0 for games launched through Proton before the game's environment edits, so a value set in the launch options or the editor wins and an editor Remove leaves Mesa's default. Steam's own runs in compatdata/0 are unchanged. Steam's Frame Limit still holds a game: gamescope's WSI layer presents every swapchain in FIFO while its limiter is on. On the AYANEO Pocket FIT, AIO Direct3D 7 went from 144 to 2,345 and 2,265 fps (1 % low 99 -> 620) with no limit; with the Quick Access limit at 144 and 72 it held at 143.76 and 71.92. |
||
|
|
ddb8ed32cb | test(proot): record expanded relay validation | ||
|
|
c62b9b5d1b | perf(proot): expand and cache syscall relays | ||
|
|
b245017593 |
Merge upstream main and preserve routed Home input
Integrate upstream
|
||
|
|
52e9810fbc | Pick the newest Windows upload across types for replaced builds and let an update past its commit point finish | ||
|
|
374d4783fc | fix: avoid incompatible Turnip selection and explain Steam startup failures (#1380) | ||
|
|
eceda6e840 | Add opt-in game debug logs and bounded log sharing (#1061) | ||
|
|
e7907d0c74 | Check itch updates per game from the game page instead of from the Library header | ||
|
|
785d1bf1da | perf(proot): enable syscall patching by default | ||
|
|
4b230cbd0f | perf(proot): add opt-in glibc syscall patching |