2.1.0-rc.1 (2026-11-11)
Features
- Add a control to disable camera centering (2dcf210)
- Add an option to disable automatic camera centering (657da4f)
- Audio tab in the Insert menu with Volume and Mute in background (52ca067)
- Audio tab in the Insert menu with Volume and Mute in background (df2d84c)
- builder: let the player choose how much memory a build may take (90055d0)
- builder: the Linux builder looks like the Windows one (8c1b5e9)
- builder: the Linux builder looks like the Windows one (8f2e1a1)
- builder: use the saved build memory choice for updates (86ff22c)
- builder: warn before building on a hard drive (b526a84)
- builder: warn before building on a hard drive (c769305)
- build: Probe for system Vulkan packages, add proper requirements (3b84291)
- build: Probe for system Vulkan packages, add proper requirements.txt (155bfa2)
- linux: opt-in NVIDIA DLSS in Linux Builder and AppImage (484cfd1)
- linux: opt-in NVIDIA DLSS in Linux Builder and AppImage (66b86fb)
- menu: a DualShock 4 or DualSense touchpad click opens the menu as F1 (8790b8f)
- menu: a Mesh shaders row (Automatic, Native, Compute) (#1971) (c8022e7)
- menu: a Text size row for dialogue, Navi and signs (4d0645f)
- menu: a Text size row for dialogue, Navi and signs (4bae30c)
- menu: add 5120x2880 (5K) to Output resolution (ce175ac)
- menu: centre the menu in a 16:9 column on ultrawide (70e2209)
- menu: DLAA as DLSS's Native render resolution, and Render resolution as a slider in real sizes (#2000) (e187859)
- menu: Esc can open the Insert menu (Menu shortcut "Insert, F1 or Esc") (#1998) (d926317)
- menu: let players choose the keyboard shortcut (#1609) (191cfdc)
- menu: put the debug tools on the Debug tab (e256616)
- menu: redesign the Debug tab, Inventory and Teleport pages (c805d9b)
- menu: save Output resolution as a size, and take any size from the config (a78ee4d)
- menu: the debug tools' Teleport row opens the map list (a4c3a8d)
- RecompLauncher support (recomplauncher.json, make_game --game/--prepare) (ab5a1f6)
- startup: lower the start-up screen, smaller text, fade to black at the end (8649805)
- startup: lower the start-up screen, smaller text, fade to black at the end (fb60134)
- vk: add AMD Anti-Lag 2 (VK_AMD_anti_lag) (8ea4e7f)
- vk: add opt-in VRAM compaction and hold the driver's count below its limit (3932421)
- vk: AMD Anti-Lag 2 through VK_AMD_anti_lag (b9e7559)
- vk: Anisotropic filtering option, 16x by default, and the upscalers' texture LOD bias (0af7629)
- vk: Anisotropic filtering row, 16x by default (d9b0ce2)
- vk: draw the menu, FPS counter and start-up screen with Dear ImGui (509579b)
- vk: opt-in VRAM compaction (RX_VK_COMPACT=1): the textures' free space goes back to the driver (d218438)
- vk: trace effective presentation geometry on changes (#1457) (a350759)
- vk: upscalers' texture LOD bias below the game's 3/4 render (3b9ffcd)
- vk: warm the stage libraries from the program cache into the pipeline cache (24ebac7)
Bug Fixes
- a game folder whose deepest file passes 260 characters builds and plays (#1468) (d231d17)
- a game folder whose deepest file passes 260 characters builds and plays (#1468) (45c7418)
- Address camera centering review feedback (103e2cd)
- appimage: copy sysroot library aliases by value for updates (#1536) (ed66422)
- audio: keep 512-frame power-of-two default on SDL2 fallback (#1550) (fa85175)
- build: a game built from extracted folders refuses links in them (233e072)
- builder: --cli says make_game's own error, on stdout too (a3859f1)
- builder: bound writes from compressed NUP members (#1596) (56e31e7)
- builder: constrain the Show details hit area (d45e262)
- builder: constrain the Show details hit area (080bf91), closes #1842
- builder: give the prepare shaders tick its own row (1ace933)
- builder: honor DLSS opt-in when updating a game (#1643) (c3aa9c0)
- builder: report bytes during NUP extraction (#1671) (c4a9085)
- builder: select the saved build memory in BeginUpdate (d08aaed)
- builder: the Linux builder's details box is read-only (b2ac2bf)
- builder: the Linux builder's details box is read-only (d7cc1d4)
- build: escape the build folder in glob patterns (a work folder with [ ] found no lifted code) (#1722) (caaee0b)
- build: invalidate DLSS objects when SDK headers change (#1648) (c716137)
- build: package scripts/ in the Linux AppImage, so NVIDIA DLSS can be fetched (b0aa6f6)
- build: package scripts/ in the Linux AppImage, so NVIDIA DLSS can be fetched (af9e98c)
- build: stop sampling memory for exited compiler roots (#1562) (4a7ae1b)
- build: the logo and fonts are made only where the Vulkan back end is compiled (an AppImage build stopped at LibertinusSans-Regular.ttf) (#1567) (6add2f1)
- Discord status starts on Windows (it was only started in the Linux build's main) (#1539) (7d1562d)
- display: address pointer sampling review feedback (acf9dae)
- display: do not toggle fullscreen on F11 when modifier keys are held (#1309) (#1608) (635ba1a)
- display: integrate coherent game-menu pointer samples (09685de)
- display: integrate main and declare pointer fixture requirements (8a6f1e5)
- display: open the window on COSMIC's Wayland with SDL2 (#992) (e937168)
- display: publish coherent pointer and drawable samples (fd93173)
- display: publish coherent pointer and drawable samples (ee53072)
- env: hookshot_env.txt sets no test switch that names a file or presses buttons (74cee1e)
- framegen: 2x made by the renderer's own blend again; AMD FSR 3.1's interpolation opt-in (RX_VK_FSR_FG=1) (eb5b9a0)
- framegen: 2x uses the renderer's own blend again; FSR 3.1 interpolation opt-in (#1635) (3b76e95)
- hardening part 3, updates, shared files, guest buffers and texture sizes (d5feb7b)
- hid: deduplicate gamepad polling when SDL controllers are active (#1480, #1583) (2b0f762)
- hid: deduplicate gamepad polling when SDL controllers are active (#1480, #1583) (731898a)
- hos: host copies, file reads and writes, and the NV12 reader stay in guest memory (6f8f243)
- host: room in the drivers' shader caches for the prepared pipelines (Linux) (#2033) (c9ec3bb)
- host: the cache cores only where the L3s are shared alike and the largest has 8 cores (review of #1638) (428633a)
- input: a stick axis steers once it has been seen at rest (camera spinning on its own, #1673, #1661) (#1677) (d8f0513)
- linux: safely rebase legacy sysroot links (#1553) (ca3a252)
- loader: add the addend to GLOB_DAT and JUMP_SLOT relocations (1372edb)
- loader: add the addend to GLOB_DAT and JUMP_SLOT relocations (95a9a07)
- make_game: --prepare says errors and --check on stdout, and refuses a missing --game (2d27d08)
- menu: A and B confirm and go back on a controller, as in the game (02b0903)
- menu: a save keeps the options file's lines the menu does not write (#1493) (a2e6505)
- menu: a size from the config shows as its size alone, no label (bc9406c)
- menu: clarify frame-generation preset help (#1554) (77685a5)
- menu: distinguish game and generated frame rates (#1659) (b2bb214)
- menu: F1 always opens the menu (Menu shortcut: Insert or F1, or F1 only) (#1632) (d448ccc)
- menu: Frame generation is the player's choice; Quality presets leave it alone (2ef499d)
- menu: hide rows for features this PC lacks, and keep mouse clicks on the row meant (51de681)
- menu: hide rows for features this PC lacks, and keep mouse clicks on the row meant (849b63e)
- menu: keep the FPS counter off the banner on a window just wider than 16:9 (#1545) (50d71bd)
- menu: keep the help box and rows above the prompt strip (bd1616f)
- menu: Menu size is Medium on every input, and the version shrinks to fit (73feec0)
- menu: Quality presets leave Frame generation alone, so it stays off by default (a72690c)
- menu: run the upscalers' one-time probes during the start-up screen, not at the menu's first open (#1886) (#1916) (74075de)
- menu: the FPS counter looks as it did (green outlined text in the corner, no plate) (#1957) (92907f7)
- menu: the mouse wheel scrolls, it never changes a value (#1557) (be541fa)
- nup: name the member and the drive when extraction runs out of space (#1595) (218d8de)
- packaging: include the prompt encoder's runtime dependency (#1598) (53a5fd5)
- preserve UTF-8 and extraction guards in long-path support (#1592) (38a5794)
- render: publish coherent shared temporal jitter samples (a38a07d)
- render: publish coherent temporal jitter samples (0291727)
- render: reset temporal history when reprojection is invalid (0cf9936)
- render: reset temporal history when reprojection is invalid (19b81b7)
- rt: mark an exclusive store's page after the store, not before (7cb4028)
- rt: mark an exclusive store's page after the store, not before (db6324f)
- scripts: the profile readers name and count Linux samples (#1746) (6269088)
- security: a font's cmap offset, a microphone's name, and the game's library loads stay in bounds (9323390)
- security: verify Windows updater asset digests (6d5f277)
- security: verify Windows updater asset digests (50b6866), closes #1679
- setup: explain how to restore missing Windows tar (1c1995e)
- setup: explain recovery when Windows tar is missing (fbaf722)
- shaders: a loop that leaves by predicated EXITs ends at its closing self-branch (the last program that did not lower) (a8e7ee5)
- shaders: a program ends at its closing self-branch after an unconditional jump back (7e1db37)
- shaders: an immediate's low byte is not a scratch register (d0f3511)
- shaders: ISBERD.O, a task or mesh program reading back its output region (67c048e)
- shaders: ISBERD.O, a task program reading back its payload (12 failing pipelines) (0904155)
- shaders: LDG [URn+imm] with both ordering bits 77-78 lowers (692a1c0)
- shaders: LDG/STG [URn+imm] with ordering bit 78 lower (2 compute programs) (5ec9668)
- shaders: lower TLD.MS (multisampled texel fetch) to Maxwell TLDS 2D.LZ.MS (6860451)
- shaders: lower TLD.MS, a multisampled texture's texel, to Maxwell TLDS 2D.LZ.MS (20dd78b)
- shaders: R2UR's source is one register, not a pair (597edcb)
- shaders: R2UR's source is one register, not a pair (a vertex program refused) (9edb3a5)
- shaders: STG [URn+imm] with ordering bit 78 lowers too (923a334)
- shaders: two large compute programs lower (an immediate is not R254) and get their local memory (10cfd70)
- the display stays on while playing with a controller (#1532) (#1538) (c38df20)
- update: Linux downloads are GETs again; a part's links stay in the install; the requested tag is installed (df9a52e)
- vi: a cutscene's cues stay with its movie above a 60 cap (a7cc747)
- vi: a cutscene's cues stay with its movie above a 60 cap (#1742) (6c596af)
- vi: keep the game at real speed under a Frame rate cap above 60 (#1612) (1a429f6)
- vk: a masked clear that backed off is tried again now and then (#1787) (fa04b6f)
- vk: a masked clear whose pipeline the driver did not make is tried again, not cached as null (#1787) (9d94f4c)
- vk: a masked clear whose pipeline the driver did not make is tried again, not cached as null (#1787) (f002c90)
- vk: a shadow is made only where the textures' own lines are not passed (review of #1637) (ecb6e9a)
- vk: a switch for an engine that cannot run leaves a saved FSR 3.1 (#1773 review) (a9ea73a)
- vk: a texture's storage size is computed in 64 bits, and one past the GPU's limits is not made (81a6da5)
- vk: add VMA image allocation retry without WITHIN_BUDGET (39d978b)
- vk: add VMA image allocation retry without WITHIN_BUDGET (560cc5a)
- vk: admit only successful samplers across cache layers (52ac35c)
- vk: admit only successful samplers across cache layers (3379314)
- vk: ask for task and mesh shader counts only where the driver offers them (ba86aee)
- vk: ask for task and mesh shader counts only where the driver offers them (a3d88ea)
- vk: ask the pipeline cache for a compute pipeline before queueing its build (0db1e74)
- vk: avoid aligned uniform-word cache collisions (1b25b22)
- vk: build every predicted pipeline before the game (the prediction found nothing on fresh builds; no 90 s budget; one progress bar) (#2032) (ff85d7d)
- vk: build the precompile's first graphics pipeline alone (41b3438)
- vk: capture jitter cache frame under its lock (1f32a16)
- vk: check cached descriptor counts and the formats of noted pipelines (59f9284)
- vk: coloured specks on fallback foliage (AMD): the generated vertex stage's outputs start at (0,0,0,1) (16631b6)
- vk: commit bank cache generations after successful stream upload (60ea984)
- vk: compute programs get their local memory size (control section +0x68) (a083825)
- vk: dark lighting and glowing bloom on AMD: 64-lane graphics warps and Lichii #273's fragment shuffle fallback (030e605)
- vk: decode Deck gameplay upscale as RGB9E5 (903bc4a)
- vk: decode gameplay RGB9E5 upscale fallback (6c936d4)
- vk: dense grass cut off and far trees flickering without mesh shaders: fallback records from an allocator, 65535 slots (7047756)
- vk: disable failed frame log sinks and unwind startup (#1531) (5fde3cf)
- vk: establish capture copy visibility for host reads (7ef03d4)
- vk: expose the retirement helper across renderer units (d5b7437)
- vk: flush custom UI texture staging before GPU use (#1559) (188baa6)
- vk: invalidate capture readbacks before CPU reads (0c6c047)
- vk: keep adjacent uniform words in separate cache slots (7b81752)
- vk: keep Windows prepare times in FILETIME ticks (#1517) (edeaa9d)
- vk: let a draw run its own queued shader translation (#1714) (8bac8aa)
- vk: log a driver fault caught by the Windows pipeline guards (ac7d4a7)
- vk: make capture readbacks visible before CPU reads (6e06af5)
- vk: make frame dump copies visible to host reads (#1621) (c1a4fde)
- vk: mark a clear's targets in the parallel replay's dry pass (the one-frame black scenes) (adb7a5d)
- vk: missing floor grass without mesh shaders: indirect task draws ran no mesh workgroups (ccf7f41)
- vk: own native FSR constants for each recording (2982420)
- vk: own native FSR constants for each recording (895d673)
- vk: parallel replay: a clear's targets are marked in the dry pass (the one-frame black scenes) (168e4d1)
- vk: present ahead's vk_replay.cpp half, lost in #1720's merge (be8b512)
- vk: present ahead's vk_replay.cpp half, lost in #1720's merge (main doesn't link) (1392ea3)
- vk: preserve brightness in flash sampling across capture sizes (#1537) (6f5ecab)
- vk: preserve contiguous words in the mixed uniform cache (70ffaf2)
- vk: preserve CPU write watches during pool imports (#1434) (74dcb75)
- vk: prevent aligned uniform words from thrashing the cache (78e1112)
- vk: publish complete PNG captures and report failures (#1604) (ba40a1a)
- vk: publish complete screenshot resource sets (#1472) (ff69134)
- vk: publish recording stream writes before GPU submission (d71739d)
- vk: publish recording stream writes before GPU submission (0e843bd)
- vk: publish texture staging slices before GPU reads (#1672) (a6e2e14)
- vk: Read texture handles from stage constant banks (31933e4)
- vk: Read texture handles from stage constant banks (4654870)
- vk: recover recording stream and descriptor allocation failures (fad4d16)
- vk: recover recording stream and descriptor allocation failures (6e93f80)
- vk: reject failed descriptor-pool creation results (6a51fc2)
- vk: reject failed samplers before descriptor publication (2914a73)
- vk: reject missing RGB9E5 fallback views (6f5f769)
- vk: reject unbound imported buffers and roll back ownership (325583b)
- vk: reject unbound imported buffers and roll back ownership (af8f012)
- vk: replace menu upload buffers only after successful growth (#1453) (60b0c9b)
- vk: report device loss throughout native presentation (5997b2d)
- vk: report device loss throughout native presentation (8e1abe3)
- vk: reset swap_spare with the swapchain; leave a skipped present out of the counts (08f3fe4)
- vk: retire native FSR images after GPU completion (8fc2587)
- vk: retire native FSR images after GPU completion (4aaf336)
- vk: retry transient texture image view failures (8686552)
- vk: retry transient texture image view failures (394b797)
- vk: RX_VK_FSR4 and RX_VK_DLSS go over a saved FSR 3.1 (#1008 follow-up) (4cde5c6)
- vk: RX_VK_FSR4 and RX_VK_DLSS go over a saved FSR 3.1 (#1008 review) (6229c02)
- vk: RX_VK_VRAM_MB and the integrated-GPU cap win over a preset's texture budget (#1376) (e27740a)
- vk: share validated source crops across presentation paths (187e70b)
- vk: share validated source crops across presentation paths (d4c0429)
- vk: shared_pipeline_cache outside the unnamed namespace (vk_fsr3.cpp could not link to it) (9d44621)
- vk: slow resume and black HUD hearts on 4 GB cards: the texture squeeze waits while VMA's blocks have room (189287f)
- vk: snapshot pending shots before reusing their readback slot (#1519) (aaf6ac1)
- vk: submit a 2x set's copies together so its presents keep their times (64cfe26)
- vk: submit a 2x set's copies together so its presents keep their times (79e42ac)
- vk: the upscale stand-in and the texture clear call texture_written as before (73c6dd3)
- vk: tie texel buffer views to their imported backing (692e87d)
- vk: tie texel buffer views to their imported backing (a23587f)
- vk: Timestamp frame captures with the host clock (3563479)
- vk: Use host timestamps in frame captures (b2ed731)
- vk: validate capture dimensions before allocating readbacks (#1551) (17e8cd8)
- vk: validate HDR crops through the shared source rectangle (f20afae)
- vulkan: avoid the AMD cloth pipeline optimizer hang (bebe51e)
- vulkan: finish the RX 6700 XT merge resolution (5ffdaeb)
- vulkan: refresh direct-write tracking on current main (a4c8f85)
- vulkan: stop distant trees flickering in the mesh fallback (7fc0a61)
- vulkan: track writes from direct buffer bindings (be1aabc)
- write-back stale-shadow edgecase (c5aa906)
Performance Improvements
- host: keep the game's threads on the 3D V-Cache cores of two-CCD X3D CPUs (1360a44)
- host: on X3D CPUs with two CCDs the game's threads stay on the cores that share the 3D V-Cache (b3c0982)
- host: write the log in batches, a few writes a second instead of one per line (c7e41fd)
- host: write the log in batches, a few writes a second instead of one per line (7f12643)
- vk: a captured page's words read from the capture, not a 4 KB copy kept a thread (0b951ec)
- vk: copy captured pages with non-temporal stores (d8ce191)
- vk: copy captured pages with non-temporal stores (146fe38)
- vk: Descriptor reuse on by default (options_version 4) (f758d9f)
- vk: Descriptor reuse on by default (options_version 4) (f214c0c)
- vk: DLSS keeps its feature through loading screens while it is the Upscaler (a 44-78 ms stutter at each area entry) (#1520) (549a43b)
- vk: flush only each FSR uniform slice (c7c88fa)
- vk: FSR 3.1's passes go through the pipeline cache kept across runs (e805e02)
- vk: FSR 3.1's passes go through the pipeline cache kept across runs (a 1.7 s longer first frame of play) (b27d9b6)
- vk: FSR 3.1's pipelines through the play caches too (shared_compute_pipeline) (46efc77)
- vk: in play an ask without compiling goes through the play caches too (#1765's dispatch, the stage libraries) (6593de7)
- vk: keep 32 submitted pages a thread, not one (338837d)
- vk: keep four pages for the replay's reads as submitted, not one (3bae557)
- vk: keep four pages for the replay's reads as submitted, not one (Kokiri village view 50 -> 57 fps) (72133cb)
- vk: keep the write-back shadows while VRAM is full of free space inside VMA's blocks (6a4f3ea)
- vk: less copying of captured memory on the game and replay threads (e63d30d)
- vk: RX_VK_SUBMITTED_PAGES=1 keeps one submitted page, as before #1762; tests follow #1762 and #1619 (cfefd0e)
- vk: skip write-backs of large GPU-written bindings (2ea6386)
- vk: skip write-backs of large GPU-written bindings (30911ca)
- vk: the capture's copies split by one function; a caller runs its own parts no helper has taken (c747a2c)
- vk: the capture's streaming-store copy is opt-in (RX_VK_CAPTURE_NT=1): more stutters, no lower capture time here (#1841) (f4e6fdd)
- vk: the texture shadow's pages kept in place and copied by the capture helpers (a4ccf07)
- vk: the write-back shadows stay while VRAM is full of free space inside VMA's blocks (23738b6)
- vk: what play makes goes into a pipeline cache of its own, one file per save (no 0.5-1.2 GB rewrite in play) (74c15be)
- vk: what play makes goes into a pipeline cache of its own, one per save, not the whole cache again (1b0ea22)
- vk: write the pipeline cache only when its data changed (no 1.1 GB rewrite at every start) (bd5086a)
- vk: write the pipeline cache only when its data changed since it was read or last written (5a3fd42)
- vk: write the pipeline cache only when its data changed since it was read or last written (9f4fb8e)
Which file do I download?
| On | Download |
|---|---|
| Windows | HookshotBuilder.exe, the setup
|
| Linux, Steam Deck | Hookshot-v2.1.0-rc.1-x86_64.AppImage
|
You need your own copy of the game. hookshot-setup.txt, hookshot-linux.txt and the .zsync are for the updaters. To check a download: sha256sum -c --ignore-missing SHA256SUMS, or gh attestation verify <file> -R NotRexed/Hookshot.