[CmdletBinding()] param( [string]$PackageRoot, [string]$DiagnosticRoot, [string]$OptiScalerRoot, [string]$ZludaRoot, [string]$HipRoot, [string]$KernelKRoot, [string]$KernelMRoot ) $ErrorActionPreference = 'Stop' $repo = [IO.Path]::GetFullPath((Join-Path $PSScriptRoot '../..')) $defaults = @{PackageRoot='dist/windows-rdna4-game'; DiagnosticRoot='dist/windows-rdna4-command-list'; OptiScalerRoot='dist/optiscaler-windows-d4r'; ZludaRoot='dist/zluda-windows-f16-reference'; HipRoot='.tools/therock-10.2.0a20260929/_rocm_sdk_core'; KernelKRoot='build/native-k-gfx1201'; KernelMRoot='build/native-m-gfx1201'} foreach ($name in $defaults.Keys) { if (!(Get-Variable -Name $name -ValueOnly)) { Set-Variable -Name $name -Value (Join-Path $repo $defaults[$name]) } } $PackageRoot = [IO.Path]::GetFullPath($PackageRoot) New-Item -ItemType Directory -Force $PackageRoot | Out-Null $stagedFiles = [Collections.Generic.List[string]]::new() function Stage([string]$source, [string]$relative) { if (!(Test-Path -LiteralPath $source -PathType Leaf)) { throw "Required file missing: $source" } $destination = Join-Path $PackageRoot $relative New-Item -ItemType Directory -Force (Split-Path $destination) | Out-Null Copy-Item -LiteralPath $source -Destination $destination -Force $stagedFiles.Add($relative) } Stage (Join-Path $OptiScalerRoot 'OptiScaler.dll') 'OptiScaler.dll' Stage (Join-Path $DiagnosticRoot 'bin/d4r_nvngx.dll') 'd4r/_nvngx.dll' Stage (Join-Path $DiagnosticRoot 'bin/pixel_convert_gfx1201.hsaco') 'd4r/pixel_convert_gfx1201.hsaco' Stage (Join-Path $DiagnosticRoot 'nvapi-compat/nvapi64.dll') 'd4r/nvapi/nvapi64.dll' Stage (Join-Path $DiagnosticRoot 'bin/d4r_debug_launcher.exe') 'd4r/d4r_debug_launcher.exe' foreach ($file in @('nvcuda.dll','nvapi64.dll','libc++.dll','libunwind.dll')) { Stage (Join-Path $ZludaRoot $file) "d4r/zluda/$file" } foreach ($file in @('amdhip64_7.dll','amd_comgr.dll','hiprtc0717.dll','hiprtc-builtins0717.dll','rocm_kpack.dll','AMD.ROCM.Comgr.MANIFEST','.hipVersion')) { Stage (Join-Path $HipRoot "bin/$file") "d4r/hip/bin/$file" } $entries = @{} foreach ($directory in @($KernelKRoot, $KernelMRoot)) { foreach ($line in Get-Content -LiteralPath (Join-Path $directory 'd4r-kernels.txt')) { if (!$line.Trim() -or $line.StartsWith('#')) { continue } if ($line -notmatch '^([A-Za-z0-9_]+) ([0-9a-f]{16})$') { throw "Invalid native manifest entry: $line" } if ($entries.ContainsKey($Matches[1])) { throw "Duplicate native kernel: $($Matches[1])" } $entries[$Matches[1]] = $line Stage (Join-Path $directory ($Matches[1] + '.hsaco')) ('d4r/native/' + $Matches[1] + '.hsaco') } } if ($entries.Count -ne 16) { throw "Expected 11 K and 5 M native objects; found $($entries.Count)" } @('# Audited DLSS 310.9.1: K + M gfx1201 native kernels', '# Generated by package-windows-game.ps1') + @($entries.Values | Sort-Object) | Set-Content -LiteralPath (Join-Path $PackageRoot 'd4r/native/d4r-kernels.txt') -Encoding ASCII $stagedFiles.Add('d4r/native/d4r-kernels.txt') Stage (Join-Path $repo 'scripts/windows/windows-game.ps1') 'windows-game.ps1' Stage (Join-Path $repo 'scripts/windows/capture-game-window.ps1') 'capture-game-window.ps1' Stage (Join-Path $repo 'scripts/windows/send-game-key.ps1') 'send-game-key.ps1' Stage (Join-Path $repo 'docs/windows-game.md') 'README.md' Stage (Join-Path $repo 'docs/windows-performance.md') 'windows-performance.md' Stage (Join-Path $repo 'LICENSE') 'licenses/d4r.txt' Stage (Join-Path $OptiScalerRoot 'GPL-3.0.txt') 'licenses/OptiScaler.txt' Stage (Join-Path $repo 'external/ZLUDA/LICENSE-MIT') 'licenses/ZLUDA-MIT.txt' Stage (Join-Path $repo 'external/ZLUDA/LICENSE-APACHE') 'licenses/ZLUDA-APACHE.txt' Stage (Join-Path $repo 'external/ZLUDA/ext/llvm-project/LICENSE.TXT') 'licenses/LLVM.txt' Stage (Join-Path $repo 'external/MinHook/LICENSE.txt') 'licenses/MinHook.txt' Stage (Join-Path $HipRoot 'share/doc/amd_comgr/LICENSE.txt') 'licenses/amd_comgr.txt' Stage (Join-Path $repo 'external/clr/LICENSE.md') 'licenses/HIP-CLR.txt' foreach ($patch in Get-ChildItem -LiteralPath (Join-Path $repo 'patches/optiscaler') -Filter '*.patch') { Stage $patch.FullName ('source-patches/optiscaler/' + $patch.Name) } foreach ($patch in Get-ChildItem -LiteralPath (Join-Path $repo 'patches/zluda') -Filter '*.patch') { Stage $patch.FullName ('source-patches/zluda/' + $patch.Name) } $metadata = [ordered]@{ architecture='gfx1201'; nativeKernels=16; dlssSha256='3975567b8943c53acce397f2b72380092f84f162d00b0d2c7d08a1025c563983'; d4rCommit=(& git -C $repo rev-parse HEAD).Trim(); d4rWorkingTreeDirty=[bool](& git -C $repo status --porcelain); optiScaler=(Get-Content -LiteralPath (Join-Path $OptiScalerRoot 'build-info.json') -Raw | ConvertFrom-Json); zludaBuild=(Get-Content -LiteralPath (Join-Path $ZludaRoot 'build-info.json') -Raw | ConvertFrom-Json); hipRuntime='TheRock 10.2.0a20260929 / HIP 7.17.26386'; files=@($stagedFiles | ForEach-Object { Get-Item -LiteralPath (Join-Path $PackageRoot $_) } | ForEach-Object { @{path=$_.FullName.Substring($PackageRoot.Length+1); sha256=(Get-FileHash -LiteralPath $_.FullName -Algorithm SHA256).Hash; version=$_.VersionInfo.FileVersion} }) } $metadata | ConvertTo-Json -Depth 10 | Set-Content -LiteralPath (Join-Path $PackageRoot 'package.json') -Encoding UTF8 if (Get-ChildItem -LiteralPath $PackageRoot -Recurse -File | Where-Object { $_.Name -eq 'nvngx_dlss.dll' -or ($_.Name -eq '_nvngx.dll' -and $_.DirectoryName -ne (Join-Path $PackageRoot 'd4r')) }) { throw 'Proprietary NVIDIA binaries must not be in the package.' } Write-Host "Windows game development package: $PackageRoot (NVIDIA DLLs excluded)"