build(windows): add arm64 support - #3905

Merged
ReenigneArcher merged 15 commits into
LizardByte:masterfrom
rbqvq:master
Feb 8, 2026
Merged

build(windows): add arm64 support#3905
ReenigneArcher merged 15 commits into
LizardByte:masterfrom
rbqvq:master

Conversation

@rbqvq

@rbqvqrbqvq commented May 25, 2025

Copy link
Copy Markdown
Contributor

Description

This PR adds an arm64 build for Windows.

Issues Fixed or Closed

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Dependency update (updates to dependencies)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files, e.g. .github/...)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

@rbqvq

This comment was marked as resolved.

Comment threaddocs/getting_started.md Outdated
Comment threadsrc/config.cpp
Comment threadsrc/platform/windows/audio.cpp
Comment threaddocs/building.md Outdated
Comment threaddocs/building.md Outdated
Comment threadcmake/dependencies/windows.cmake Outdated
Comment thread.github/workflows/CI.yml Outdated
Comment threaddocs/getting_started.md Outdated
@rbqvq

rbqvq commented Jun 2, 2025

Copy link
Copy Markdown
ContributorAuthor

Can we use this hardware encode? 🤔
obsproject/obs-studio#11993

@ReenigneArcher

Copy link
Copy Markdown
Member

I think MF encoder is already included with the FFmpeg build, so why not?

@rbqvq

rbqvq commented Jun 2, 2025

Copy link
Copy Markdown
ContributorAuthor

I think MF encoder is already included with the FFmpeg build, so why not?

Well, I didn't read the source code of sunshine.
This part is up to you. 🤪

@rbqvq

This comment was marked as resolved.

@ReenigneArcher

This comment was marked as resolved.

cgutman
cgutman previously requested changes Jul 5, 2025
Comment threadsrc/platform/windows/display_base.cpp Outdated
@sonarqubecloud

Copy link
Copy Markdown

@ReenigneArcherReenigneArcher mentioned this pull request Aug 22, 2025
15 tasks
@LizardByte-bot

This comment was marked as outdated.

@rbqvq

This comment was marked as outdated.

@ReenigneArcher

This comment was marked as resolved.

@LizardByte-bot

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@ReenigneArcherReenigneArcher added this to the windows-arm milestone Jan 20, 2026
@codecov

codecovBot commented Jan 21, 2026

Copy link
Copy Markdown

Bundle Report

Bundle size has no change ✅

Comment threadcmake/prep/options.cmake Outdated
@ReenigneArcher

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@rbqvq
rbqvq marked this pull request as ready for review February 3, 2026 20:15
@rbqvq

rbqvq commented Feb 3, 2026

Copy link
Copy Markdown
ContributorAuthor

All thing done.

Pre-built portable can find at https://github.com/rbqvq/Sunshine/actions/runs/21646290004

Thanks all people who works on #3905 and #4521

Delete the `#warning` emitted for non-x64 architectures in src/platform/windows/audio.cpp.
Update cmake/compile_definitions/windows.cmake to suppress specific GCC warnings when building for Windows ARM64.
Add flags to SUNSHINE_COMPILE_OPTIONS for CMAKE_SYSTEM_PROCESSOR=ARM64 to silence warnings.
- `-Wno-dll-attribute-on-redeclaration` for Boost
- `-Wno-unknown-warning-option` for ViGEmClient
- `-Wno-unused-variable` for Boost
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Replace variable-length arrays with std::vector in src/platform/windows/input.cpp and src/platform/windows/misc.cpp for safety and portability.
Add <vector> includes, allocate wide-character buffer with std::vector<WCHAR> and pass wide.data() to MultiByteToWideChar, and replace WSABUF VLA with std::vector<WSABUF> and use .data() for msg.lpBuffers.
These changes avoid non-standard VLAs and reduce stack-allocation risks.
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Drop the HMODULE dll = nullptr; declaration from src/nvenc/nvenc_d3d11_on_cuda.h.
This removes an unused module handle field from the nvenc D3D11-on-CUDA wrapper to reduce unnecessary state.
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
@rbqvq

This comment was marked as resolved.

@ReenigneArcher

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

rbqvqand others added 2 commits February 7, 2026 22:09
Add CI build for Windows ARM64.
Signed-off-by: Coia Prant <coiaprant@gmail.com>
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Add windows arm64 documents.
Signed-off-by: Coia Prant <coiaprant@gmail.com>
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
@ReenigneArcher

Copy link
Copy Markdown
Member

Thank you. Please no more force pushing.

@rbqvq

rbqvq commented Feb 7, 2026

Copy link
Copy Markdown
ContributorAuthor

Thanks, I went back to sleep.
Leave the rest to you.

Insert a 'Debug nsis' step into .github/workflows/ci-windows.yml that always runs and prints the NSISOutput.log using the msys2 shell. This captures NSIS installer build logs for troubleshooting; the step uses '|| true' to avoid failing the job. The step is placed before the existing 'Debug wix' step.
Make NSIS detailed logging conditional on the target architecture by adding NSIS_LOGSET_COMMAND (set to "LogSet on" only when CMAKE_SYSTEM_PROCESSOR matches AMD64) and using it in CPACK_NSIS_EXTRA_INSTALL_COMMANDS and CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS instead of always calling LogSet. Update docs/getting_started.md to note that the install.log under %PROGRAMFILES% is available on AMD64 only.
@sonarqubecloud

Copy link
Copy Markdown

@ReenigneArcher
ReenigneArcher merged commit d591643 into LizardByte:masterFeb 8, 2026
41 of 42 checks passed
@codecov

codecovBot commented Feb 8, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 16.66667% with 15 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (master@cdc4443). Learn more about missing BASE report.
⚠️ Report is 208 commits behind head on master.

Files with missing linesPatch %Lines
src/video.cpp37.50%3 Missing and 2 partials ⚠️
src/config.cpp0.00%4 Missing ⚠️
src/platform/windows/display_vram.cpp0.00%1 Missing and 1 partial ⚠️
src/platform/windows/input.cpp0.00%2 Missing ⚠️
src/platform/windows/misc.cpp0.00%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## master #3905 +/- ##
=========================================
Coverage ? 14.11% =========================================
Files ? 95 Lines ? 19859 Branches ? 9189 =========================================
Hits ? 2804 Misses ? 13523 Partials ? 3532 
FlagCoverage Δ
Archlinux11.19% <11.11%> (?)
FreeBSD-14.3-amd6413.23% <16.66%> (?)
Linux-AppImage11.60% <11.11%> (?)
Windows-AMD6413.48% <6.66%> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing linesCoverage Δ
src/nvenc/nvenc_d3d11_on_cuda.h0.00% <ø> (ø)
src/platform/windows/audio.cpp25.13% <ø> (ø)
src/video.h61.11% <ø> (ø)
src/platform/windows/display_vram.cpp8.93% <0.00%> (ø)
src/platform/windows/input.cpp0.63% <0.00%> (ø)
src/platform/windows/misc.cpp15.20% <0.00%> (ø)
src/config.cpp3.03% <0.00%> (ø)
src/video.cpp29.07% <37.50%> (ø)

@ReenigneArcher

Copy link
Copy Markdown
Member

@rbqvq unfortunately, now arm64 is failing in Debian/Ubuntu images.

[900](https://github.com/LizardByte/Sunshine/actions/runs/21792778237/job/62875233089#step:11:18906)
#35 7492.4 ✓ 7 modules transformed.
#35 7492.4 ✗ Build failed in 4.68s
#35 7492.4 error during build:
#35 7492.4 byte length of Uint32Array should be a multiple of 4
#35 7492.4 at new Uint32Array (<anonymous>)
#35 7492.4 at getAstBuffer (file:///build/sunshine/node_modules/rollup/dist/es/shared/parseAst.js:2073:19)
#35 7492.4 at convertProgram (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:15677:48)
#35 7492.4 at Module.setSource (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:17392:24)
#35 7492.4 at async ModuleLoader.addModuleSource (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:21474:13)
#35 7492.4 ninja: build stopped: subcommand failed.
#35 ERROR: process "/bin/bash -o pipefail -c /dev/pipes/_BUILD" did not complete successfully: exit code: 1

We don't build these for PRs because they take 3+ hours. Do you have some idea how we can conditionally use these additions to the package.json?

"@rollup/wasm-node": "4.57.1"},"overrides": {
"rollup": "npm:@rollup/wasm-node@4.57.1"

@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

I think we can provide two package.json and use script to rename them.

@ReenigneArcher

Copy link
Copy Markdown
Member

Can we have a second package.json that depends on the first one? And use second one only when we need the override? If we can reduce the duplication that would be ideal.

@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

Or we can build them on a unified CI, and the CI of each OS builder only needs to pull the static resources that have been built.

@rbqvqrbqvq mentioned this pull request Feb 8, 2026
21 tasks
@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

@ReenigneArcher It should be fix in #4687

Actions for windows build still working:
https://github.com/rbqvq/Sunshine/actions/runs/21800375818

@ReenigneArcher

Copy link
Copy Markdown
Member

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor

So the expected result should be x86/x64?

dxgi.exe is compiled by us or packed from somewhere?

@ReenigneArcher

Copy link
Copy Markdown
Member

It's compiled in our CI, from the tools directory.

Being compiled as arm64 is correct, I'm just wondering why it might be flagged for the arm64 version, but not the original version.

Not a big deal though.

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor

I think it might be website design, because most windows applications are x86/x64?

You can try other arm64 and x86/x64 exe to see if there are some clues.

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor
  • x86

EdgeUpdate.exe

Tags: peexe, signed, overlay, idle
Magic: PE32 executable (GUI) Intel 80386, for MS Windows
Target Machine: Intel 386 or later processors and compatible processors

https://www.virustotal.com/gui/file/955b5950fd92e5c5eec395b022566c9a2594ca3126d894408e2e29ba25d8b0dd/details

  • x64

bash.exe (Git For Windows)

Tags: peexe, 64bits, known-distributor, overlay, idle
Magic: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Target Machine: x64

https://www.virustotal.com/gui/file/fc362aae1f217d34d02237d99527839dd6cf85b37c7a0277109400bfa0faa594/details

  • arm64

git.exe (Git For Windows)

Tags: peexe, arm, overlay, 64bits
Magic: PE32+ executable (console) Aarch64, for MS Windows
Target Machine: ARMv8 in 64-bit mode

https://www.virustotal.com/gui/file/bede8ae74caec9ae40c20910b360f01863042b5f69aa1c09fc2946dc9a52e100/details


  • x64

dxgi-info.exe

Tags: peexe, 64bits
Magic: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Target Machine: x64

https://www.virustotal.com/gui/file/955b5950fd92e5c5eec395b022566c9a2594ca3126d894408e2e29ba25d8b0dd/details

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@rbqvq@ReenigneArcher@LizardByte-bot@cgutman@ricky8955555@Lapintam@edesonmercy123@faratech
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

build(windows): add arm64 support - #3905

Merged
ReenigneArcher merged 15 commits into
LizardByte:masterfrom
rbqvq:master
Feb 8, 2026
Merged

build(windows): add arm64 support#3905
ReenigneArcher merged 15 commits into
LizardByte:masterfrom
rbqvq:master

Conversation

@rbqvq

@rbqvqrbqvq commented May 25, 2025

Copy link
Copy Markdown
Contributor

Description

This PR adds an arm64 build for Windows.

Issues Fixed or Closed

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Dependency update (updates to dependencies)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files, e.g. .github/...)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

@rbqvq

This comment was marked as resolved.

Comment threaddocs/getting_started.md Outdated
Comment threadsrc/config.cpp
Comment threadsrc/platform/windows/audio.cpp
Comment threaddocs/building.md Outdated
Comment threaddocs/building.md Outdated
Comment threadcmake/dependencies/windows.cmake Outdated
Comment thread.github/workflows/CI.yml Outdated
Comment threaddocs/getting_started.md Outdated
@rbqvq

rbqvq commented Jun 2, 2025

Copy link
Copy Markdown
ContributorAuthor

Can we use this hardware encode? 🤔
obsproject/obs-studio#11993

@ReenigneArcher

Copy link
Copy Markdown
Member

I think MF encoder is already included with the FFmpeg build, so why not?

@rbqvq

rbqvq commented Jun 2, 2025

Copy link
Copy Markdown
ContributorAuthor

I think MF encoder is already included with the FFmpeg build, so why not?

Well, I didn't read the source code of sunshine.
This part is up to you. 🤪

@rbqvq

This comment was marked as resolved.

@ReenigneArcher

This comment was marked as resolved.

cgutman
cgutman previously requested changes Jul 5, 2025
Comment threadsrc/platform/windows/display_base.cpp Outdated
@sonarqubecloud

Copy link
Copy Markdown

@ReenigneArcherReenigneArcher mentioned this pull request Aug 22, 2025
15 tasks
@LizardByte-bot

This comment was marked as outdated.

@rbqvq

This comment was marked as outdated.

@ReenigneArcher

This comment was marked as resolved.

@LizardByte-bot

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@ReenigneArcherReenigneArcher added this to the windows-arm milestone Jan 20, 2026
@codecov

codecovBot commented Jan 21, 2026

Copy link
Copy Markdown

Bundle Report

Bundle size has no change ✅

Comment threadcmake/prep/options.cmake Outdated
@ReenigneArcher

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@rbqvq
rbqvq marked this pull request as ready for review February 3, 2026 20:15
@rbqvq

rbqvq commented Feb 3, 2026

Copy link
Copy Markdown
ContributorAuthor

All thing done.

Pre-built portable can find at https://github.com/rbqvq/Sunshine/actions/runs/21646290004

Thanks all people who works on #3905 and #4521

Delete the `#warning` emitted for non-x64 architectures in src/platform/windows/audio.cpp.
Update cmake/compile_definitions/windows.cmake to suppress specific GCC warnings when building for Windows ARM64.
Add flags to SUNSHINE_COMPILE_OPTIONS for CMAKE_SYSTEM_PROCESSOR=ARM64 to silence warnings.
- `-Wno-dll-attribute-on-redeclaration` for Boost
- `-Wno-unknown-warning-option` for ViGEmClient
- `-Wno-unused-variable` for Boost
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Replace variable-length arrays with std::vector in src/platform/windows/input.cpp and src/platform/windows/misc.cpp for safety and portability.
Add <vector> includes, allocate wide-character buffer with std::vector<WCHAR> and pass wide.data() to MultiByteToWideChar, and replace WSABUF VLA with std::vector<WSABUF> and use .data() for msg.lpBuffers.
These changes avoid non-standard VLAs and reduce stack-allocation risks.
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Drop the HMODULE dll = nullptr; declaration from src/nvenc/nvenc_d3d11_on_cuda.h.
This removes an unused module handle field from the nvenc D3D11-on-CUDA wrapper to reduce unnecessary state.
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
@rbqvq

This comment was marked as resolved.

@ReenigneArcher

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

rbqvqand others added 2 commits February 7, 2026 22:09
Add CI build for Windows ARM64.
Signed-off-by: Coia Prant <coiaprant@gmail.com>
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Add windows arm64 documents.
Signed-off-by: Coia Prant <coiaprant@gmail.com>
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
@ReenigneArcher

Copy link
Copy Markdown
Member

Thank you. Please no more force pushing.

@rbqvq

rbqvq commented Feb 7, 2026

Copy link
Copy Markdown
ContributorAuthor

Thanks, I went back to sleep.
Leave the rest to you.

Insert a 'Debug nsis' step into .github/workflows/ci-windows.yml that always runs and prints the NSISOutput.log using the msys2 shell. This captures NSIS installer build logs for troubleshooting; the step uses '|| true' to avoid failing the job. The step is placed before the existing 'Debug wix' step.
Make NSIS detailed logging conditional on the target architecture by adding NSIS_LOGSET_COMMAND (set to "LogSet on" only when CMAKE_SYSTEM_PROCESSOR matches AMD64) and using it in CPACK_NSIS_EXTRA_INSTALL_COMMANDS and CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS instead of always calling LogSet. Update docs/getting_started.md to note that the install.log under %PROGRAMFILES% is available on AMD64 only.
@sonarqubecloud

Copy link
Copy Markdown

@ReenigneArcher
ReenigneArcher merged commit d591643 into LizardByte:masterFeb 8, 2026
41 of 42 checks passed
@codecov

codecovBot commented Feb 8, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 16.66667% with 15 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (master@cdc4443). Learn more about missing BASE report.
⚠️ Report is 208 commits behind head on master.

Files with missing linesPatch %Lines
src/video.cpp37.50%3 Missing and 2 partials ⚠️
src/config.cpp0.00%4 Missing ⚠️
src/platform/windows/display_vram.cpp0.00%1 Missing and 1 partial ⚠️
src/platform/windows/input.cpp0.00%2 Missing ⚠️
src/platform/windows/misc.cpp0.00%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## master #3905 +/- ##
=========================================
Coverage ? 14.11% =========================================
Files ? 95 Lines ? 19859 Branches ? 9189 =========================================
Hits ? 2804 Misses ? 13523 Partials ? 3532 
FlagCoverage Δ
Archlinux11.19% <11.11%> (?)
FreeBSD-14.3-amd6413.23% <16.66%> (?)
Linux-AppImage11.60% <11.11%> (?)
Windows-AMD6413.48% <6.66%> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing linesCoverage Δ
src/nvenc/nvenc_d3d11_on_cuda.h0.00% <ø> (ø)
src/platform/windows/audio.cpp25.13% <ø> (ø)
src/video.h61.11% <ø> (ø)
src/platform/windows/display_vram.cpp8.93% <0.00%> (ø)
src/platform/windows/input.cpp0.63% <0.00%> (ø)
src/platform/windows/misc.cpp15.20% <0.00%> (ø)
src/config.cpp3.03% <0.00%> (ø)
src/video.cpp29.07% <37.50%> (ø)

@ReenigneArcher

Copy link
Copy Markdown
Member

@rbqvq unfortunately, now arm64 is failing in Debian/Ubuntu images.

[900](https://github.com/LizardByte/Sunshine/actions/runs/21792778237/job/62875233089#step:11:18906)
#35 7492.4 ✓ 7 modules transformed.
#35 7492.4 ✗ Build failed in 4.68s
#35 7492.4 error during build:
#35 7492.4 byte length of Uint32Array should be a multiple of 4
#35 7492.4 at new Uint32Array (<anonymous>)
#35 7492.4 at getAstBuffer (file:///build/sunshine/node_modules/rollup/dist/es/shared/parseAst.js:2073:19)
#35 7492.4 at convertProgram (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:15677:48)
#35 7492.4 at Module.setSource (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:17392:24)
#35 7492.4 at async ModuleLoader.addModuleSource (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:21474:13)
#35 7492.4 ninja: build stopped: subcommand failed.
#35 ERROR: process "/bin/bash -o pipefail -c /dev/pipes/_BUILD" did not complete successfully: exit code: 1

We don't build these for PRs because they take 3+ hours. Do you have some idea how we can conditionally use these additions to the package.json?

"@rollup/wasm-node": "4.57.1"},"overrides": {
"rollup": "npm:@rollup/wasm-node@4.57.1"

@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

I think we can provide two package.json and use script to rename them.

@ReenigneArcher

Copy link
Copy Markdown
Member

Can we have a second package.json that depends on the first one? And use second one only when we need the override? If we can reduce the duplication that would be ideal.

@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

Or we can build them on a unified CI, and the CI of each OS builder only needs to pull the static resources that have been built.

@rbqvqrbqvq mentioned this pull request Feb 8, 2026
21 tasks
@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

@ReenigneArcher It should be fix in #4687

Actions for windows build still working:
https://github.com/rbqvq/Sunshine/actions/runs/21800375818

@ReenigneArcher

Copy link
Copy Markdown
Member

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor

So the expected result should be x86/x64?

dxgi.exe is compiled by us or packed from somewhere?

@ReenigneArcher

Copy link
Copy Markdown
Member

It's compiled in our CI, from the tools directory.

Being compiled as arm64 is correct, I'm just wondering why it might be flagged for the arm64 version, but not the original version.

Not a big deal though.

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor

I think it might be website design, because most windows applications are x86/x64?

You can try other arm64 and x86/x64 exe to see if there are some clues.

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor
  • x86

EdgeUpdate.exe

Tags: peexe, signed, overlay, idle
Magic: PE32 executable (GUI) Intel 80386, for MS Windows
Target Machine: Intel 386 or later processors and compatible processors

https://www.virustotal.com/gui/file/955b5950fd92e5c5eec395b022566c9a2594ca3126d894408e2e29ba25d8b0dd/details

  • x64

bash.exe (Git For Windows)

Tags: peexe, 64bits, known-distributor, overlay, idle
Magic: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Target Machine: x64

https://www.virustotal.com/gui/file/fc362aae1f217d34d02237d99527839dd6cf85b37c7a0277109400bfa0faa594/details

  • arm64

git.exe (Git For Windows)

Tags: peexe, arm, overlay, 64bits
Magic: PE32+ executable (console) Aarch64, for MS Windows
Target Machine: ARMv8 in 64-bit mode

https://www.virustotal.com/gui/file/bede8ae74caec9ae40c20910b360f01863042b5f69aa1c09fc2946dc9a52e100/details


  • x64

dxgi-info.exe

Tags: peexe, 64bits
Magic: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Target Machine: x64

https://www.virustotal.com/gui/file/955b5950fd92e5c5eec395b022566c9a2594ca3126d894408e2e29ba25d8b0dd/details

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@rbqvq@ReenigneArcher@LizardByte-bot@cgutman@ricky8955555@Lapintam@edesonmercy123@faratech
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

build(windows): add arm64 support - #3905

Merged
ReenigneArcher merged 15 commits into
LizardByte:masterfrom
rbqvq:master
Feb 8, 2026
Merged

build(windows): add arm64 support#3905
ReenigneArcher merged 15 commits into
LizardByte:masterfrom
rbqvq:master

Conversation

@rbqvq

@rbqvqrbqvq commented May 25, 2025

Copy link
Copy Markdown
Contributor

Description

This PR adds an arm64 build for Windows.

Issues Fixed or Closed

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Dependency update (updates to dependencies)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files, e.g. .github/...)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

@rbqvq

This comment was marked as resolved.

Comment threaddocs/getting_started.md Outdated
Comment threadsrc/config.cpp
Comment threadsrc/platform/windows/audio.cpp
Comment threaddocs/building.md Outdated
Comment threaddocs/building.md Outdated
Comment threadcmake/dependencies/windows.cmake Outdated
Comment thread.github/workflows/CI.yml Outdated
Comment threaddocs/getting_started.md Outdated
@rbqvq

rbqvq commented Jun 2, 2025

Copy link
Copy Markdown
ContributorAuthor

Can we use this hardware encode? 🤔
obsproject/obs-studio#11993

@ReenigneArcher

Copy link
Copy Markdown
Member

I think MF encoder is already included with the FFmpeg build, so why not?

@rbqvq

rbqvq commented Jun 2, 2025

Copy link
Copy Markdown
ContributorAuthor

I think MF encoder is already included with the FFmpeg build, so why not?

Well, I didn't read the source code of sunshine.
This part is up to you. 🤪

@rbqvq

This comment was marked as resolved.

@ReenigneArcher

This comment was marked as resolved.

cgutman
cgutman previously requested changes Jul 5, 2025
Comment threadsrc/platform/windows/display_base.cpp Outdated
@sonarqubecloud

Copy link
Copy Markdown

@ReenigneArcherReenigneArcher mentioned this pull request Aug 22, 2025
15 tasks
@LizardByte-bot

This comment was marked as outdated.

@rbqvq

This comment was marked as outdated.

@ReenigneArcher

This comment was marked as resolved.

@LizardByte-bot

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@ReenigneArcherReenigneArcher added this to the windows-arm milestone Jan 20, 2026
@codecov

codecovBot commented Jan 21, 2026

Copy link
Copy Markdown

Bundle Report

Bundle size has no change ✅

Comment threadcmake/prep/options.cmake Outdated
@ReenigneArcher

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@rbqvq
rbqvq marked this pull request as ready for review February 3, 2026 20:15
@rbqvq

rbqvq commented Feb 3, 2026

Copy link
Copy Markdown
ContributorAuthor

All thing done.

Pre-built portable can find at https://github.com/rbqvq/Sunshine/actions/runs/21646290004

Thanks all people who works on #3905 and #4521

Delete the `#warning` emitted for non-x64 architectures in src/platform/windows/audio.cpp.
Update cmake/compile_definitions/windows.cmake to suppress specific GCC warnings when building for Windows ARM64.
Add flags to SUNSHINE_COMPILE_OPTIONS for CMAKE_SYSTEM_PROCESSOR=ARM64 to silence warnings.
- `-Wno-dll-attribute-on-redeclaration` for Boost
- `-Wno-unknown-warning-option` for ViGEmClient
- `-Wno-unused-variable` for Boost
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Replace variable-length arrays with std::vector in src/platform/windows/input.cpp and src/platform/windows/misc.cpp for safety and portability.
Add <vector> includes, allocate wide-character buffer with std::vector<WCHAR> and pass wide.data() to MultiByteToWideChar, and replace WSABUF VLA with std::vector<WSABUF> and use .data() for msg.lpBuffers.
These changes avoid non-standard VLAs and reduce stack-allocation risks.
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Drop the HMODULE dll = nullptr; declaration from src/nvenc/nvenc_d3d11_on_cuda.h.
This removes an unused module handle field from the nvenc D3D11-on-CUDA wrapper to reduce unnecessary state.
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
@rbqvq

This comment was marked as resolved.

@ReenigneArcher

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

rbqvqand others added 2 commits February 7, 2026 22:09
Add CI build for Windows ARM64.
Signed-off-by: Coia Prant <coiaprant@gmail.com>
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Add windows arm64 documents.
Signed-off-by: Coia Prant <coiaprant@gmail.com>
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
@ReenigneArcher

Copy link
Copy Markdown
Member

Thank you. Please no more force pushing.

@rbqvq

rbqvq commented Feb 7, 2026

Copy link
Copy Markdown
ContributorAuthor

Thanks, I went back to sleep.
Leave the rest to you.

Insert a 'Debug nsis' step into .github/workflows/ci-windows.yml that always runs and prints the NSISOutput.log using the msys2 shell. This captures NSIS installer build logs for troubleshooting; the step uses '|| true' to avoid failing the job. The step is placed before the existing 'Debug wix' step.
Make NSIS detailed logging conditional on the target architecture by adding NSIS_LOGSET_COMMAND (set to "LogSet on" only when CMAKE_SYSTEM_PROCESSOR matches AMD64) and using it in CPACK_NSIS_EXTRA_INSTALL_COMMANDS and CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS instead of always calling LogSet. Update docs/getting_started.md to note that the install.log under %PROGRAMFILES% is available on AMD64 only.
@sonarqubecloud

Copy link
Copy Markdown

@ReenigneArcher
ReenigneArcher merged commit d591643 into LizardByte:masterFeb 8, 2026
41 of 42 checks passed
@codecov

codecovBot commented Feb 8, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 16.66667% with 15 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (master@cdc4443). Learn more about missing BASE report.
⚠️ Report is 208 commits behind head on master.

Files with missing linesPatch %Lines
src/video.cpp37.50%3 Missing and 2 partials ⚠️
src/config.cpp0.00%4 Missing ⚠️
src/platform/windows/display_vram.cpp0.00%1 Missing and 1 partial ⚠️
src/platform/windows/input.cpp0.00%2 Missing ⚠️
src/platform/windows/misc.cpp0.00%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## master #3905 +/- ##
=========================================
Coverage ? 14.11% =========================================
Files ? 95 Lines ? 19859 Branches ? 9189 =========================================
Hits ? 2804 Misses ? 13523 Partials ? 3532 
FlagCoverage Δ
Archlinux11.19% <11.11%> (?)
FreeBSD-14.3-amd6413.23% <16.66%> (?)
Linux-AppImage11.60% <11.11%> (?)
Windows-AMD6413.48% <6.66%> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing linesCoverage Δ
src/nvenc/nvenc_d3d11_on_cuda.h0.00% <ø> (ø)
src/platform/windows/audio.cpp25.13% <ø> (ø)
src/video.h61.11% <ø> (ø)
src/platform/windows/display_vram.cpp8.93% <0.00%> (ø)
src/platform/windows/input.cpp0.63% <0.00%> (ø)
src/platform/windows/misc.cpp15.20% <0.00%> (ø)
src/config.cpp3.03% <0.00%> (ø)
src/video.cpp29.07% <37.50%> (ø)

@ReenigneArcher

Copy link
Copy Markdown
Member

@rbqvq unfortunately, now arm64 is failing in Debian/Ubuntu images.

[900](https://github.com/LizardByte/Sunshine/actions/runs/21792778237/job/62875233089#step:11:18906)
#35 7492.4 ✓ 7 modules transformed.
#35 7492.4 ✗ Build failed in 4.68s
#35 7492.4 error during build:
#35 7492.4 byte length of Uint32Array should be a multiple of 4
#35 7492.4 at new Uint32Array (<anonymous>)
#35 7492.4 at getAstBuffer (file:///build/sunshine/node_modules/rollup/dist/es/shared/parseAst.js:2073:19)
#35 7492.4 at convertProgram (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:15677:48)
#35 7492.4 at Module.setSource (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:17392:24)
#35 7492.4 at async ModuleLoader.addModuleSource (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:21474:13)
#35 7492.4 ninja: build stopped: subcommand failed.
#35 ERROR: process "/bin/bash -o pipefail -c /dev/pipes/_BUILD" did not complete successfully: exit code: 1

We don't build these for PRs because they take 3+ hours. Do you have some idea how we can conditionally use these additions to the package.json?

"@rollup/wasm-node": "4.57.1"},"overrides": {
"rollup": "npm:@rollup/wasm-node@4.57.1"

@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

I think we can provide two package.json and use script to rename them.

@ReenigneArcher

Copy link
Copy Markdown
Member

Can we have a second package.json that depends on the first one? And use second one only when we need the override? If we can reduce the duplication that would be ideal.

@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

Or we can build them on a unified CI, and the CI of each OS builder only needs to pull the static resources that have been built.

@rbqvqrbqvq mentioned this pull request Feb 8, 2026
21 tasks
@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

@ReenigneArcher It should be fix in #4687

Actions for windows build still working:
https://github.com/rbqvq/Sunshine/actions/runs/21800375818

@ReenigneArcher

Copy link
Copy Markdown
Member

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor

So the expected result should be x86/x64?

dxgi.exe is compiled by us or packed from somewhere?

@ReenigneArcher

Copy link
Copy Markdown
Member

It's compiled in our CI, from the tools directory.

Being compiled as arm64 is correct, I'm just wondering why it might be flagged for the arm64 version, but not the original version.

Not a big deal though.

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor

I think it might be website design, because most windows applications are x86/x64?

You can try other arm64 and x86/x64 exe to see if there are some clues.

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor
  • x86

EdgeUpdate.exe

Tags: peexe, signed, overlay, idle
Magic: PE32 executable (GUI) Intel 80386, for MS Windows
Target Machine: Intel 386 or later processors and compatible processors

https://www.virustotal.com/gui/file/955b5950fd92e5c5eec395b022566c9a2594ca3126d894408e2e29ba25d8b0dd/details

  • x64

bash.exe (Git For Windows)

Tags: peexe, 64bits, known-distributor, overlay, idle
Magic: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Target Machine: x64

https://www.virustotal.com/gui/file/fc362aae1f217d34d02237d99527839dd6cf85b37c7a0277109400bfa0faa594/details

  • arm64

git.exe (Git For Windows)

Tags: peexe, arm, overlay, 64bits
Magic: PE32+ executable (console) Aarch64, for MS Windows
Target Machine: ARMv8 in 64-bit mode

https://www.virustotal.com/gui/file/bede8ae74caec9ae40c20910b360f01863042b5f69aa1c09fc2946dc9a52e100/details


  • x64

dxgi-info.exe

Tags: peexe, 64bits
Magic: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Target Machine: x64

https://www.virustotal.com/gui/file/955b5950fd92e5c5eec395b022566c9a2594ca3126d894408e2e29ba25d8b0dd/details

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@rbqvq@ReenigneArcher@LizardByte-bot@cgutman@ricky8955555@Lapintam@edesonmercy123@faratech
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

build(windows): add arm64 support - #3905

Merged
ReenigneArcher merged 15 commits into
LizardByte:masterfrom
rbqvq:master
Feb 8, 2026
Merged

build(windows): add arm64 support#3905
ReenigneArcher merged 15 commits into
LizardByte:masterfrom
rbqvq:master

Conversation

@rbqvq

@rbqvqrbqvq commented May 25, 2025

Copy link
Copy Markdown
Contributor

Description

This PR adds an arm64 build for Windows.

Issues Fixed or Closed

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Dependency update (updates to dependencies)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files, e.g. .github/...)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

@rbqvq

This comment was marked as resolved.

Comment threaddocs/getting_started.md Outdated
Comment threadsrc/config.cpp
Comment threadsrc/platform/windows/audio.cpp
Comment threaddocs/building.md Outdated
Comment threaddocs/building.md Outdated
Comment threadcmake/dependencies/windows.cmake Outdated
Comment thread.github/workflows/CI.yml Outdated
Comment threaddocs/getting_started.md Outdated
@rbqvq

rbqvq commented Jun 2, 2025

Copy link
Copy Markdown
ContributorAuthor

Can we use this hardware encode? 🤔
obsproject/obs-studio#11993

@ReenigneArcher

Copy link
Copy Markdown
Member

I think MF encoder is already included with the FFmpeg build, so why not?

@rbqvq

rbqvq commented Jun 2, 2025

Copy link
Copy Markdown
ContributorAuthor

I think MF encoder is already included with the FFmpeg build, so why not?

Well, I didn't read the source code of sunshine.
This part is up to you. 🤪

@rbqvq

This comment was marked as resolved.

@ReenigneArcher

This comment was marked as resolved.

cgutman
cgutman previously requested changes Jul 5, 2025
Comment threadsrc/platform/windows/display_base.cpp Outdated
@sonarqubecloud

Copy link
Copy Markdown

@ReenigneArcherReenigneArcher mentioned this pull request Aug 22, 2025
15 tasks
@LizardByte-bot

This comment was marked as outdated.

@rbqvq

This comment was marked as outdated.

@ReenigneArcher

This comment was marked as resolved.

@LizardByte-bot

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@ReenigneArcherReenigneArcher added this to the windows-arm milestone Jan 20, 2026
@codecov

codecovBot commented Jan 21, 2026

Copy link
Copy Markdown

Bundle Report

Bundle size has no change ✅

Comment threadcmake/prep/options.cmake Outdated
@ReenigneArcher

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@rbqvq
rbqvq marked this pull request as ready for review February 3, 2026 20:15
@rbqvq

rbqvq commented Feb 3, 2026

Copy link
Copy Markdown
ContributorAuthor

All thing done.

Pre-built portable can find at https://github.com/rbqvq/Sunshine/actions/runs/21646290004

Thanks all people who works on #3905 and #4521

Delete the `#warning` emitted for non-x64 architectures in src/platform/windows/audio.cpp.
Update cmake/compile_definitions/windows.cmake to suppress specific GCC warnings when building for Windows ARM64.
Add flags to SUNSHINE_COMPILE_OPTIONS for CMAKE_SYSTEM_PROCESSOR=ARM64 to silence warnings.
- `-Wno-dll-attribute-on-redeclaration` for Boost
- `-Wno-unknown-warning-option` for ViGEmClient
- `-Wno-unused-variable` for Boost
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Replace variable-length arrays with std::vector in src/platform/windows/input.cpp and src/platform/windows/misc.cpp for safety and portability.
Add <vector> includes, allocate wide-character buffer with std::vector<WCHAR> and pass wide.data() to MultiByteToWideChar, and replace WSABUF VLA with std::vector<WSABUF> and use .data() for msg.lpBuffers.
These changes avoid non-standard VLAs and reduce stack-allocation risks.
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Drop the HMODULE dll = nullptr; declaration from src/nvenc/nvenc_d3d11_on_cuda.h.
This removes an unused module handle field from the nvenc D3D11-on-CUDA wrapper to reduce unnecessary state.
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
@rbqvq

This comment was marked as resolved.

@ReenigneArcher

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

rbqvqand others added 2 commits February 7, 2026 22:09
Add CI build for Windows ARM64.
Signed-off-by: Coia Prant <coiaprant@gmail.com>
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Add windows arm64 documents.
Signed-off-by: Coia Prant <coiaprant@gmail.com>
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
@ReenigneArcher

Copy link
Copy Markdown
Member

Thank you. Please no more force pushing.

@rbqvq

rbqvq commented Feb 7, 2026

Copy link
Copy Markdown
ContributorAuthor

Thanks, I went back to sleep.
Leave the rest to you.

Insert a 'Debug nsis' step into .github/workflows/ci-windows.yml that always runs and prints the NSISOutput.log using the msys2 shell. This captures NSIS installer build logs for troubleshooting; the step uses '|| true' to avoid failing the job. The step is placed before the existing 'Debug wix' step.
Make NSIS detailed logging conditional on the target architecture by adding NSIS_LOGSET_COMMAND (set to "LogSet on" only when CMAKE_SYSTEM_PROCESSOR matches AMD64) and using it in CPACK_NSIS_EXTRA_INSTALL_COMMANDS and CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS instead of always calling LogSet. Update docs/getting_started.md to note that the install.log under %PROGRAMFILES% is available on AMD64 only.
@sonarqubecloud

Copy link
Copy Markdown

@ReenigneArcher
ReenigneArcher merged commit d591643 into LizardByte:masterFeb 8, 2026
41 of 42 checks passed
@codecov

codecovBot commented Feb 8, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 16.66667% with 15 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (master@cdc4443). Learn more about missing BASE report.
⚠️ Report is 208 commits behind head on master.

Files with missing linesPatch %Lines
src/video.cpp37.50%3 Missing and 2 partials ⚠️
src/config.cpp0.00%4 Missing ⚠️
src/platform/windows/display_vram.cpp0.00%1 Missing and 1 partial ⚠️
src/platform/windows/input.cpp0.00%2 Missing ⚠️
src/platform/windows/misc.cpp0.00%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## master #3905 +/- ##
=========================================
Coverage ? 14.11% =========================================
Files ? 95 Lines ? 19859 Branches ? 9189 =========================================
Hits ? 2804 Misses ? 13523 Partials ? 3532 
FlagCoverage Δ
Archlinux11.19% <11.11%> (?)
FreeBSD-14.3-amd6413.23% <16.66%> (?)
Linux-AppImage11.60% <11.11%> (?)
Windows-AMD6413.48% <6.66%> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing linesCoverage Δ
src/nvenc/nvenc_d3d11_on_cuda.h0.00% <ø> (ø)
src/platform/windows/audio.cpp25.13% <ø> (ø)
src/video.h61.11% <ø> (ø)
src/platform/windows/display_vram.cpp8.93% <0.00%> (ø)
src/platform/windows/input.cpp0.63% <0.00%> (ø)
src/platform/windows/misc.cpp15.20% <0.00%> (ø)
src/config.cpp3.03% <0.00%> (ø)
src/video.cpp29.07% <37.50%> (ø)

@ReenigneArcher

Copy link
Copy Markdown
Member

@rbqvq unfortunately, now arm64 is failing in Debian/Ubuntu images.

[900](https://github.com/LizardByte/Sunshine/actions/runs/21792778237/job/62875233089#step:11:18906)
#35 7492.4 ✓ 7 modules transformed.
#35 7492.4 ✗ Build failed in 4.68s
#35 7492.4 error during build:
#35 7492.4 byte length of Uint32Array should be a multiple of 4
#35 7492.4 at new Uint32Array (<anonymous>)
#35 7492.4 at getAstBuffer (file:///build/sunshine/node_modules/rollup/dist/es/shared/parseAst.js:2073:19)
#35 7492.4 at convertProgram (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:15677:48)
#35 7492.4 at Module.setSource (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:17392:24)
#35 7492.4 at async ModuleLoader.addModuleSource (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:21474:13)
#35 7492.4 ninja: build stopped: subcommand failed.
#35 ERROR: process "/bin/bash -o pipefail -c /dev/pipes/_BUILD" did not complete successfully: exit code: 1

We don't build these for PRs because they take 3+ hours. Do you have some idea how we can conditionally use these additions to the package.json?

"@rollup/wasm-node": "4.57.1"},"overrides": {
"rollup": "npm:@rollup/wasm-node@4.57.1"

@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

I think we can provide two package.json and use script to rename them.

@ReenigneArcher

Copy link
Copy Markdown
Member

Can we have a second package.json that depends on the first one? And use second one only when we need the override? If we can reduce the duplication that would be ideal.

@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

Or we can build them on a unified CI, and the CI of each OS builder only needs to pull the static resources that have been built.

@rbqvqrbqvq mentioned this pull request Feb 8, 2026
21 tasks
@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

@ReenigneArcher It should be fix in #4687

Actions for windows build still working:
https://github.com/rbqvq/Sunshine/actions/runs/21800375818

@ReenigneArcher

Copy link
Copy Markdown
Member

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor

So the expected result should be x86/x64?

dxgi.exe is compiled by us or packed from somewhere?

@ReenigneArcher

Copy link
Copy Markdown
Member

It's compiled in our CI, from the tools directory.

Being compiled as arm64 is correct, I'm just wondering why it might be flagged for the arm64 version, but not the original version.

Not a big deal though.

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor

I think it might be website design, because most windows applications are x86/x64?

You can try other arm64 and x86/x64 exe to see if there are some clues.

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor
  • x86

EdgeUpdate.exe

Tags: peexe, signed, overlay, idle
Magic: PE32 executable (GUI) Intel 80386, for MS Windows
Target Machine: Intel 386 or later processors and compatible processors

https://www.virustotal.com/gui/file/955b5950fd92e5c5eec395b022566c9a2594ca3126d894408e2e29ba25d8b0dd/details

  • x64

bash.exe (Git For Windows)

Tags: peexe, 64bits, known-distributor, overlay, idle
Magic: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Target Machine: x64

https://www.virustotal.com/gui/file/fc362aae1f217d34d02237d99527839dd6cf85b37c7a0277109400bfa0faa594/details

  • arm64

git.exe (Git For Windows)

Tags: peexe, arm, overlay, 64bits
Magic: PE32+ executable (console) Aarch64, for MS Windows
Target Machine: ARMv8 in 64-bit mode

https://www.virustotal.com/gui/file/bede8ae74caec9ae40c20910b360f01863042b5f69aa1c09fc2946dc9a52e100/details


  • x64

dxgi-info.exe

Tags: peexe, 64bits
Magic: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Target Machine: x64

https://www.virustotal.com/gui/file/955b5950fd92e5c5eec395b022566c9a2594ca3126d894408e2e29ba25d8b0dd/details

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@rbqvq@ReenigneArcher@LizardByte-bot@cgutman@ricky8955555@Lapintam@edesonmercy123@faratech
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

build(windows): add arm64 support - #3905

Merged
ReenigneArcher merged 15 commits into
LizardByte:masterfrom
rbqvq:master
Feb 8, 2026
Merged

build(windows): add arm64 support#3905
ReenigneArcher merged 15 commits into
LizardByte:masterfrom
rbqvq:master

Conversation

@rbqvq

@rbqvqrbqvq commented May 25, 2025

Copy link
Copy Markdown
Contributor

Description

This PR adds an arm64 build for Windows.

Issues Fixed or Closed

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Dependency update (updates to dependencies)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files, e.g. .github/...)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

@rbqvq

This comment was marked as resolved.

Comment threaddocs/getting_started.md Outdated
Comment threadsrc/config.cpp
Comment threadsrc/platform/windows/audio.cpp
Comment threaddocs/building.md Outdated
Comment threaddocs/building.md Outdated
Comment threadcmake/dependencies/windows.cmake Outdated
Comment thread.github/workflows/CI.yml Outdated
Comment threaddocs/getting_started.md Outdated
@rbqvq

rbqvq commented Jun 2, 2025

Copy link
Copy Markdown
ContributorAuthor

Can we use this hardware encode? 🤔
obsproject/obs-studio#11993

@ReenigneArcher

Copy link
Copy Markdown
Member

I think MF encoder is already included with the FFmpeg build, so why not?

@rbqvq

rbqvq commented Jun 2, 2025

Copy link
Copy Markdown
ContributorAuthor

I think MF encoder is already included with the FFmpeg build, so why not?

Well, I didn't read the source code of sunshine.
This part is up to you. 🤪

@rbqvq

This comment was marked as resolved.

@ReenigneArcher

This comment was marked as resolved.

cgutman
cgutman previously requested changes Jul 5, 2025
Comment threadsrc/platform/windows/display_base.cpp Outdated
@sonarqubecloud

Copy link
Copy Markdown

@ReenigneArcherReenigneArcher mentioned this pull request Aug 22, 2025
15 tasks
@LizardByte-bot

This comment was marked as outdated.

@rbqvq

This comment was marked as outdated.

@ReenigneArcher

This comment was marked as resolved.

@LizardByte-bot

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@ReenigneArcherReenigneArcher added this to the windows-arm milestone Jan 20, 2026
@codecov

codecovBot commented Jan 21, 2026

Copy link
Copy Markdown

Bundle Report

Bundle size has no change ✅

Comment threadcmake/prep/options.cmake Outdated
@ReenigneArcher

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@rbqvq
rbqvq marked this pull request as ready for review February 3, 2026 20:15
@rbqvq

rbqvq commented Feb 3, 2026

Copy link
Copy Markdown
ContributorAuthor

All thing done.

Pre-built portable can find at https://github.com/rbqvq/Sunshine/actions/runs/21646290004

Thanks all people who works on #3905 and #4521

Delete the `#warning` emitted for non-x64 architectures in src/platform/windows/audio.cpp.
Update cmake/compile_definitions/windows.cmake to suppress specific GCC warnings when building for Windows ARM64.
Add flags to SUNSHINE_COMPILE_OPTIONS for CMAKE_SYSTEM_PROCESSOR=ARM64 to silence warnings.
- `-Wno-dll-attribute-on-redeclaration` for Boost
- `-Wno-unknown-warning-option` for ViGEmClient
- `-Wno-unused-variable` for Boost
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Replace variable-length arrays with std::vector in src/platform/windows/input.cpp and src/platform/windows/misc.cpp for safety and portability.
Add <vector> includes, allocate wide-character buffer with std::vector<WCHAR> and pass wide.data() to MultiByteToWideChar, and replace WSABUF VLA with std::vector<WSABUF> and use .data() for msg.lpBuffers.
These changes avoid non-standard VLAs and reduce stack-allocation risks.
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Drop the HMODULE dll = nullptr; declaration from src/nvenc/nvenc_d3d11_on_cuda.h.
This removes an unused module handle field from the nvenc D3D11-on-CUDA wrapper to reduce unnecessary state.
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
@rbqvq

This comment was marked as resolved.

@ReenigneArcher

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

rbqvqand others added 2 commits February 7, 2026 22:09
Add CI build for Windows ARM64.
Signed-off-by: Coia Prant <coiaprant@gmail.com>
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Add windows arm64 documents.
Signed-off-by: Coia Prant <coiaprant@gmail.com>
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
@ReenigneArcher

Copy link
Copy Markdown
Member

Thank you. Please no more force pushing.

@rbqvq

rbqvq commented Feb 7, 2026

Copy link
Copy Markdown
ContributorAuthor

Thanks, I went back to sleep.
Leave the rest to you.

Insert a 'Debug nsis' step into .github/workflows/ci-windows.yml that always runs and prints the NSISOutput.log using the msys2 shell. This captures NSIS installer build logs for troubleshooting; the step uses '|| true' to avoid failing the job. The step is placed before the existing 'Debug wix' step.
Make NSIS detailed logging conditional on the target architecture by adding NSIS_LOGSET_COMMAND (set to "LogSet on" only when CMAKE_SYSTEM_PROCESSOR matches AMD64) and using it in CPACK_NSIS_EXTRA_INSTALL_COMMANDS and CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS instead of always calling LogSet. Update docs/getting_started.md to note that the install.log under %PROGRAMFILES% is available on AMD64 only.
@sonarqubecloud

Copy link
Copy Markdown

@ReenigneArcher
ReenigneArcher merged commit d591643 into LizardByte:masterFeb 8, 2026
41 of 42 checks passed
@codecov

codecovBot commented Feb 8, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 16.66667% with 15 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (master@cdc4443). Learn more about missing BASE report.
⚠️ Report is 208 commits behind head on master.

Files with missing linesPatch %Lines
src/video.cpp37.50%3 Missing and 2 partials ⚠️
src/config.cpp0.00%4 Missing ⚠️
src/platform/windows/display_vram.cpp0.00%1 Missing and 1 partial ⚠️
src/platform/windows/input.cpp0.00%2 Missing ⚠️
src/platform/windows/misc.cpp0.00%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## master #3905 +/- ##
=========================================
Coverage ? 14.11% =========================================
Files ? 95 Lines ? 19859 Branches ? 9189 =========================================
Hits ? 2804 Misses ? 13523 Partials ? 3532 
FlagCoverage Δ
Archlinux11.19% <11.11%> (?)
FreeBSD-14.3-amd6413.23% <16.66%> (?)
Linux-AppImage11.60% <11.11%> (?)
Windows-AMD6413.48% <6.66%> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing linesCoverage Δ
src/nvenc/nvenc_d3d11_on_cuda.h0.00% <ø> (ø)
src/platform/windows/audio.cpp25.13% <ø> (ø)
src/video.h61.11% <ø> (ø)
src/platform/windows/display_vram.cpp8.93% <0.00%> (ø)
src/platform/windows/input.cpp0.63% <0.00%> (ø)
src/platform/windows/misc.cpp15.20% <0.00%> (ø)
src/config.cpp3.03% <0.00%> (ø)
src/video.cpp29.07% <37.50%> (ø)

@ReenigneArcher

Copy link
Copy Markdown
Member

@rbqvq unfortunately, now arm64 is failing in Debian/Ubuntu images.

[900](https://github.com/LizardByte/Sunshine/actions/runs/21792778237/job/62875233089#step:11:18906)
#35 7492.4 ✓ 7 modules transformed.
#35 7492.4 ✗ Build failed in 4.68s
#35 7492.4 error during build:
#35 7492.4 byte length of Uint32Array should be a multiple of 4
#35 7492.4 at new Uint32Array (<anonymous>)
#35 7492.4 at getAstBuffer (file:///build/sunshine/node_modules/rollup/dist/es/shared/parseAst.js:2073:19)
#35 7492.4 at convertProgram (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:15677:48)
#35 7492.4 at Module.setSource (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:17392:24)
#35 7492.4 at async ModuleLoader.addModuleSource (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:21474:13)
#35 7492.4 ninja: build stopped: subcommand failed.
#35 ERROR: process "/bin/bash -o pipefail -c /dev/pipes/_BUILD" did not complete successfully: exit code: 1

We don't build these for PRs because they take 3+ hours. Do you have some idea how we can conditionally use these additions to the package.json?

"@rollup/wasm-node": "4.57.1"},"overrides": {
"rollup": "npm:@rollup/wasm-node@4.57.1"

@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

I think we can provide two package.json and use script to rename them.

@ReenigneArcher

Copy link
Copy Markdown
Member

Can we have a second package.json that depends on the first one? And use second one only when we need the override? If we can reduce the duplication that would be ideal.

@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

Or we can build them on a unified CI, and the CI of each OS builder only needs to pull the static resources that have been built.

@rbqvqrbqvq mentioned this pull request Feb 8, 2026
21 tasks
@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

@ReenigneArcher It should be fix in #4687

Actions for windows build still working:
https://github.com/rbqvq/Sunshine/actions/runs/21800375818

@ReenigneArcher

Copy link
Copy Markdown
Member

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor

So the expected result should be x86/x64?

dxgi.exe is compiled by us or packed from somewhere?

@ReenigneArcher

Copy link
Copy Markdown
Member

It's compiled in our CI, from the tools directory.

Being compiled as arm64 is correct, I'm just wondering why it might be flagged for the arm64 version, but not the original version.

Not a big deal though.

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor

I think it might be website design, because most windows applications are x86/x64?

You can try other arm64 and x86/x64 exe to see if there are some clues.

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor
  • x86

EdgeUpdate.exe

Tags: peexe, signed, overlay, idle
Magic: PE32 executable (GUI) Intel 80386, for MS Windows
Target Machine: Intel 386 or later processors and compatible processors

https://www.virustotal.com/gui/file/955b5950fd92e5c5eec395b022566c9a2594ca3126d894408e2e29ba25d8b0dd/details

  • x64

bash.exe (Git For Windows)

Tags: peexe, 64bits, known-distributor, overlay, idle
Magic: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Target Machine: x64

https://www.virustotal.com/gui/file/fc362aae1f217d34d02237d99527839dd6cf85b37c7a0277109400bfa0faa594/details

  • arm64

git.exe (Git For Windows)

Tags: peexe, arm, overlay, 64bits
Magic: PE32+ executable (console) Aarch64, for MS Windows
Target Machine: ARMv8 in 64-bit mode

https://www.virustotal.com/gui/file/bede8ae74caec9ae40c20910b360f01863042b5f69aa1c09fc2946dc9a52e100/details


  • x64

dxgi-info.exe

Tags: peexe, 64bits
Magic: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Target Machine: x64

https://www.virustotal.com/gui/file/955b5950fd92e5c5eec395b022566c9a2594ca3126d894408e2e29ba25d8b0dd/details

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@rbqvq@ReenigneArcher@LizardByte-bot@cgutman@ricky8955555@Lapintam@edesonmercy123@faratech
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

build(windows): add arm64 support - #3905

Merged
ReenigneArcher merged 15 commits into
LizardByte:masterfrom
rbqvq:master
Feb 8, 2026
Merged

build(windows): add arm64 support#3905
ReenigneArcher merged 15 commits into
LizardByte:masterfrom
rbqvq:master

Conversation

@rbqvq

@rbqvqrbqvq commented May 25, 2025

Copy link
Copy Markdown
Contributor

Description

This PR adds an arm64 build for Windows.

Issues Fixed or Closed

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Dependency update (updates to dependencies)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files, e.g. .github/...)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

@rbqvq

This comment was marked as resolved.

Comment threaddocs/getting_started.md Outdated
Comment threadsrc/config.cpp
Comment threadsrc/platform/windows/audio.cpp
Comment threaddocs/building.md Outdated
Comment threaddocs/building.md Outdated
Comment threadcmake/dependencies/windows.cmake Outdated
Comment thread.github/workflows/CI.yml Outdated
Comment threaddocs/getting_started.md Outdated
@rbqvq

rbqvq commented Jun 2, 2025

Copy link
Copy Markdown
ContributorAuthor

Can we use this hardware encode? 🤔
obsproject/obs-studio#11993

@ReenigneArcher

Copy link
Copy Markdown
Member

I think MF encoder is already included with the FFmpeg build, so why not?

@rbqvq

rbqvq commented Jun 2, 2025

Copy link
Copy Markdown
ContributorAuthor

I think MF encoder is already included with the FFmpeg build, so why not?

Well, I didn't read the source code of sunshine.
This part is up to you. 🤪

@rbqvq

This comment was marked as resolved.

@ReenigneArcher

This comment was marked as resolved.

cgutman
cgutman previously requested changes Jul 5, 2025
Comment threadsrc/platform/windows/display_base.cpp Outdated
@sonarqubecloud

Copy link
Copy Markdown

@ReenigneArcherReenigneArcher mentioned this pull request Aug 22, 2025
15 tasks
@LizardByte-bot

This comment was marked as outdated.

@rbqvq

This comment was marked as outdated.

@ReenigneArcher

This comment was marked as resolved.

@LizardByte-bot

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@ReenigneArcherReenigneArcher added this to the windows-arm milestone Jan 20, 2026
@codecov

codecovBot commented Jan 21, 2026

Copy link
Copy Markdown

Bundle Report

Bundle size has no change ✅

Comment threadcmake/prep/options.cmake Outdated
@ReenigneArcher

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@rbqvq
rbqvq marked this pull request as ready for review February 3, 2026 20:15
@rbqvq

rbqvq commented Feb 3, 2026

Copy link
Copy Markdown
ContributorAuthor

All thing done.

Pre-built portable can find at https://github.com/rbqvq/Sunshine/actions/runs/21646290004

Thanks all people who works on #3905 and #4521

Delete the `#warning` emitted for non-x64 architectures in src/platform/windows/audio.cpp.
Update cmake/compile_definitions/windows.cmake to suppress specific GCC warnings when building for Windows ARM64.
Add flags to SUNSHINE_COMPILE_OPTIONS for CMAKE_SYSTEM_PROCESSOR=ARM64 to silence warnings.
- `-Wno-dll-attribute-on-redeclaration` for Boost
- `-Wno-unknown-warning-option` for ViGEmClient
- `-Wno-unused-variable` for Boost
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Replace variable-length arrays with std::vector in src/platform/windows/input.cpp and src/platform/windows/misc.cpp for safety and portability.
Add <vector> includes, allocate wide-character buffer with std::vector<WCHAR> and pass wide.data() to MultiByteToWideChar, and replace WSABUF VLA with std::vector<WSABUF> and use .data() for msg.lpBuffers.
These changes avoid non-standard VLAs and reduce stack-allocation risks.
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Drop the HMODULE dll = nullptr; declaration from src/nvenc/nvenc_d3d11_on_cuda.h.
This removes an unused module handle field from the nvenc D3D11-on-CUDA wrapper to reduce unnecessary state.
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
@rbqvq

This comment was marked as resolved.

@ReenigneArcher

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

rbqvqand others added 2 commits February 7, 2026 22:09
Add CI build for Windows ARM64.
Signed-off-by: Coia Prant <coiaprant@gmail.com>
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Add windows arm64 documents.
Signed-off-by: Coia Prant <coiaprant@gmail.com>
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
@ReenigneArcher

Copy link
Copy Markdown
Member

Thank you. Please no more force pushing.

@rbqvq

rbqvq commented Feb 7, 2026

Copy link
Copy Markdown
ContributorAuthor

Thanks, I went back to sleep.
Leave the rest to you.

Insert a 'Debug nsis' step into .github/workflows/ci-windows.yml that always runs and prints the NSISOutput.log using the msys2 shell. This captures NSIS installer build logs for troubleshooting; the step uses '|| true' to avoid failing the job. The step is placed before the existing 'Debug wix' step.
Make NSIS detailed logging conditional on the target architecture by adding NSIS_LOGSET_COMMAND (set to "LogSet on" only when CMAKE_SYSTEM_PROCESSOR matches AMD64) and using it in CPACK_NSIS_EXTRA_INSTALL_COMMANDS and CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS instead of always calling LogSet. Update docs/getting_started.md to note that the install.log under %PROGRAMFILES% is available on AMD64 only.
@sonarqubecloud

Copy link
Copy Markdown

@ReenigneArcher
ReenigneArcher merged commit d591643 into LizardByte:masterFeb 8, 2026
41 of 42 checks passed
@codecov

codecovBot commented Feb 8, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 16.66667% with 15 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (master@cdc4443). Learn more about missing BASE report.
⚠️ Report is 208 commits behind head on master.

Files with missing linesPatch %Lines
src/video.cpp37.50%3 Missing and 2 partials ⚠️
src/config.cpp0.00%4 Missing ⚠️
src/platform/windows/display_vram.cpp0.00%1 Missing and 1 partial ⚠️
src/platform/windows/input.cpp0.00%2 Missing ⚠️
src/platform/windows/misc.cpp0.00%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## master #3905 +/- ##
=========================================
Coverage ? 14.11% =========================================
Files ? 95 Lines ? 19859 Branches ? 9189 =========================================
Hits ? 2804 Misses ? 13523 Partials ? 3532 
FlagCoverage Δ
Archlinux11.19% <11.11%> (?)
FreeBSD-14.3-amd6413.23% <16.66%> (?)
Linux-AppImage11.60% <11.11%> (?)
Windows-AMD6413.48% <6.66%> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing linesCoverage Δ
src/nvenc/nvenc_d3d11_on_cuda.h0.00% <ø> (ø)
src/platform/windows/audio.cpp25.13% <ø> (ø)
src/video.h61.11% <ø> (ø)
src/platform/windows/display_vram.cpp8.93% <0.00%> (ø)
src/platform/windows/input.cpp0.63% <0.00%> (ø)
src/platform/windows/misc.cpp15.20% <0.00%> (ø)
src/config.cpp3.03% <0.00%> (ø)
src/video.cpp29.07% <37.50%> (ø)

@ReenigneArcher

Copy link
Copy Markdown
Member

@rbqvq unfortunately, now arm64 is failing in Debian/Ubuntu images.

[900](https://github.com/LizardByte/Sunshine/actions/runs/21792778237/job/62875233089#step:11:18906)
#35 7492.4 ✓ 7 modules transformed.
#35 7492.4 ✗ Build failed in 4.68s
#35 7492.4 error during build:
#35 7492.4 byte length of Uint32Array should be a multiple of 4
#35 7492.4 at new Uint32Array (<anonymous>)
#35 7492.4 at getAstBuffer (file:///build/sunshine/node_modules/rollup/dist/es/shared/parseAst.js:2073:19)
#35 7492.4 at convertProgram (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:15677:48)
#35 7492.4 at Module.setSource (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:17392:24)
#35 7492.4 at async ModuleLoader.addModuleSource (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:21474:13)
#35 7492.4 ninja: build stopped: subcommand failed.
#35 ERROR: process "/bin/bash -o pipefail -c /dev/pipes/_BUILD" did not complete successfully: exit code: 1

We don't build these for PRs because they take 3+ hours. Do you have some idea how we can conditionally use these additions to the package.json?

"@rollup/wasm-node": "4.57.1"},"overrides": {
"rollup": "npm:@rollup/wasm-node@4.57.1"

@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

I think we can provide two package.json and use script to rename them.

@ReenigneArcher

Copy link
Copy Markdown
Member

Can we have a second package.json that depends on the first one? And use second one only when we need the override? If we can reduce the duplication that would be ideal.

@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

Or we can build them on a unified CI, and the CI of each OS builder only needs to pull the static resources that have been built.

@rbqvqrbqvq mentioned this pull request Feb 8, 2026
21 tasks
@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

@ReenigneArcher It should be fix in #4687

Actions for windows build still working:
https://github.com/rbqvq/Sunshine/actions/runs/21800375818

@ReenigneArcher

Copy link
Copy Markdown
Member

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor

So the expected result should be x86/x64?

dxgi.exe is compiled by us or packed from somewhere?

@ReenigneArcher

Copy link
Copy Markdown
Member

It's compiled in our CI, from the tools directory.

Being compiled as arm64 is correct, I'm just wondering why it might be flagged for the arm64 version, but not the original version.

Not a big deal though.

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor

I think it might be website design, because most windows applications are x86/x64?

You can try other arm64 and x86/x64 exe to see if there are some clues.

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor
  • x86

EdgeUpdate.exe

Tags: peexe, signed, overlay, idle
Magic: PE32 executable (GUI) Intel 80386, for MS Windows
Target Machine: Intel 386 or later processors and compatible processors

https://www.virustotal.com/gui/file/955b5950fd92e5c5eec395b022566c9a2594ca3126d894408e2e29ba25d8b0dd/details

  • x64

bash.exe (Git For Windows)

Tags: peexe, 64bits, known-distributor, overlay, idle
Magic: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Target Machine: x64

https://www.virustotal.com/gui/file/fc362aae1f217d34d02237d99527839dd6cf85b37c7a0277109400bfa0faa594/details

  • arm64

git.exe (Git For Windows)

Tags: peexe, arm, overlay, 64bits
Magic: PE32+ executable (console) Aarch64, for MS Windows
Target Machine: ARMv8 in 64-bit mode

https://www.virustotal.com/gui/file/bede8ae74caec9ae40c20910b360f01863042b5f69aa1c09fc2946dc9a52e100/details


  • x64

dxgi-info.exe

Tags: peexe, 64bits
Magic: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Target Machine: x64

https://www.virustotal.com/gui/file/955b5950fd92e5c5eec395b022566c9a2594ca3126d894408e2e29ba25d8b0dd/details

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@rbqvq@ReenigneArcher@LizardByte-bot@cgutman@ricky8955555@Lapintam@edesonmercy123@faratech
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

build(windows): add arm64 support - #3905

Merged
ReenigneArcher merged 15 commits into
LizardByte:masterfrom
rbqvq:master
Feb 8, 2026
Merged

build(windows): add arm64 support#3905
ReenigneArcher merged 15 commits into
LizardByte:masterfrom
rbqvq:master

Conversation

@rbqvq

@rbqvqrbqvq commented May 25, 2025

Copy link
Copy Markdown
Contributor

Description

This PR adds an arm64 build for Windows.

Issues Fixed or Closed

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Dependency update (updates to dependencies)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files, e.g. .github/...)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

@rbqvq

This comment was marked as resolved.

Comment threaddocs/getting_started.md Outdated
Comment threadsrc/config.cpp
Comment threadsrc/platform/windows/audio.cpp
Comment threaddocs/building.md Outdated
Comment threaddocs/building.md Outdated
Comment threadcmake/dependencies/windows.cmake Outdated
Comment thread.github/workflows/CI.yml Outdated
Comment threaddocs/getting_started.md Outdated
@rbqvq

rbqvq commented Jun 2, 2025

Copy link
Copy Markdown
ContributorAuthor

Can we use this hardware encode? 🤔
obsproject/obs-studio#11993

@ReenigneArcher

Copy link
Copy Markdown
Member

I think MF encoder is already included with the FFmpeg build, so why not?

@rbqvq

rbqvq commented Jun 2, 2025

Copy link
Copy Markdown
ContributorAuthor

I think MF encoder is already included with the FFmpeg build, so why not?

Well, I didn't read the source code of sunshine.
This part is up to you. 🤪

@rbqvq

This comment was marked as resolved.

@ReenigneArcher

This comment was marked as resolved.

cgutman
cgutman previously requested changes Jul 5, 2025
Comment threadsrc/platform/windows/display_base.cpp Outdated
@sonarqubecloud

Copy link
Copy Markdown

@ReenigneArcherReenigneArcher mentioned this pull request Aug 22, 2025
15 tasks
@LizardByte-bot

This comment was marked as outdated.

@rbqvq

This comment was marked as outdated.

@ReenigneArcher

This comment was marked as resolved.

@LizardByte-bot

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@ReenigneArcherReenigneArcher added this to the windows-arm milestone Jan 20, 2026
@codecov

codecovBot commented Jan 21, 2026

Copy link
Copy Markdown

Bundle Report

Bundle size has no change ✅

Comment threadcmake/prep/options.cmake Outdated
@ReenigneArcher

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@rbqvq
rbqvq marked this pull request as ready for review February 3, 2026 20:15
@rbqvq

rbqvq commented Feb 3, 2026

Copy link
Copy Markdown
ContributorAuthor

All thing done.

Pre-built portable can find at https://github.com/rbqvq/Sunshine/actions/runs/21646290004

Thanks all people who works on #3905 and #4521

Delete the `#warning` emitted for non-x64 architectures in src/platform/windows/audio.cpp.
Update cmake/compile_definitions/windows.cmake to suppress specific GCC warnings when building for Windows ARM64.
Add flags to SUNSHINE_COMPILE_OPTIONS for CMAKE_SYSTEM_PROCESSOR=ARM64 to silence warnings.
- `-Wno-dll-attribute-on-redeclaration` for Boost
- `-Wno-unknown-warning-option` for ViGEmClient
- `-Wno-unused-variable` for Boost
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Replace variable-length arrays with std::vector in src/platform/windows/input.cpp and src/platform/windows/misc.cpp for safety and portability.
Add <vector> includes, allocate wide-character buffer with std::vector<WCHAR> and pass wide.data() to MultiByteToWideChar, and replace WSABUF VLA with std::vector<WSABUF> and use .data() for msg.lpBuffers.
These changes avoid non-standard VLAs and reduce stack-allocation risks.
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Drop the HMODULE dll = nullptr; declaration from src/nvenc/nvenc_d3d11_on_cuda.h.
This removes an unused module handle field from the nvenc D3D11-on-CUDA wrapper to reduce unnecessary state.
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
@rbqvq

This comment was marked as resolved.

@ReenigneArcher

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

rbqvqand others added 2 commits February 7, 2026 22:09
Add CI build for Windows ARM64.
Signed-off-by: Coia Prant <coiaprant@gmail.com>
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Add windows arm64 documents.
Signed-off-by: Coia Prant <coiaprant@gmail.com>
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
@ReenigneArcher

Copy link
Copy Markdown
Member

Thank you. Please no more force pushing.

@rbqvq

rbqvq commented Feb 7, 2026

Copy link
Copy Markdown
ContributorAuthor

Thanks, I went back to sleep.
Leave the rest to you.

Insert a 'Debug nsis' step into .github/workflows/ci-windows.yml that always runs and prints the NSISOutput.log using the msys2 shell. This captures NSIS installer build logs for troubleshooting; the step uses '|| true' to avoid failing the job. The step is placed before the existing 'Debug wix' step.
Make NSIS detailed logging conditional on the target architecture by adding NSIS_LOGSET_COMMAND (set to "LogSet on" only when CMAKE_SYSTEM_PROCESSOR matches AMD64) and using it in CPACK_NSIS_EXTRA_INSTALL_COMMANDS and CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS instead of always calling LogSet. Update docs/getting_started.md to note that the install.log under %PROGRAMFILES% is available on AMD64 only.
@sonarqubecloud

Copy link
Copy Markdown

@ReenigneArcher
ReenigneArcher merged commit d591643 into LizardByte:masterFeb 8, 2026
41 of 42 checks passed
@codecov

codecovBot commented Feb 8, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 16.66667% with 15 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (master@cdc4443). Learn more about missing BASE report.
⚠️ Report is 208 commits behind head on master.

Files with missing linesPatch %Lines
src/video.cpp37.50%3 Missing and 2 partials ⚠️
src/config.cpp0.00%4 Missing ⚠️
src/platform/windows/display_vram.cpp0.00%1 Missing and 1 partial ⚠️
src/platform/windows/input.cpp0.00%2 Missing ⚠️
src/platform/windows/misc.cpp0.00%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## master #3905 +/- ##
=========================================
Coverage ? 14.11% =========================================
Files ? 95 Lines ? 19859 Branches ? 9189 =========================================
Hits ? 2804 Misses ? 13523 Partials ? 3532 
FlagCoverage Δ
Archlinux11.19% <11.11%> (?)
FreeBSD-14.3-amd6413.23% <16.66%> (?)
Linux-AppImage11.60% <11.11%> (?)
Windows-AMD6413.48% <6.66%> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing linesCoverage Δ
src/nvenc/nvenc_d3d11_on_cuda.h0.00% <ø> (ø)
src/platform/windows/audio.cpp25.13% <ø> (ø)
src/video.h61.11% <ø> (ø)
src/platform/windows/display_vram.cpp8.93% <0.00%> (ø)
src/platform/windows/input.cpp0.63% <0.00%> (ø)
src/platform/windows/misc.cpp15.20% <0.00%> (ø)
src/config.cpp3.03% <0.00%> (ø)
src/video.cpp29.07% <37.50%> (ø)

@ReenigneArcher

Copy link
Copy Markdown
Member

@rbqvq unfortunately, now arm64 is failing in Debian/Ubuntu images.

[900](https://github.com/LizardByte/Sunshine/actions/runs/21792778237/job/62875233089#step:11:18906)
#35 7492.4 ✓ 7 modules transformed.
#35 7492.4 ✗ Build failed in 4.68s
#35 7492.4 error during build:
#35 7492.4 byte length of Uint32Array should be a multiple of 4
#35 7492.4 at new Uint32Array (<anonymous>)
#35 7492.4 at getAstBuffer (file:///build/sunshine/node_modules/rollup/dist/es/shared/parseAst.js:2073:19)
#35 7492.4 at convertProgram (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:15677:48)
#35 7492.4 at Module.setSource (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:17392:24)
#35 7492.4 at async ModuleLoader.addModuleSource (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:21474:13)
#35 7492.4 ninja: build stopped: subcommand failed.
#35 ERROR: process "/bin/bash -o pipefail -c /dev/pipes/_BUILD" did not complete successfully: exit code: 1

We don't build these for PRs because they take 3+ hours. Do you have some idea how we can conditionally use these additions to the package.json?

"@rollup/wasm-node": "4.57.1"},"overrides": {
"rollup": "npm:@rollup/wasm-node@4.57.1"

@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

I think we can provide two package.json and use script to rename them.

@ReenigneArcher

Copy link
Copy Markdown
Member

Can we have a second package.json that depends on the first one? And use second one only when we need the override? If we can reduce the duplication that would be ideal.

@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

Or we can build them on a unified CI, and the CI of each OS builder only needs to pull the static resources that have been built.

@rbqvqrbqvq mentioned this pull request Feb 8, 2026
21 tasks
@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

@ReenigneArcher It should be fix in #4687

Actions for windows build still working:
https://github.com/rbqvq/Sunshine/actions/runs/21800375818

@ReenigneArcher

Copy link
Copy Markdown
Member

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor

So the expected result should be x86/x64?

dxgi.exe is compiled by us or packed from somewhere?

@ReenigneArcher

Copy link
Copy Markdown
Member

It's compiled in our CI, from the tools directory.

Being compiled as arm64 is correct, I'm just wondering why it might be flagged for the arm64 version, but not the original version.

Not a big deal though.

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor

I think it might be website design, because most windows applications are x86/x64?

You can try other arm64 and x86/x64 exe to see if there are some clues.

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor
  • x86

EdgeUpdate.exe

Tags: peexe, signed, overlay, idle
Magic: PE32 executable (GUI) Intel 80386, for MS Windows
Target Machine: Intel 386 or later processors and compatible processors

https://www.virustotal.com/gui/file/955b5950fd92e5c5eec395b022566c9a2594ca3126d894408e2e29ba25d8b0dd/details

  • x64

bash.exe (Git For Windows)

Tags: peexe, 64bits, known-distributor, overlay, idle
Magic: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Target Machine: x64

https://www.virustotal.com/gui/file/fc362aae1f217d34d02237d99527839dd6cf85b37c7a0277109400bfa0faa594/details

  • arm64

git.exe (Git For Windows)

Tags: peexe, arm, overlay, 64bits
Magic: PE32+ executable (console) Aarch64, for MS Windows
Target Machine: ARMv8 in 64-bit mode

https://www.virustotal.com/gui/file/bede8ae74caec9ae40c20910b360f01863042b5f69aa1c09fc2946dc9a52e100/details


  • x64

dxgi-info.exe

Tags: peexe, 64bits
Magic: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Target Machine: x64

https://www.virustotal.com/gui/file/955b5950fd92e5c5eec395b022566c9a2594ca3126d894408e2e29ba25d8b0dd/details

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@rbqvq@ReenigneArcher@LizardByte-bot@cgutman@ricky8955555@Lapintam@edesonmercy123@faratech
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

build(windows): add arm64 support - #3905

Merged
ReenigneArcher merged 15 commits into
LizardByte:masterfrom
rbqvq:master
Feb 8, 2026
Merged

build(windows): add arm64 support#3905
ReenigneArcher merged 15 commits into
LizardByte:masterfrom
rbqvq:master

Conversation

@rbqvq

@rbqvqrbqvq commented May 25, 2025

Copy link
Copy Markdown
Contributor

Description

This PR adds an arm64 build for Windows.

Issues Fixed or Closed

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Dependency update (updates to dependencies)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files, e.g. .github/...)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

@rbqvq

This comment was marked as resolved.

Comment threaddocs/getting_started.md Outdated
Comment threadsrc/config.cpp
Comment threadsrc/platform/windows/audio.cpp
Comment threaddocs/building.md Outdated
Comment threaddocs/building.md Outdated
Comment threadcmake/dependencies/windows.cmake Outdated
Comment thread.github/workflows/CI.yml Outdated
Comment threaddocs/getting_started.md Outdated
@rbqvq

rbqvq commented Jun 2, 2025

Copy link
Copy Markdown
ContributorAuthor

Can we use this hardware encode? 🤔
obsproject/obs-studio#11993

@ReenigneArcher

Copy link
Copy Markdown
Member

I think MF encoder is already included with the FFmpeg build, so why not?

@rbqvq

rbqvq commented Jun 2, 2025

Copy link
Copy Markdown
ContributorAuthor

I think MF encoder is already included with the FFmpeg build, so why not?

Well, I didn't read the source code of sunshine.
This part is up to you. 🤪

@rbqvq

This comment was marked as resolved.

@ReenigneArcher

This comment was marked as resolved.

cgutman
cgutman previously requested changes Jul 5, 2025
Comment threadsrc/platform/windows/display_base.cpp Outdated
@sonarqubecloud

Copy link
Copy Markdown

@ReenigneArcherReenigneArcher mentioned this pull request Aug 22, 2025
15 tasks
@LizardByte-bot

This comment was marked as outdated.

@rbqvq

This comment was marked as outdated.

@ReenigneArcher

This comment was marked as resolved.

@LizardByte-bot

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@ReenigneArcherReenigneArcher added this to the windows-arm milestone Jan 20, 2026
@codecov

codecovBot commented Jan 21, 2026

Copy link
Copy Markdown

Bundle Report

Bundle size has no change ✅

Comment threadcmake/prep/options.cmake Outdated
@ReenigneArcher

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

@rbqvq
rbqvq marked this pull request as ready for review February 3, 2026 20:15
@rbqvq

rbqvq commented Feb 3, 2026

Copy link
Copy Markdown
ContributorAuthor

All thing done.

Pre-built portable can find at https://github.com/rbqvq/Sunshine/actions/runs/21646290004

Thanks all people who works on #3905 and #4521

Delete the `#warning` emitted for non-x64 architectures in src/platform/windows/audio.cpp.
Update cmake/compile_definitions/windows.cmake to suppress specific GCC warnings when building for Windows ARM64.
Add flags to SUNSHINE_COMPILE_OPTIONS for CMAKE_SYSTEM_PROCESSOR=ARM64 to silence warnings.
- `-Wno-dll-attribute-on-redeclaration` for Boost
- `-Wno-unknown-warning-option` for ViGEmClient
- `-Wno-unused-variable` for Boost
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Replace variable-length arrays with std::vector in src/platform/windows/input.cpp and src/platform/windows/misc.cpp for safety and portability.
Add <vector> includes, allocate wide-character buffer with std::vector<WCHAR> and pass wide.data() to MultiByteToWideChar, and replace WSABUF VLA with std::vector<WSABUF> and use .data() for msg.lpBuffers.
These changes avoid non-standard VLAs and reduce stack-allocation risks.
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Drop the HMODULE dll = nullptr; declaration from src/nvenc/nvenc_d3d11_on_cuda.h.
This removes an unused module handle field from the nvenc D3D11-on-CUDA wrapper to reduce unnecessary state.
Signed-off-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
@rbqvq

This comment was marked as resolved.

@ReenigneArcher

This comment was marked as resolved.

@rbqvq

This comment was marked as resolved.

rbqvqand others added 2 commits February 7, 2026 22:09
Add CI build for Windows ARM64.
Signed-off-by: Coia Prant <coiaprant@gmail.com>
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
Add windows arm64 documents.
Signed-off-by: Coia Prant <coiaprant@gmail.com>
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
@ReenigneArcher

Copy link
Copy Markdown
Member

Thank you. Please no more force pushing.

@rbqvq

rbqvq commented Feb 7, 2026

Copy link
Copy Markdown
ContributorAuthor

Thanks, I went back to sleep.
Leave the rest to you.

Insert a 'Debug nsis' step into .github/workflows/ci-windows.yml that always runs and prints the NSISOutput.log using the msys2 shell. This captures NSIS installer build logs for troubleshooting; the step uses '|| true' to avoid failing the job. The step is placed before the existing 'Debug wix' step.
Make NSIS detailed logging conditional on the target architecture by adding NSIS_LOGSET_COMMAND (set to "LogSet on" only when CMAKE_SYSTEM_PROCESSOR matches AMD64) and using it in CPACK_NSIS_EXTRA_INSTALL_COMMANDS and CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS instead of always calling LogSet. Update docs/getting_started.md to note that the install.log under %PROGRAMFILES% is available on AMD64 only.
@sonarqubecloud

Copy link
Copy Markdown

@ReenigneArcher
ReenigneArcher merged commit d591643 into LizardByte:masterFeb 8, 2026
41 of 42 checks passed
@codecov

codecovBot commented Feb 8, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 16.66667% with 15 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (master@cdc4443). Learn more about missing BASE report.
⚠️ Report is 208 commits behind head on master.

Files with missing linesPatch %Lines
src/video.cpp37.50%3 Missing and 2 partials ⚠️
src/config.cpp0.00%4 Missing ⚠️
src/platform/windows/display_vram.cpp0.00%1 Missing and 1 partial ⚠️
src/platform/windows/input.cpp0.00%2 Missing ⚠️
src/platform/windows/misc.cpp0.00%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## master #3905 +/- ##
=========================================
Coverage ? 14.11% =========================================
Files ? 95 Lines ? 19859 Branches ? 9189 =========================================
Hits ? 2804 Misses ? 13523 Partials ? 3532 
FlagCoverage Δ
Archlinux11.19% <11.11%> (?)
FreeBSD-14.3-amd6413.23% <16.66%> (?)
Linux-AppImage11.60% <11.11%> (?)
Windows-AMD6413.48% <6.66%> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing linesCoverage Δ
src/nvenc/nvenc_d3d11_on_cuda.h0.00% <ø> (ø)
src/platform/windows/audio.cpp25.13% <ø> (ø)
src/video.h61.11% <ø> (ø)
src/platform/windows/display_vram.cpp8.93% <0.00%> (ø)
src/platform/windows/input.cpp0.63% <0.00%> (ø)
src/platform/windows/misc.cpp15.20% <0.00%> (ø)
src/config.cpp3.03% <0.00%> (ø)
src/video.cpp29.07% <37.50%> (ø)

@ReenigneArcher

Copy link
Copy Markdown
Member

@rbqvq unfortunately, now arm64 is failing in Debian/Ubuntu images.

[900](https://github.com/LizardByte/Sunshine/actions/runs/21792778237/job/62875233089#step:11:18906)
#35 7492.4 ✓ 7 modules transformed.
#35 7492.4 ✗ Build failed in 4.68s
#35 7492.4 error during build:
#35 7492.4 byte length of Uint32Array should be a multiple of 4
#35 7492.4 at new Uint32Array (<anonymous>)
#35 7492.4 at getAstBuffer (file:///build/sunshine/node_modules/rollup/dist/es/shared/parseAst.js:2073:19)
#35 7492.4 at convertProgram (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:15677:48)
#35 7492.4 at Module.setSource (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:17392:24)
#35 7492.4 at async ModuleLoader.addModuleSource (file:///build/sunshine/node_modules/rollup/dist/es/shared/node-entry.js:21474:13)
#35 7492.4 ninja: build stopped: subcommand failed.
#35 ERROR: process "/bin/bash -o pipefail -c /dev/pipes/_BUILD" did not complete successfully: exit code: 1

We don't build these for PRs because they take 3+ hours. Do you have some idea how we can conditionally use these additions to the package.json?

"@rollup/wasm-node": "4.57.1"},"overrides": {
"rollup": "npm:@rollup/wasm-node@4.57.1"

@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

I think we can provide two package.json and use script to rename them.

@ReenigneArcher

Copy link
Copy Markdown
Member

Can we have a second package.json that depends on the first one? And use second one only when we need the override? If we can reduce the duplication that would be ideal.

@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

Or we can build them on a unified CI, and the CI of each OS builder only needs to pull the static resources that have been built.

@rbqvqrbqvq mentioned this pull request Feb 8, 2026
21 tasks
@rbqvq

rbqvq commented Feb 8, 2026

Copy link
Copy Markdown
ContributorAuthor

@ReenigneArcher It should be fix in #4687

Actions for windows build still working:
https://github.com/rbqvq/Sunshine/actions/runs/21800375818

@ReenigneArcher

Copy link
Copy Markdown
Member

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor

So the expected result should be x86/x64?

dxgi.exe is compiled by us or packed from somewhere?

@ReenigneArcher

Copy link
Copy Markdown
Member

It's compiled in our CI, from the tools directory.

Being compiled as arm64 is correct, I'm just wondering why it might be flagged for the arm64 version, but not the original version.

Not a big deal though.

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor

I think it might be website design, because most windows applications are x86/x64?

You can try other arm64 and x86/x64 exe to see if there are some clues.

@rbqvq

rbqvq commented Feb 9, 2026

Copy link
Copy Markdown
ContributorAuthor
  • x86

EdgeUpdate.exe

Tags: peexe, signed, overlay, idle
Magic: PE32 executable (GUI) Intel 80386, for MS Windows
Target Machine: Intel 386 or later processors and compatible processors

https://www.virustotal.com/gui/file/955b5950fd92e5c5eec395b022566c9a2594ca3126d894408e2e29ba25d8b0dd/details

  • x64

bash.exe (Git For Windows)

Tags: peexe, 64bits, known-distributor, overlay, idle
Magic: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Target Machine: x64

https://www.virustotal.com/gui/file/fc362aae1f217d34d02237d99527839dd6cf85b37c7a0277109400bfa0faa594/details

  • arm64

git.exe (Git For Windows)

Tags: peexe, arm, overlay, 64bits
Magic: PE32+ executable (console) Aarch64, for MS Windows
Target Machine: ARMv8 in 64-bit mode

https://www.virustotal.com/gui/file/bede8ae74caec9ae40c20910b360f01863042b5f69aa1c09fc2946dc9a52e100/details


  • x64

dxgi-info.exe

Tags: peexe, 64bits
Magic: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Target Machine: x64

https://www.virustotal.com/gui/file/955b5950fd92e5c5eec395b022566c9a2594ca3126d894408e2e29ba25d8b0dd/details

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@rbqvq@ReenigneArcher@LizardByte-bot@cgutman@ricky8955555@Lapintam@edesonmercy123@faratech