Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
b261a1b
refactor: fix sonar cpp:S936 (#5905)
ReenigneArcher Oct 12, 2026
5c2fd03
chore(deps): lock file maintenance (#5861)
renovate[bot] Oct 12, 2026
73a8a58
refactor: resolve Sonar cpp:S5416 findings (#5906)
ReenigneArcher Oct 12, 2026
7c97a08
chore(deps): update devdependencies (non-major) (#5904)
renovate[bot] Oct 12, 2026
36ccab4
build(deps): bump third-party/dockle from `c1304a7` to `13ef435` (#5907)
dependabot[bot] Oct 12, 2026
e2a56b3
refactor: resolve Sonar cpp:S1117 findings (#5908)
ReenigneArcher Oct 13, 2026
1925909
refactor: resolve Sonar cpp:S5008 findings (#5909)
ReenigneArcher Oct 13, 2026
6b7c6c2
chore(deps): update dependency vue to v3.5.44 (#5910)
renovate[bot] Oct 13, 2026
d492aa5
chore(deps): update dependency @lucide/vue to v1.56.0 (#5911)
renovate[bot] Oct 13, 2026
7c124b4
refactor: resolve Sonar cpp:S6022 findings (#5912)
ReenigneArcher Oct 13, 2026
3710a23
refactor: resolve Sonar cpp:S1172 findings (#5916)
ReenigneArcher Oct 13, 2026
c33f3b4
fix(pairing): replace abandoned in-progress session on retried getser…
rune-oai Oct 13, 2026
601a9f5
fix(web): fall back for malformed localization messages (#5920)
ReenigneArcher Oct 14, 2026
1c51ac0
chore(l10n): update translations (#5900)
LizardByte-bot Oct 14, 2026
bc188c2
fix(upnp): accept disconnected IGD status from MiniUPnPc 2.2.8+ (#5913)
rune-oai Oct 14, 2026
75d3897
fix(ci): stabilize web tests and retain coverage on failure (#5921)
ReenigneArcher Oct 14, 2026
b50c7ba
refactor: resolve Sonar constructor and initialization findings (#5922)
ReenigneArcher Oct 14, 2026
71a5a90
refactor: resolve Sonar scope and binding findings (#5926)
ReenigneArcher Oct 14, 2026
5710474
chore(deps): update dependency @lucide/vue to v1.57.0 (#5924)
renovate[bot] Oct 14, 2026
81a677c
fix(linux): link matching bundled libva libraries (#5918)
ReenigneArcher Oct 14, 2026
80588de
refactor: modernize standard library usage across six Sonar rules (#5…
ReenigneArcher Oct 14, 2026
a178f46
build(deps): bump third-party/moonlight-common-c from `f900dd4` to `5…
dependabot[bot] Oct 14, 2026
2e4d4f5
refactor(web): resolve CSS important rule violations (#5932)
ReenigneArcher Oct 15, 2026
a36b9f8
refactor: clarify C++ declarations across 13 Sonar rules (#5934)
ReenigneArcher Oct 15, 2026
f86c4c9
fix(utility): bound from_hex to the size of the target type (#5933)
Dev-next-gen Oct 15, 2026
c732a81
refactor: clarify optional checks, reduce copies, and tighten macro s…
ReenigneArcher Oct 15, 2026
d288b3b
docs(configuration): Add missing entry for portal capture and clarify…
Kishi85 Oct 15, 2026
178a046
build(deps): bump third-party/moonlight-common-c from `5ec8397` to `a…
dependabot[bot] Oct 15, 2026
55ff34e
feat(linux): fall back to RAM bridge when capture node is not NVIDIA …
mikefaille Oct 15, 2026
3d890ea
fix(mdns): advertise only served addresses on Linux (#5914)
rune-oai Oct 16, 2026
f78c578
build(deps): bump third-party/libvirtualhid from `ecc8291` to `dfff3e…
dependabot[bot] Oct 16, 2026
5b2a4cf
chore(deps): update dependency @lucide/vue to v1.58.0 (#5945)
renovate[bot] Oct 16, 2026
0037e50
Merge upstream Sunshine master into webrtc-tizen
mlopezsegura Oct 16, 2026
e310478
ci(webrtc): publish Windows pre-releases from this fork
mlopezsegura Oct 19, 2026
6d96bef
fix(webrtc): build libdatachannel with libc++ on Windows ARM64
mlopezsegura Oct 19, 2026
d3fe9ff
chore(webrtc): regenerate patches on upstream 5b2a4cfd
mlopezsegura Oct 19, 2026
4884ac4
Merge branch 'master' into webrtc-tizen
mlopezsegura Oct 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions .github/workflows/ci-flatpak.yml
Original file line number Diff line number Diff line change
Expand Up @@ -145,11 +145,25 @@ jobs:
--no-header \
--output-file glad-requirements.txt

# Install all exported Python dependencies under /app without modifying the SDK.
ignore_installed="$(
uv run --locked --no-build --no-sync python - <<'PY'
from pathlib import Path

import requirements

with Path("glad-requirements.txt").open(encoding="utf-8") as requirements_file:
packages = requirements.parse(requirements_file)
print(",".join(sorted({package.name.casefold() for package in packages if package.name})))
PY
)"

uv run --locked --no-build --no-sync python \
./packaging/linux/flatpak/deps/flatpak-builder-tools/pip/flatpak-pip-generator.py \
--runtime="org.kde.Sdk//${KDE_PLATFORM_VERSION}" \
--output glad-dependencies \
--build-only \
--ignore-installed="${ignore_installed}" \
--requirements-file=glad-requirements.txt

# Copy generated pip sources into build dir alongside the manifest
Expand Down
7 changes: 6 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,12 @@ the build directory.

The project uses gtest as a test framework.

Add or update tests for new or modified methods and code. Target 100% coverage on changed code.
Add or update regression tests for new or modified source-code methods and behavior.
Target 100% coverage on changed source code.

The regression-test requirement does not apply to build-system files, such as CMake scripts and dependency configuration.
Validate build-system changes with appropriate configuration, build, and lint checks.
Do not add dedicated build-system regression-test projects or fixtures for these changes.

## Python tooling and formatting

Expand Down
4 changes: 2 additions & 2 deletions PATCHES.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ how to carry it to a newer Sunshine. The user-facing guide is

| | |
|---|---|
| Upstream base | `0594f62d` — *chore: update global workflows (#5868)*, tag `v2026.1006.152353` |
| Upstream base | `5b2a4cfd` — *chore(deps): update dependency @lucide/vue to v1.58.0 (#5945)*, after tag `v2026.1015.174736` |
| Fork branch | `master` (development on `webrtc-tizen`) |
| WebRTC library | libdatachannel v0.24.6, built from source when no system package exists |
| Footprint in upstream files | 17 files, +441 / −14 lines; the rest is new files |
Expand Down Expand Up @@ -80,7 +80,7 @@ only when no Moonlight session and no other TV stream is running, and calls

| File | Change |
|---|---|
| `cmake/dependencies/libdatachannel.cmake` (new) | Uses a system `LibDataChannel` ≥ 0.24 when available, otherwise `FetchContent` of v0.24.6 with its `plog`, `usrsctp`, `libjuice` and `libsrtp` submodules, built static, with OpenSSL (Sunshine's), media and WebSocket support, and no examples or tests. libSRTP's `ENABLE_WARNINGS_AS_ERRORS` is turned off because MinGW printf-format warnings break it, and Sunshine's own nlohmann_json is reused. |
| `cmake/dependencies/libdatachannel.cmake` (new) | Uses a system `LibDataChannel` ≥ 0.24 when available, otherwise `FetchContent` of v0.24.6 with its `plog`, `usrsctp`, `libjuice` and `libsrtp` submodules, built static, with OpenSSL (Sunshine's), media and WebSocket support, and no examples or tests. libSRTP's `ENABLE_WARNINGS_AS_ERRORS` is turned off because MinGW printf-format warnings break it, and Sunshine's own nlohmann_json is reused. Its `src/configuration.cpp` is compiled with `-include algorithm`: v0.24.6 uses `std::transform` without including `<algorithm>`, which libc++ (Windows ARM64) does not include transitively; drop this once a newer release is used. |
| `cmake/dependencies/common.cmake` | Includes it after nlohmann_json. |
| `cmake/compile_definitions/common.cmake` | Adds `src/webrtc/*` to `SUNSHINE_TARGET_FILES` and `${SUNSHINE_LIBDATACHANNEL_TARGET}` to `SUNSHINE_EXTERNAL_LIBRARIES`. |

Expand Down
65 changes: 45 additions & 20 deletions cmake/FindLibva.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -10,29 +10,47 @@
# find_path() and find_library() calls
# cmake-format: on

find_package(PkgConfig QUIET)
if(PKG_CONFIG_FOUND)
pkg_check_modules(_LIBVA libva)
pkg_check_modules(_LIBVA_DRM libva-drm)
endif()
if(EXISTS "${FFMPEG_PREPARED_BINARIES}/lib/libva.a")
# The display context ABI is private to libva. Keep its core, DRM backend,
# and headers from the same build as FFmpeg instead of mixing system libva.
set(LIBVA_INCLUDE_DIR "${FFMPEG_PREPARED_BINARIES}/include")
set(LIBVA_LIB "${FFMPEG_PREPARED_BINARIES}/lib/libva.a")
set(LIBVA_DRM_LIB "${FFMPEG_PREPARED_BINARIES}/lib/libva-drm.a")
foreach(required_file IN ITEMS
"${LIBVA_INCLUDE_DIR}/va/va.h"
"${LIBVA_INCLUDE_DIR}/va/va_drm.h"
"${LIBVA_DRM_LIB}")
if(NOT EXISTS "${required_file}")
message(FATAL_ERROR "The bundled libva package is incomplete: missing ${required_file}")
endif()
endforeach()
# libva-drm.pc does not declare the libdrm dependency of its static archive.
find_package(LIBDRM REQUIRED)
else()
find_package(PkgConfig QUIET)
if(PKG_CONFIG_FOUND)
pkg_check_modules(_LIBVA libva)
pkg_check_modules(_LIBVA_DRM libva-drm)
endif()

find_path(
LIBVA_INCLUDE_DIR
NAMES va/va.h va/va_drm.h
HINTS ${_LIBVA_INCLUDE_DIRS}
PATHS /usr/include /usr/local/include /opt/local/include)
find_path(
LIBVA_INCLUDE_DIR
NAMES va/va.h va/va_drm.h
HINTS ${_LIBVA_INCLUDE_DIRS}
PATHS /usr/include /usr/local/include /opt/local/include)

find_library(
LIBVA_LIB
NAMES ${_LIBVA_LIBRARIES} libva
HINTS ${_LIBVA_LIBRARY_DIRS}
PATHS /usr/lib /usr/local/lib /opt/local/lib)
find_library(
LIBVA_LIB
NAMES ${_LIBVA_LIBRARIES} libva
HINTS ${_LIBVA_LIBRARY_DIRS}
PATHS /usr/lib /usr/local/lib /opt/local/lib)

find_library(
LIBVA_DRM_LIB
NAMES ${_LIBVA_DRM_LIBRARIES} libva-drm
HINTS ${_LIBVA_DRM_LIBRARY_DIRS}
PATHS /usr/lib /usr/local/lib /opt/local/lib)
find_library(
LIBVA_DRM_LIB
NAMES ${_LIBVA_DRM_LIBRARIES} libva-drm
HINTS ${_LIBVA_DRM_LIBRARY_DIRS}
PATHS /usr/lib /usr/local/lib /opt/local/lib)
endif()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Libva REQUIRED_VARS LIBVA_INCLUDE_DIR LIBVA_LIB LIBVA_DRM_LIB)
Expand Down Expand Up @@ -65,6 +83,13 @@ if(LIBVA_FOUND)
endif()

set_target_properties(Libva::drm PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${LIBVA_INCLUDE_DIRS}")
if(EXISTS "${FFMPEG_PREPARED_BINARIES}/lib/libva.a")
set_target_properties(Libva::drm PROPERTIES
INTERFACE_LINK_LIBRARIES "Libva::va;${LIBDRM_LIBRARIES}")
endif()
endif()
if(EXISTS "${FFMPEG_PREPARED_BINARIES}/lib/libva.a")
set(LIBVA_DRM_LIBRARIES Libva::drm)
endif()

endif()
10 changes: 7 additions & 3 deletions cmake/compile_definitions/linux.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,10 @@ if(CUDA_FOUND)
add_compile_definitions(SUNSHINE_BUILD_CUDA)
endif()

# libdrm is required for DRM (KMS). Only the headers are required for Wayland,
# Vulkan, and PipeWire (KWin, Portal).
# libdrm headers are required for DRM (KMS), Wayland, Vulkan, and PipeWire
# (KWin, Portal). The library itself is linked for DRM (KMS) and for Wayland,
# where capture queries the render node's PCI identity to choose between
# zero-copy VRAM and the RAM bridge.
if(${SUNSHINE_ENABLE_DRM} OR ${SUNSHINE_ENABLE_WAYLAND} OR ${SUNSHINE_ENABLE_VULKAN}
OR ${SUNSHINE_ENABLE_KWIN} OR ${SUNSHINE_ENABLE_PORTAL})
find_package(LIBDRM REQUIRED)
Expand All @@ -90,8 +92,10 @@ else()
endif()
if(LIBDRM_FOUND)
include_directories(SYSTEM ${LIBDRM_INCLUDE_DIRS})
if(${SUNSHINE_ENABLE_DRM})
if(${SUNSHINE_ENABLE_DRM} OR ${SUNSHINE_ENABLE_WAYLAND})
list(APPEND PLATFORM_LIBRARIES ${LIBDRM_LIBRARIES})
endif()
if(${SUNSHINE_ENABLE_DRM})
add_compile_definitions(SUNSHINE_BUILD_DRM)
list(APPEND PLATFORM_TARGET_FILES
"${CMAKE_SOURCE_DIR}/src/platform/linux/kmsgrab.cpp")
Expand Down
9 changes: 9 additions & 0 deletions cmake/dependencies/ffmpeg.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,15 @@ else()
list(APPEND FFMPEG_LIBRARIES ${FFMPEG_PLATFORM_LIBRARIES})
endif()

# Legacy library lists can also refer to libva backends by name. Resolve those
# names to the matching archives whenever the FFmpeg package supplies libva.
if(EXISTS "${FFMPEG_PREPARED_BINARIES}/lib/libva.a")
foreach(library IN ITEMS va va-drm va-x11)
list(TRANSFORM FFMPEG_LIBRARIES REPLACE
"^${library}$" "${FFMPEG_PREPARED_BINARIES}/lib/lib${library}.a")
endforeach()
endif()

# Shared packages supply the full static dependency list, including decoders.
# Older packages retain the library list above.
set(_sunshine_ffmpeg_pc "${FFMPEG_PREPARED_BINARIES}/lib/pkgconfig/libavcodec.pc")
Expand Down
6 changes: 6 additions & 0 deletions cmake/dependencies/libdatachannel.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,12 @@ FetchContent_MakeAvailable(libdatachannel)
set(BUILD_SHARED_LIBS "${_sunshine_build_shared_libs}")
unset(_sunshine_build_shared_libs)

# v0.24.6 uses std::transform in configuration.cpp without including <algorithm>. libstdc++ includes it
# transitively, libc++ (Windows ARM64 with clang) does not. Fixed upstream after v0.24.6.
set_source_files_properties("${libdatachannel_SOURCE_DIR}/src/configuration.cpp"
TARGET_DIRECTORY datachannel-static
PROPERTIES COMPILE_OPTIONS "-include;algorithm")

set(SUNSHINE_LIBDATACHANNEL_TARGET LibDataChannel::LibDataChannelStatic)
if(NOT TARGET ${SUNSHINE_LIBDATACHANNEL_TARGET})
set(SUNSHINE_LIBDATACHANNEL_TARGET datachannel-static)
Expand Down
4 changes: 4 additions & 0 deletions docs/building.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ Sunshine's build and packaging automation uses packaged static Boost libraries o
Ubuntu 26.04 or newer, macOS with Homebrew, Windows with MSYS2, and FreeBSD. Older supported distributions continue
to use the CPM fallback because their repositories do not meet the minimum Boost version.

When the prebuilt FFmpeg package supplies libva, Sunshine uses its bundled headers, core library, and DRM backend
together. These components share a private display-context ABI and must come from the same libva build. The system
still provides libdrm and the GPU's VA-API driver. FFmpeg packages without bundled libva use the system libva libraries.

#### Prebuilt Web UI

Sunshine releases publish the platform-independent Web UI as the `@lizardbyte/sunshine` package to npm and GitHub
Expand Down
8 changes: 7 additions & 1 deletion docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -2397,7 +2397,13 @@ consent prompt for directory ACLs, so the Web UI shows setup steps for correctin
</tr>
<tr>
<td>kwin</td>
<td>Capture with KDE/KWin Wayland compositor via KDE screencasting.
<td>Capture with KDE/KWin Wayland compositor directly via KDE screencasting.
@note{Applies to Linux only.}
@warning{Flatpak users currently shouldn't use this capture method and use `portal` instead. KWIN_WAYLAND_NO_PERMISSION_CHECKS=1 is necessary to make this capture method work with Flatpak but that has security implications.}</td>
</tr>
<tr>
<td>portal</td>
<td>Capture via XDG Desktop Portal.
@note{Applies to Linux only.}</td>
</tr>
<tr>
Expand Down
Loading
Loading