Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
146 commits
Select commit Hold shift + click to select a range
1025c29
docs: plan upscaling and frame generation around the game's own TAAU
decoder37 Nov 8, 2026
d9566a1
feat: name each network binding's role in the upscaler input contract
decoder37 Nov 8, 2026
1a036c8
feat: route the game's upscale dispatch through one backend seam
decoder37 Nov 8, 2026
492bcd0
fix: read the upscaler contract in descriptor order, not from draw_sa…
decoder37 Nov 8, 2026
37afa2e
feat: compile AMD's FSR 3.1 upscaler passes from the FidelityFX SDK
decoder37 Nov 8, 2026
8f2fda3
feat: census the render target sets, to settle whether a G-buffer exists
decoder37 Nov 8, 2026
ced7485
Merge remote-tracking branch 'upstream/main' into feat/fsr-vendor
decoder37 Nov 8, 2026
7042b33
docs: the render target census ran, and the count alone does not sett…
decoder37 Nov 8, 2026
6b51433
feat: create FSR 3.1's pipelines and internal images
decoder37 Nov 8, 2026
8769c80
feat: record FSR 3.1's nine dispatches
decoder37 Nov 8, 2026
853cfe3
fix: the game's network takes one texture, so it is not a temporal up…
decoder37 Nov 8, 2026
52bfca2
docs: the camera's field layout, read out of sead's projection update
decoder37 Nov 8, 2026
8bd7c8d
feat: publish Ocarina's camera, and make a backend reachable without …
decoder37 Nov 8, 2026
29c7cbe
feat: derive camera motion from the scene's depth, and keep that depth
decoder37 Nov 8, 2026
bf0382c
docs: the baseline, which says an upscaler is not what gets this to 60
decoder37 Nov 8, 2026
af0f871
docs: 60 fps is the floor here, not the target
decoder37 Nov 8, 2026
481b957
feat: give FSR the assembled depth and camera motion
decoder37 Nov 8, 2026
c630d59
fix: publish the camera from the inlined projection copies too
decoder37 Nov 8, 2026
2008ac7
feat: HOS_FPS_FORCE, because raising the limiter alone does not hold
decoder37 Nov 8, 2026
3790556
fix: snapshot the projection's fields, and name what caps the frame rate
decoder37 Nov 8, 2026
c65c68e
feat: HOS_DISPLAY_VRR, which is what actually holds the frame rate at 60
decoder37 Nov 8, 2026
388844d
docs: the camera's values, measured, and the needle they give for the…
decoder37 Nov 8, 2026
5eb9f8b
feat: HOS_VSYNC_HZ, the hardcoded 60 that actually paces the game
decoder37 Nov 8, 2026
a67e471
feat: the vsync event follows the display, and 0 turns it off
decoder37 Nov 8, 2026
70ecdf4
fix: the host camera symbols must be weak, or the renderer does not l…
decoder37 Nov 8, 2026
3c02213
feat: RX_VK_VP_HUNT, to find the view projection from a value only it…
decoder37 Nov 8, 2026
8681f2e
fix: HOS_FPS_FORCE must not touch the nominal rate: it is slow motion…
decoder37 Nov 8, 2026
aff6abb
feat: DLSS Super Resolution through NGX, behind a build-time SDK gate
decoder37 Nov 9, 2026
2946a32
feat: the hunt found the projection, so widen it to find the view
decoder37 Nov 9, 2026
df82d90
feat: compose the scene's view projection, and transpose it for the s…
decoder37 Nov 9, 2026
2d9b4e8
fix: the view projection scan ran per draw, which stuttered hard
decoder37 Nov 9, 2026
85a3ea2
feat: count FSR evaluations, because nine passes a call is cheap or r…
decoder37 Nov 9, 2026
66e8c3a
fix: clear the SPD counter between the pyramid passes (did not fix th…
decoder37 Nov 9, 2026
1d7f262
feat: a timed span per FSR pass, so the cost has a number per pass
decoder37 Nov 9, 2026
6aa9f48
feat: DLSS at the seam, and a stage switch for the FSR cost
notquiteog Nov 9, 2026
12d4d83
fix: scan for the view projection once a target set, not once a draw
notquiteog Nov 9, 2026
43e3360
feat: link NGX properly, frame generation at the seam, AMD's interpol…
notquiteog Nov 9, 2026
03592b6
docs: what ran, what NGX needed, and what ray reconstruction has no j…
notquiteog Nov 9, 2026
ad291d1
feat: frame generation asks for its own extensions and the whole inpu…
notquiteog Nov 9, 2026
bb58e70
docs: frame generation runs, and the two refusals that got it there
notquiteog Nov 9, 2026
cf8b3b1
feat: the two backends have rows in the Insert menu
notquiteog Nov 9, 2026
384c41b
feat: FSR 3 frame interpolation, and a jitter for the upscalers to undo
notquiteog Nov 9, 2026
8acdae9
docs: the frame-interpolation backend's unverified list, and why the …
notquiteog Nov 9, 2026
c871a3c
fix: the renderer would not load, and the build now says so
notquiteog Nov 9, 2026
86b6988
fix: the DLSS contract test links again
notquiteog Nov 9, 2026
0196314
Merge branch 'feat/fsr-vendor'
notquiteog Nov 9, 2026
f48483c
fix: the shader check compared glslang's version, and ran where glsla…
notquiteog Nov 9, 2026
47dd097
fix: a fork releases its own work, not upstream's
notquiteog Nov 9, 2026
3ff9fbd
fix: the release's commit-analyzer preset is a package, and it was no…
notquiteog Nov 9, 2026
ca6595f
fix: the conventionalcommits preset has to match the changelog writer
notquiteog Nov 9, 2026
e4c5c99
chore(release): 2.1.0 [skip ci] [skip release]
semantic-release-bot Nov 9, 2026
4ed2196
docs: neural rendering on AMD is the game's own network, not FSR 4
notquiteog Nov 9, 2026
746d1ba
Merge remote-tracking branch 'origin/main'
notquiteog Nov 9, 2026
9858599
fix: the history reset the document specifies, which nothing implemented
notquiteog Nov 9, 2026
4f26e27
chore(release): 2.1.1 [skip ci] [skip release]
semantic-release-bot Nov 9, 2026
16c7d39
docs: the optical-flow scale checks out, so it is no longer a guess
notquiteog Nov 9, 2026
a12d616
Merge remote-tracking branch 'origin/main'
notquiteog Nov 9, 2026
a0ce7de
feat: the upscalers and frame generation are the native settings, not…
notquiteog Nov 9, 2026
af2d7cf
Merge upstream/main (151 commits) into the fork
notquiteog Nov 9, 2026
c87ca37
chore(release): 2.2.0 [skip ci] [skip release]
semantic-release-bot Nov 9, 2026
e7806a2
docs: the settings a player sees are the two rows that were already t…
notquiteog Nov 9, 2026
ba44846
test: the Upscaling row's two halves, and the clamp that hides DLSS
notquiteog Nov 9, 2026
208fa4d
Merge remote-tracking branch 'origin/main'
notquiteog Nov 9, 2026
c6acc00
docs: where the frame actually goes, and why parallel replay makes it…
notquiteog Nov 9, 2026
b8543c9
feat: the parallel lock says which site took it, and the answer is tw…
notquiteog Nov 9, 2026
8a37a76
chore(release): 2.3.0 [skip ci] [skip release]
semantic-release-bot Nov 9, 2026
703e18d
Merge upstream/main (95 commits) into the fork
notquiteog Nov 9, 2026
f7aed25
Merge remote-tracking branch 'origin/main'
notquiteog Nov 9, 2026
dd8465f
chore(release): 2.3.1 [skip ci] [skip release]
semantic-release-bot Nov 9, 2026
614f552
feat: the two lock sites say why they had to take it
notquiteog Nov 9, 2026
cfe8adb
Merge remote-tracking branch 'upstream/main'
notquiteog Nov 9, 2026
4b6c133
Merge remote-tracking branch 'origin/main'
notquiteog Nov 9, 2026
4fa79c7
chore(release): 2.4.0 [skip ci] [skip release]
semantic-release-bot Nov 9, 2026
d72441a
fix: a Windows build could ask for DLSS and then fail to link
notquiteog Nov 9, 2026
2401f3f
Merge remote-tracking branch 'origin/main'
notquiteog Nov 9, 2026
7eda1d9
chore(release): 2.4.1 [skip ci] [skip release]
semantic-release-bot Nov 9, 2026
afc4496
docs: parallel replay loses at every setting, and not because of the …
notquiteog Nov 9, 2026
c9f95ec
Merge remote-tracking branch 'origin/main'
notquiteog Nov 9, 2026
2c67808
ci: build the DLSS half on both platforms, and upload none of it
notquiteog Nov 9, 2026
97df99d
Merge remote-tracking branch 'upstream/main'
notquiteog Nov 9, 2026
61d7d4a
feat: the upscaler and frame generation follow the menu while you play
notquiteog Nov 9, 2026
e4f1ebf
ci: releases are built with DLSS support compiled in
notquiteog Nov 9, 2026
e14b789
chore(release): 2.5.0 [skip ci] [skip release]
semantic-release-bot Nov 9, 2026
49c4044
Merge remote-tracking branch 'upstream/main'
notquiteog Nov 9, 2026
4c633e8
Merge remote-tracking branch 'origin/main'
notquiteog Nov 9, 2026
2851bc6
feat(vk): DLSS 5 neural rendering, with the model's own settings in t…
notquiteog Nov 9, 2026
ea16253
Merge remote-tracking branch 'upstream/main'
notquiteog Nov 9, 2026
1ba2ede
test(build): the object key depends on the Streamline SDK flag too
notquiteog Nov 9, 2026
c278ce7
chore(release): 2.6.0 [skip ci] [skip release]
semantic-release-bot Nov 9, 2026
2717287
chore: ignore the release tooling's node_modules and the Streamline h…
notquiteog Nov 9, 2026
70b7d25
fix(build): a Windows build linked the ARM64 NGX library, not the x64…
notquiteog Nov 9, 2026
3365a44
chore(release): 2.6.1 [skip ci] [skip release]
semantic-release-bot Nov 9, 2026
6844a68
docs(readme): the frame generation runtime, and say what a build comp…
notquiteog Nov 9, 2026
114e917
fix(build): NGX asks for Microsoft's C++ runtime, which llvm-mingw ha…
notquiteog Nov 9, 2026
0d9ee8c
chore(release): 2.6.2 [skip ci] [skip release]
semantic-release-bot Nov 9, 2026
dd3e61e
fix(vk): tag the uplift colour pair as whole resources, as the shippi…
notquiteog Nov 9, 2026
1004f37
fix(build): the feature announcement swallowed the whole Vulkan build
notquiteog Nov 9, 2026
35a6ac0
chore(release): 2.6.3 [skip ci] [skip release]
semantic-release-bot Nov 9, 2026
7fb5b5d
test(menu): the output-resolution fixture was missing an extern it reads
notquiteog Nov 9, 2026
d00159a
fix(build): the twelve MSVC runtime symbols NGX asks of an llvm-mingw…
notquiteog Nov 9, 2026
0b136d3
chore(release): 2.6.4 [skip ci] [skip release]
semantic-release-bot Nov 9, 2026
c2c59b2
Merge remote-tracking branch 'upstream/main'
notquiteog Nov 9, 2026
c8cf292
Merge remote-tracking branch 'origin/main'
notquiteog Nov 9, 2026
258653b
Merge remote-tracking branch 'upstream/main'
notquiteog Nov 9, 2026
65003cc
feat(vk): AMD FSR 4 upscaling and frame generation through AMD's runtime
notquiteog Nov 9, 2026
60f1d2e
feat(vk): say why DLSS 5 neural rendering is refused, and the RTX 20-…
notquiteog Nov 9, 2026
0fa18bd
fix(release): the Windows release installs the renderer CI built, wit…
notquiteog Nov 9, 2026
2b58d30
docs(readme): the Upscaler's four, the frame generation chain, and NR…
notquiteog Nov 9, 2026
47c1964
chore(release): 2.7.0 [skip ci] [skip release]
semantic-release-bot Nov 9, 2026
6e00743
build(vk): vendor OpenDLSS-NR's host, kernels and PTX generators
notquiteog Nov 9, 2026
aeddbac
Merge remote-tracking branch 'upstream/main'
notquiteog Nov 9, 2026
ca639de
ci(windows): pin NVIDIA Streamline's headers to a commit, not a tag
notquiteog Nov 9, 2026
7784399
feat(vk): DLSS 5 neural rendering through NGX directly, beside Stream…
notquiteog Nov 9, 2026
6cdc49a
docs: DLSS 5 neural rendering's NGX direct backend, where NGX looks, …
notquiteog Nov 9, 2026
846f0d4
Merge branch 'feat/nr-ngx-direct'
notquiteog Nov 9, 2026
2c19b63
fix(vk): DLSS frame generation sets NGX's parameters through its C fu…
notquiteog Nov 9, 2026
4e492ce
chore(release): 2.8.0 [skip ci] [skip release]
semantic-release-bot Nov 9, 2026
c4f7d84
feat(vk): choose the frame generation method in the Insert menu
notquiteog Nov 9, 2026
3dd6519
chore(release): 2.9.0 [skip ci] [skip release]
semantic-release-bot Nov 9, 2026
6fd4364
fix(release): the setup, the Builder and the game update from the rep…
notquiteog Nov 9, 2026
dfa6315
build(vk): OpenDLSS-NR's kernels, the frame's two passes and a Vulkan…
notquiteog Nov 9, 2026
9f91c1b
Merge remote-tracking branch 'upstream/main'
notquiteog Nov 9, 2026
d495994
fix(release): the fork's releases follow upstream's v2.0.x line
notquiteog Nov 9, 2026
4e6625d
chore(release): 2.0.12 [skip ci] [skip release]
semantic-release-bot Nov 9, 2026
4c1e3d1
test(vk): a correctness harness for OpenDLSS-NR on this GPU, on synth…
notquiteog Nov 9, 2026
1da7eff
feat(vk): open neural rendering, the DLSS 5 NR network run by OpenDLS…
notquiteog Nov 9, 2026
2a3c6d9
docs(vk): the open neural rendering backend, what was measured and wh…
notquiteog Nov 9, 2026
ab375e0
Merge branch 'feat/nr-open': OpenDLSS-NR, the Neural tab's fourth bac…
notquiteog Nov 9, 2026
f7d1f6a
docs(readme): the Neural tab's Open backend, and the model folder it …
notquiteog Nov 9, 2026
65f8a3b
chore(release): 2.0.13 [skip ci] [skip release]
semantic-release-bot Nov 9, 2026
1b80745
feat(vk): the open backend's khr kernels, OpenDLSS-NR on VK_KHR_coope…
notquiteog Nov 10, 2026
5b95083
feat(vk): the open backend runs the khr route where upstream's NVIDIA…
notquiteog Nov 10, 2026
def8a20
test(vk): the open NR harness checks the khr route, on NVIDIA and on …
notquiteog Nov 10, 2026
58ed3bd
fix(vk): AMD's FSR runtime is asked at the start, guarded, never from…
notquiteog Nov 10, 2026
c719d8c
fix(vk): FSR 3.1 frame interpolation makes 2x sets only
notquiteog Nov 10, 2026
6da545d
chore(release): 2.0.14 [skip ci] [skip release]
semantic-release-bot Nov 10, 2026
42a2c3f
Merge branch 'feat/nr-amd'
notquiteog Nov 10, 2026
5b635f4
chore(release): 2.0.15 [skip ci] [skip release]
semantic-release-bot Nov 10, 2026
a67c706
Merge remote-tracking branch 'upstream/main'
notquiteog Nov 10, 2026
e95aed2
chore(release): 2.0.16 [skip ci] [skip release]
semantic-release-bot Nov 10, 2026
366c268
fix(vk): FSR 3.1 and FSR 4 take the scene's real camera, depth and co…
notquiteog Nov 10, 2026
4ec24ef
Merge branch 'fix/fsr-onto-pr'
notquiteog Nov 10, 2026
235144d
Merge remote-tracking branch 'origin/main'
notquiteog Nov 10, 2026
0dc657b
chore(release): 2.0.17 [skip ci] [skip release]
semantic-release-bot Nov 10, 2026
ea6141a
fix(update): the default repository outside the Windows-only block
notquiteog Nov 10, 2026
3f92087
chore(release): 2.0.18 [skip ci] [skip release]
semantic-release-bot Nov 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .github/workflows/linux-appimage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -84,9 +84,19 @@ jobs:
{ echo "the profile did not download: built without it"; exit 0; }
ls -la work work/image

# (the back end this AppImage carries is built with DLSS compiled in: NVIDIA's SDK fetched here by scripts/ngx_sdk.py
# (headers and libnvsdk_ngx.a, under NVIDIA's license), never committed. The DLSS *runtime*
# (libnvidia-ngx-dlss.so) is NVIDIA's to ship and is still not included -- a player who wants DLSS puts it in the
# game's ngx folder, and readme.md says so. Without this the released build offers FSR and nothing else.)
- name: NVIDIA's DLSS SDK (headers and libnvsdk_ngx.a)
run: python3 -I scripts/ngx_sdk.py --platform linux --build-only --accept-nvidia-license "$RUNNER_TEMP/ngx-sdk"

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here for the AppImage: --accept-nvidia-license in CI makes every release accept NVIDIA's licence. Please drop it from the feature split.


- name: AppImage
env:
HOOKSHOT_NGX_SDK: ${{ runner.temp }}/ngx-sdk
run: scripts/linux/appimage.sh


- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: Hookshot-linux-x86_64
Expand Down
6 changes: 5 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,12 @@ jobs:
# RELEASE_TOKEN is a fine-grained personal access token with contents: write. It is preferred over GITHUB_TOKEN
# because a tag pushed by GITHUB_TOKEN does not start the workflows that publish the release.
# Without the secret, run them by hand and attach their artifacts.
# --repository-url is the repository this run belongs to, not the one package.json names. On the upstream
# repository the two are the same string and this changes nothing; on a fork they are not, and without it
# semantic-release compares the fork's main against *upstream's*, decides it is "behind the remote one", and
# publishes nothing while still reporting success. A fork releases its own work.
- name: semantic-release
if: steps.first.outputs.released == 'true'
env:
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN || secrets.GITHUB_TOKEN }}
run: npx semantic-release
run: npx semantic-release --repository-url "${{ github.server_url }}/${{ github.repository }}.git"
2 changes: 1 addition & 1 deletion .github/workflows/source-regressions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ jobs:
run: python -m pip install --disable-pip-version-check --no-deps zstandard==0.25.0
- name: Compilers and the SPIR-V validator
if: runner.os == 'Linux'
run: sudo apt-get update && sudo apt-get install -y g++ clang spirv-tools
run: sudo apt-get update && sudo apt-get install -y g++ clang spirv-tools glslang-tools

# (the steps below all run when one before them failed, so one run shows every failure)
- name: Check Windows native source regressions
Expand Down
55 changes: 52 additions & 3 deletions .github/workflows/windows-builder.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ jobs:
name: Hookshot Builder package and setup
# (builder-parts holds the installer's parts: no package there)
if: github.ref_name != 'builder-parts'
# (hookshot) the package carries the renderer the vulkan job built (tools/prebuilt), so it waits for it
needs: vulkan
runs-on: windows-2022
timeout-minutes: 30
steps:
Expand Down Expand Up @@ -99,7 +101,7 @@ jobs:
working-directory: builder/setup
run: |
"$LLVM_MINGW/bin/x86_64-w64-mingw32-windres" setup.rc -O coff -o "$RUNNER_TEMP/setup_rc.o"
"$LLVM_MINGW/bin/x86_64-w64-mingw32-clang" -O2 -mwindows -municode setup.c "$RUNNER_TEMP/setup_rc.o" \
"$LLVM_MINGW/bin/x86_64-w64-mingw32-clang" -O2 -mwindows -municode -DHOOKSHOT_REPOSITORY="\"$GITHUB_REPOSITORY\"" setup.c "$RUNNER_TEMP/setup_rc.o" \
-lwinhttp -lbcrypt -lcomctl32 -lshell32 -lole32 -Wl,--dependent-load-flag=0x800 \
-o "$RUNNER_TEMP/HookshotBuilder-Setup.exe"
ls -l "$RUNNER_TEMP/HookshotBuilder-Setup.exe"
Expand All @@ -109,10 +111,35 @@ jobs:
dotnet publish builder/HookshotBuilder/HookshotBuilder.csproj --configuration Release
-p:Version="$VERSION" -p:NuGetAudit=false --output "$RUNNER_TEMP/publish"

# (hookshot) the renderer built with NVIDIA DLSS, DLSS 5 neural rendering and AMD FSR 4 compiled in
- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: hookshot_vk-windows
path: ${{ runner.temp }}/vk
# (hookshot) AMD's FSR runtime: the loader, the upscaler and frame generation, signed by AMD and MIT-licensed in
# FSR SDK 2.4 (its docs/license.md lists Kits/FidelityFX/signedbin under MIT). gpu/vk/vk_ffx.cpp loads it from
# beside the game; nx2/make_game.py puts it there
- name: AMD's FSR runtime (FSR SDK v2.4.0)
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: GPUOpen-LibrariesAndSDKs/FidelityFX-SDK
ref: 7539ae8b6568ad29ed78a753404351daf3b5cca7 # v2.4.0
path: _amd
persist-credentials: false
sparse-checkout: |
Kits/FidelityFX/signedbin
sparse-checkout-cone-mode: true
- name: AMD's FSR runtime, with its notice
run: |
mkdir -p "$RUNNER_TEMP/amd-fsr"
cp _amd/Kits/FidelityFX/signedbin/amd_fidelityfx_*_vk.dll "$RUNNER_TEMP/amd-fsr/"
cp third_party/ffx-api/LICENSE.txt "$RUNNER_TEMP/amd-fsr/LICENSE.txt"
ls -l "$RUNNER_TEMP/amd-fsr"
- name: Package folder
run: >-
python -I scripts/release_parts.py package "$RUNNER_TEMP/package"
--publish "$RUNNER_TEMP/publish" --setup "$RUNNER_TEMP/HookshotBuilder-Setup.exe" ${PREVIOUS:+--list "$PREVIOUS"}
--vk "$RUNNER_TEMP/vk/hookshot_vk.dll" --amd-fsr "$RUNNER_TEMP/amd-fsr" --repository "$GITHUB_REPOSITORY"

- name: Setup parts
run: |
Expand Down Expand Up @@ -177,14 +204,36 @@ jobs:
- name: llvm-mingw
run: echo "HOOKSHOT_MINGW=$(python -I scripts/release_parts.py llvm-mingw "$RUNNER_TEMP/llvm")" >> "$GITHUB_ENV"
# (as scripts/linux/appimage.sh builds Linux's: the back end alone, no lift, no game)
# (hookshot) built with NVIDIA DLSS compiled in, as vulkan-dlss.yml builds it: NVIDIA's SDK fetched here by
# scripts/ngx_sdk.py (headers and the static library, under NVIDIA's license), never committed. NVIDIA's runtime
# (nvngx_dlss.dll) is theirs to ship and is not included -- readme.md tells a player where to put it. This DLL is
# what the release's Builder installs (nx2/make_game.py prebuilt_renderer): a renderer compiled on the player's
# PC has none of NVIDIA's SDKs, and the Insert menu then offers none of DLSS, its frame generation or NR.
- name: NVIDIA's DLSS SDK (headers and nvsdk_ngx_s.lib)
run: python -I scripts/ngx_sdk.py --platform windows --build-only --accept-nvidia-license "$RUNNER_TEMP/ngx-sdk"

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This accepts NVIDIA's DLSS licence on every release build and links NGX into the shipped hookshot_vk.dll. Main's model is that each player accepts it in the Builder, and changing that is the maintainer's call, so please leave it out of the feature PRs.

# (DLSS 5 neural rendering: only NVIDIA Streamline's MIT-licensed headers, fetched here and never
# committed, found at the tree root by nx2/build.py streamline_sdk_path. Nothing is linked from it --
# sl.interposer.dll and the sl.* plugins are the player's own files, loaded at run time. v2.14.1 is the
# first public tag that carries kFeatureDLSS_NR at all, so this tag is a floor, not a preference.)
- name: Check out NVIDIA Streamline's headers (DLSS 5 neural rendering)
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: NVIDIA-RTX/Streamline
ref: 625db07d4bca5abc67d781c42af7e7fb0761f1b6 # v2.14.16
path: streamline-sdk
- name: hookshot_vk.dll
env:
RX_VK_ONLY: '1'
RX_RELEASE: '1'
run: |
OOT_WORK="$RUNNER_TEMP/vk-work" RX_CPM="$GITHUB_WORKSPACE/_deps/cpm" \
python -I nx2/build.py --standalone --jobs "$NUMBER_OF_PROCESSORS"
OOT_WORK="$RUNNER_TEMP/vk-work" RX_CPM="$GITHUB_WORKSPACE/_deps/cpm" HOOKSHOT_NGX_SDK="$RUNNER_TEMP/ngx-sdk" \
python -I nx2/build.py --standalone --jobs "$NUMBER_OF_PROCESSORS" | tee "$RUNNER_TEMP/vk-build.log"
test "${PIPESTATUS[0]}" -eq 0
ls -l "$RUNNER_TEMP/vk-work/sa/build/hookshot_vk.dll"
# (a release must carry what it says: a renderer without DLSS or neural rendering compiled in fails here,
# not on a player's PC as rows missing from the Insert menu)
grep -q "vk: DLSS (NGX): compiled in" "$RUNNER_TEMP/vk-build.log"
grep -q "vk: DLSS 5 neural rendering (Streamline): compiled in" "$RUNNER_TEMP/vk-build.log"
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: hookshot_vk-windows
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,9 @@ __pycache__/
build-linux/
*.so

# NVIDIA's DLSS SDK, fetched at build time and never committed (docs/upscaling.md)
/streamline-sdk/
# the release tooling's packages (package.json is release-only; npm install makes this)
/node_modules/
# ---- NVIDIA's DLSS SDK (scripts/ngx_sdk.py): NVIDIA's files, never committed ----
ngx-sdk/
20 changes: 19 additions & 1 deletion .releaserc.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,25 @@
[
"@semantic-release/commit-analyzer",
{
"preset": "conventionalcommits"
"preset": "conventionalcommits",
"releaseRules": [
{
"breaking": true,
"release": "major"
},
{
"type": "feat",
"release": "patch"
},
{
"type": "fix",
"release": "patch"
},
{
"type": "perf",
"release": "patch"
}
]
}
],
[
Expand Down
2 changes: 1 addition & 1 deletion builder/HookshotBuilder/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1115,7 +1115,7 @@ void Repair(object sender, RoutedEventArgs e)
Application.Current.Shutdown();
return;
}
Process.Start(new ProcessStartInfo("https://github.com/NotRexed/Hookshot/releases/latest") { UseShellExecute = true });
Process.Start(new ProcessStartInfo("https://github.com/" + Repository.Name + "/releases/latest") { UseShellExecute = true });
}

// ================= the update (Updater.cs): the game started this app with --update <folder> =================
Expand Down
28 changes: 28 additions & 0 deletions builder/HookshotBuilder/Repository.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using System;
using System.IO;
using System.Text.RegularExpressions;

/// (hookshot) The GitHub repository releases come from, as owner/name: tools/repository.txt, written when the release is
/// packaged from the repository its CI ran in (scripts/release_parts.py package), else NotRexed/Hookshot. A fork's Builder
/// then updates from the fork. nx2/version.py repository() is the same rule for the game's own update check.
static class Repository
{
const string Default = "NotRexed/Hookshot";
static readonly Lazy<string> name = new(Read);
public static string Name => name.Value;

static string Read()
{
try
{
var path = Path.Combine(AppContext.BaseDirectory, "tools", "repository.txt");
if (File.Exists(path))
{
var line = File.ReadAllText(path).Trim();
if (Regex.IsMatch(line, "^[A-Za-z0-9-]+/[A-Za-z0-9._-]+$")) return line;
}
}
catch (Exception) { } // (an unreadable file is the default, not a failed update check)
return Default;
}
}
4 changes: 2 additions & 2 deletions builder/HookshotBuilder/Updater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ namespace HookshotBuilder;
/// folder keeps).
static class Updater
{
const string Latest = "https://api.github.com/repos/NotRexed/Hookshot/releases/latest";
static string Latest => "https://api.github.com/repos/" + Repository.Name + "/releases/latest";
const string Asset = "HookshotBuilder.zip";
const string SetupAsset = "HookshotBuilder.exe"; // (the setup, builder/setup/setup.c: a release holds it and its list)
const string SetupList = "hookshot-setup.txt"; // (scripts/make_setup_parts.py)
Expand Down Expand Up @@ -62,7 +62,7 @@ public static void FromCommandLine(MainWindow w)
{
try
{
var list = await http.GetStringAsync("https://github.com/NotRexed/Hookshot/releases/latest/download/" + SetupList);
var list = await http.GetStringAsync("https://github.com/" + Repository.Name + "/releases/latest/download/" + SetupList);
foreach (var line in list.Split('\n'))
if (line.StartsWith("tag ")) return line[4..].Trim();
}
Expand Down
22 changes: 20 additions & 2 deletions builder/linux/linux_update.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,26 @@
import zipfile

LIST_NAME = "hookshot-linux.txt"
LATEST_LIST = "https://github.com/NotRexed/Hookshot/releases/latest/download/" + LIST_NAME
LATEST_API = "https://api.github.com/repos/NotRexed/Hookshot/releases/latest"


def _repository():
"""(hookshot) owner/name of the repository releases come from: repository.txt in the AppImage's tools (written by
scripts/linux/appimage.sh from the repository its CI ran in), else NotRexed/Hookshot. nx2/version.py's rule"""
import re
here = os.environ.get("HOOKSHOT_TOOLS") or os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..")
try:
with open(os.path.join(here, "repository.txt"), encoding="utf-8") as f:
name = f.readline().strip()
if re.fullmatch(r"[A-Za-z0-9-]+/[A-Za-z0-9._-]+", name):
return name
except OSError:
pass
return "NotRexed/Hookshot"


REPOSITORY = _repository()
LATEST_LIST = "https://github.com/%s/releases/latest/download/%s" % (REPOSITORY, LIST_NAME)
LATEST_API = "https://api.github.com/repos/%s/releases/latest" % REPOSITORY


class Part(object):
Expand Down
13 changes: 10 additions & 3 deletions builder/setup/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -442,14 +442,21 @@ static void wanted_tag(char *out, size_t n) {
/* (an update to a named release reads THAT release's list: the latest/download link can answer with the release before it for a
while after a publish, and the setup then installed the old version again and started it with --fetched, which builds without
checking: players pressed Update and stayed on v2.0.3, 2026-11-08) */
/* (hookshot) the repository the setup installs from, owner/name: given by CI (.github/workflows/windows-builder.yml) from the
repository it builds in, so a fork's setup installs the fork's release */
#ifndef HOOKSHOT_REPOSITORY
#define HOOKSHOT_REPOSITORY "NotRexed/Hookshot"
#endif
#define HOOKSHOT_WIDEN2(s) L##s
#define HOOKSHOT_WIDEN(s) HOOKSHOT_WIDEN2(s)
static const char *manifest_url(void) {
static char u[1024];
const char *e = getenv("HOOKSHOT_SETUP_LIST");
char tag[128];
wanted_tag(tag, sizeof tag);
if (e && *e) snprintf(u, sizeof u, "%s", e);
else if (tag[0]) snprintf(u, sizeof u, "https://github.com/NotRexed/Hookshot/releases/download/%s/hookshot-setup.txt", tag);
else snprintf(u, sizeof u, "%s", "https://github.com/NotRexed/Hookshot/releases/latest/download/hookshot-setup.txt");
else if (tag[0]) snprintf(u, sizeof u, "https://github.com/" HOOKSHOT_REPOSITORY "/releases/download/%s/hookshot-setup.txt", tag);
else snprintf(u, sizeof u, "%s", "https://github.com/" HOOKSHOT_REPOSITORY "/releases/latest/download/hookshot-setup.txt");
return u;
}

Expand Down Expand Up @@ -506,7 +513,7 @@ static DWORD WINAPI work(LPVOID unused) {
if (!ok)
fail(g_http_status == 404
? L"The latest Hookshot release has no setup files yet. Download HookshotBuilder.zip from the releases page for now: "
L"https://github.com/NotRexed/Hookshot/releases/latest"
L"https://github.com/" HOOKSHOT_WIDEN(HOOKSHOT_REPOSITORY) L"/releases/latest"
: g_http_status ? L"GitHub's download servers are failing right now (an error 500 or above, tried 8 times over 3 minutes). "
L"This is on GitHub's side: try again in a few minutes, or later today."
: L"Could not reach GitHub to get the Hookshot Builder. Check your internet connection and try again.");
Expand Down
Loading