feat: Save my pipeline list, the zip and filled-in report for the "Submit your pipelines" issue in one click #2447
No reviewers
Labels
No labels
accessibility
autorelease: pending
autorelease: tagged
bug
dependencies
documentation
duplicate
enhancement
github_actions
good first issue
help wanted
invalid
question
testing wanted
wontfix
No milestone
No assignees
1 participant
Due date
No due date set.
Dependencies
No dependencies set
Reference
MagicBeanDev/Hookshot!2447
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/share-pipeline-list"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Sending a pipeline list to #2034 today means finding
hookshot_pipeline_states.binnext to the executable, zipping it by hand and filling in a seven-line template from settings spread over the menu and the log. Few players get through that, and every list sent removes first-load stutter for everyone, so this makes it one click in the game and in both builders.What it does
Save my pipeline list (in-game menu, Debug tab, first row under Developer; and the launcher page of both Hookshot Builders):
Checks
hookshot_pipeline_states.binthe waynx2/pipeline_states.py --checkchecks a list: there, a format this build reads (HKSTATE2 or HKSTATE1, right record size), whole records only, at least one pipeline. If it isn't, it says why in plain words and writes nothing.Writes
hookshot-pipelines-<date>.zipto the Downloads folder (Windows: the Downloads known folder; Linux:XDG_DOWNLOAD_DIRfromuser-dirs.dirs, else~/Downloads, else home). The zip holds exactly two files: the list as the game wrote it, andhookshot_pipeline_report.txt, which is the issue's template filled in:host/mods.cloads them: folders withromfs/exefs,-/_ones skipped)No path, user name, save, cache, options file or log goes in.
The list holds only pipelines the game drew on this PC: predicted pipelines and the shipped list are never written to it.
On a worker thread, so the frame never waits on it, it copies the template to the clipboard (Windows clipboard; Linux
wl-copy, elsexclip/xsel; the Linux builder uses Tk's), shows the folder (Explorer with the zip selected;xdg-openon Linux) and opens #2034 in the browser.Says what happened: the file name and pipeline count, whether the report was copied, and "attach the zip to a comment, then paste the report and say where you played". If the browser could not be opened it shows the issue's address instead.
While that runs, another press is ignored. Nothing is ever uploaded. In a run without a window (
HOS_HEADLESS) the menu saves the zip but opens nothing and leaves the clipboard alone.How
gpu/vk/pipeline_share.h: the check, the template, a small stored-zip writer (CRC-32) and theuser-dirs.dirsreader, as plain functions with no Vulkan, so a test compiles them.gpu/vk/vk_menu.cpp: the row (Debug tab, drawn by that tab's own layout),share_pipeline_list()(values from the live settings through the menu's owntx_*functions, so they read exactly as the menu shows them) and the platform pieces (Downloads folder, clipboard, opening the folder and the browser). On Windows,shell32/ole32(SHGetKnownFolderPath,ShellExecuteW,CoInitializeEx) are loaded from system32 when the row is used, sohookshot_vk.dll's imports stay within the DLSS workflow's allowlist. COM is initialised on the worker forShellExecuteW. On Linux, desktop programs are started with only their three standard files (close-on-exec clipboard pipe,addclosefrom_np). The zip is written to a fresh.newfile (O_EXCL|O_NOFOLLOW/CREATE_NEW) and moved over the old one.gpu/vk/vk_draw.cppstate_list_snapshot()reads the list under the lock the recorder writes it with, so a record being written at that moment is never half in the zip.gpu/vk/vk_main.cpplogsvk: driver: <name> <info>once at start, so the builders can report the driver too (older logs: decoded from the version number).nx2/pipeline_share.py: the same zip for the builders (the list read once, so the bytes checked are the bytes zipped), from the game folder (version from the last log orhookshot_version.txt, GPU and driver from the last log, settings fromhookshot_options.ini, mods frommods/). The Linux builder imports it; the Windows builder runs it with--jsonwith its own Python, then does the clipboard, Explorer and browser itself. It also works by hand:python -I nx2/pipeline_share.py <game folder>.assets/pipeline_states/README.md,docs/development.md.Tests
tests/test_pipeline_share.py(game-free, picked up byrun_all.py):hookshot_pipeline_states.bin(byte-identical) andhookshot_pipeline_report.txt, and nothing else from a game folder that also has saves, caches, the options file and the log; the CRCs check;vk_menu.cpp/upscaler_rows.h;state_record()is reached only fromdraw()throughgraphics_pipeline()andpipeline_note(), never from the precompile, predicted pipelines or the shipped list;HOS_HEADLESS, opens the browser on a worker with COM initialised, gives desktop programs none of the game's files, and uploads nothing;xdg-open: the zip, then copy, folder, issue; a refusal opens nothing.Full
python -I -B tests/run_all.pyon Linux, on the final tree (main merged in): 401 passed, 0 failed, 12 skipped (no dotnet, PIL or some headers here).Checked by hand
Game (Linux, RTX 3090, NVIDIA 620.70.06, headless run,
HOS_HEADLESS=1 HOS_NO_SDL=1, title screen; build of this branch with main merged in, v2.1.0-rc.3-120-g5df019f): the menu opened withRX_VK_MENU_SCRIPT, then Debug tab, Save my pipeline list, Enter. The row changed from Save to Saved, and the help box said where the zip went and what to do next. The log saidmenu: Save my pipeline list: hookshot-pipelines-2026-11-11.zip, 672 pipelines, in Downloads. The zip held exactlyhookshot_pipeline_states.bin(byte-identical to the game folder's) andhookshot_pipeline_report.txt:The run was headless, so as designed it opened nothing.
Linux builder: the launcher page in a nested headless sway, the button pressed through Tk: the zip landed in the Downloads folder from
user-dirs.dirs,xdg-openwas asked for the folder and the issue, the status line says what happened (screenshots).Windows builder: compiles (
dotnet build -c Debug -p:EnableWindowsTargeting=true -warnaserror, .NET 8 SDK on Linux, 0 warnings). Not run on Windows: the clipboard, Explorer and browser calls there are untested.Windows game:
vk_menu.cppandvk_main.cppcompile with llvm-mingw.vk_menu.oimports only kernel32, user32 and UCRT functions; shell32 and ole32 are loaded at run time. Not run on Windows.Screenshots
In-game menu, Debug tab, the row selected:
After Enter: the row says Saved, and the help box says where the zip went and what to do:
Linux builder launcher page after pressing the button:
Suggested new body for #2034 (not edited)
When Hookshot meets a pipeline it hasn't built on your PC yet, it builds it on the spot, which causes a stutter, or a short white wash on the first field load. Releases ship a list of known pipelines that the first start builds ahead of time. The list only covers what someone has played, so send us the list your game wrote while you played and we'll merge it into the next release.
Is it safe? Yes. The file holds no game code, game data or personal info: only shader hashes, formats and draw state. See
assets/pipeline_states/README.md.How to submit
Play on a recent build (a build from main), see https://github.com/hckrman101/HookshotDownloads/releases
Save your list:
It saves
hookshot-pipelines-<date>.zipin your Downloads folder, copies a filled-in report to your clipboard and opens this issue.Comment here: drag the zip in, paste the report, and fill in where you played.
Nothing is uploaded for you, and the zip holds only
hookshot_pipeline_states.binand the report (version, OS, GPU and driver, output and render resolution, upscaler, frame generation, HDR, mods). If your list is missing or damaged, it tells you and saves nothing.Settings matter, so lists from different GPUs, upscalers and resolutions are especially welcome, as are areas few people reach (late dungeons, bosses, night, rain, underwater).
On a build without Save my pipeline list
Zip
hookshot_pipeline_states.binfrom next to the Hookshot executable (only that file: nohookshot_shaders.bin, saves or anything else from the game folder), drag the zip into a comment here and fill in:Or, from a clone of the repository:
python -I nx2/pipeline_share.py <game folder>makes the same zip and report.What happens next
We merge each list with
nx2/pipeline_states.py(each pipeline kept once) and note its source inassets/pipeline_states/. Lists that only repeat known pipelines add nothing, and that's fine.Thanks!
(Changes from the current body: the one-click steps lead; the old manual steps and template move into a collapsed section; the AI-agent paragraph is dropped because the button does that job; the safety link points at
assets/pipeline_states/README.md, because the currentassets/pipeline_states.mdlink is broken.)Not tested
wl-copy/xclip/xsel; on Windows,CF_UNICODETEXT), opening the folder and opening the browser. Test runs are headless by rule, so nothing was opened./selectand the Downloads known folder.xdg-openinherits the AppImage's environment there, as the game's existing update prompt already does.builder/py) has no button yet. It could callnx2/pipeline_share.pythe same way.The red checks are this PR's own:
test_recorder_syncfails becausevk_work.his no longer the last include invk_menu.cpp.hookshot_vk.dllnow importsSHELL32andole32. Those calls either move to the host, or CI's allowlist widens, which is a maintainer choice.github-sync referenced this pull request2026-11-12 06:22:54 +00:00