[GH-ISSUE #222] FR: HDR support #149

Open
opened 2026-10-15 12:57:10 +00:00 by bsakaguchi · 16 comments
Owner

Originally created by @Hukuma1 on GitHub (Jul 5, 2025).
Original GitHub issue: https://github.com/games-on-whales/wolf/issues/222

Running headless on a system with an iGPU (Intel(R) Core(TM) Ultra 7 265K). I am shown a message by Moonlight that my display does not support HDR. I am streaming to an HDR display (LG C4). I don't have an HDMI dummy plugged into my port because I thought I wouldn't need one? Or is that the only way to make headless HDR working?

Linux nas 6.12.32+bpo-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.32-1~bpo12+1 (2025-06-21) x86_64 GNU/Linux
services:
  wolf:
    image: ghcr.io/games-on-whales/wolf:stable
    environment:
      - XDG_RUNTIME_DIR=/tmp/sockets
      - HOST_APPS_STATE_FOLDER=/etc/wolf
      - WOLF_SOCKET_PATH=/etc/wolf/wolf.sock
    volumes:
      - /etc/wolf/:/etc/wolf
      - /tmp/sockets:/tmp/sockets:rw
      - /var/run/docker.sock:/var/run/docker.sock:rw
      - /dev/:/dev/:rw
      - /run/udev:/run/udev:rw
    device_cgroup_rules:
      - c 13:* rmw
    devices:
      - /dev/dri
      - /dev/uinput
      - /dev/uhid
    network_mode: host
    restart: unless-stopped
root@nas:~# ls /dev/dri
by-path  card0  renderD128
(wolf:1): GStreamer-CRITICAL **: 16:15:38.043: Bus bus16 already has a GSource watch
0:20:58.993690172     1 0x7f1354007650 WARN                basesink gstbasesink.c:1248:gst_base_sink_query_latency:<2635193443969945247_video> warning: Pipeline construction is invalid, please add queues.
0:20:58.993697186     1 0x7f1354007650 WARN                basesink gstbasesink.c:1248:gst_base_sink_query_latency:<2635193443969945247_video> warning: Not enough buffering available for  the processing deadline of 0:00:00.020000000, add enough queues to buffer  0:00:00.020000000 additional data. Shortening processing latency to 0:00:00.000000000.
15:15:38.066666763 INFO  | Wayland display ready, listening on: wayland-1
Unsupported modifier, resource creation failed.
2025-07-05T15:15:38.072930Z  WARN waylanddisplaycore::utils::allocator: Failed to create buffer with modifier I915_y_tiled, trying workaround modifier
0:20:59.058593357     1 0x7f1364001070 WARN              qsvencoder gstqsvencoder.cpp:1115:gst_qsv_encoder_init_encode_session:<qsvh265enc2> MFXVideoENCODE::Query returned warning 5 (MFX_WRN_INCOMPATIBLE_VIDEO_PARAM)
15:15:38.165265994 INFO  | [DOCKER] Starting container: /WolfES-DE_2635193443969945247
0:20:59.103794732     1 0x7f1364001070 WARN                 basesrc gstbasesrc.c:4255:gst_base_src_push_segment:<interpipesrc2> segment format mismatched, ignore
0:21:00.976689643     1 0x7f13640022f0 WARN                 basesrc gstbasesrc.c:4255:gst_base_src_push_segment:<interpipesrc3> segment format mismatched, ignore
0:21:46.822733687     1 0x7f1308001ae0 WARN                audiosrc gstaudiosrc.c:227:audioringbuffer_thread_func:<pulsesrc1> error reading data -1 (reason: Success), skipping segment
15:16:26.165445152 INFO  | Stopped container: /WolfES-DE_2635193443969945247
root@nas:~# lsmod | grep i915
i915                 4325376  18
drm_buddy              20480  2 xe,i915
drm_display_helper    270336  2 xe,i915
cec                    69632  3 drm_display_helper,xe,i915
ttm                   102400  3 drm_ttm_helper,xe,i915
drm_kms_helper        249856  5 drm_shmem_helper,drm_display_helper,drm_ttm_helper,xe,i915
i2c_algo_bit           12288  2 xe,i915
drm                   765952  27 gpu_sched,intel_vpu,drm_kms_helper,drm_exec,drm_gpuvm,drm_suballoc_helper,drm_shmem_helper,drm_display_helper,drm_buddy,drm_ttm_helper,xe,i915,ttm
video                  81920  2 xe,i915

I don't have vainfo installed but maybe the Jellyfin output is helpful? It confirms my HWA is working in Jellyfin along with the Intel driver version:

root@nas:~# docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/vainfo
Trying display: drm
libva info: VA-API version 1.22.0
libva info: Trying to open /usr/lib/jellyfin-ffmpeg/lib/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_22
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.22 (libva 2.22.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 25.1.0 (aa5ca48)
root@nas:~# docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/ffmpeg -v verbose -init_hw_device vaapi=va -init_hw_device opencl@va
ffmpeg version 7.0.2-Jellyfin Copyright (c) 2000-2024 the FFmpeg developers
  built with gcc 12 (Debian 12.2.0-14)
  configuration: --prefix=/usr/lib/jellyfin-ffmpeg --target-os=linux --extra-version=Jellyfin --disable-doc --disable-ffplay --disable-ptx-compression --disable-static --disable-libxcb --disable-sdl2 --disable-xlib --enable-lto=auto --enable-gpl --enable-version3 --enable-shared --enable-gmp --enable-gnutls --enable-chromaprint --enable-opencl --enable-libdrm --enable-libxml2 --enable-libass --enable-libfreetype --enable-libfribidi --enable-libfontconfig --enable-libharfbuzz --enable-libbluray --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libopenmpt --enable-libdav1d --enable-libsvtav1 --enable-libwebp --enable-libvpx --enable-libx264 --enable-libx265 --enable-libzvbi --enable-libzimg --enable-libfdk-aac --arch=amd64 --enable-libshaderc --enable-libplacebo --enable-vulkan --enable-vaapi --enable-amf --enable-libvpl --enable-ffnvcodec --enable-cuda --enable-cuda-llvm --enable-cuvid --enable-nvdec --enable-nvenc
  libavutil      59.  8.100 / 59.  8.100
  libavcodec     61.  3.100 / 61.  3.100
  libavformat    61.  1.100 / 61.  1.100
  libavdevice    61.  1.100 / 61.  1.100
  libavfilter    10.  1.100 / 10.  1.100
  libswscale      8.  1.100 /  8.  1.100
  libswresample   5.  1.100 /  5.  1.100
  libpostproc    58.  1.100 / 58.  1.100
[AVHWDeviceContext @ 0x557c29cda0c0] Trying to use DRM render node for device 0.
[AVHWDeviceContext @ 0x557c29cda0c0] libva: VA-API version 1.22.0
[AVHWDeviceContext @ 0x557c29cda0c0] libva: Trying to open /usr/lib/jellyfin-ffmpeg/lib/dri/iHD_drv_video.so
[AVHWDeviceContext @ 0x557c29cda0c0] libva: Found init function __vaDriverInit_1_22
[AVHWDeviceContext @ 0x557c29cda0c0] libva: va_openDriver() returns 0
[AVHWDeviceContext @ 0x557c29cda0c0] Initialised VAAPI connection: version 1.22
[AVHWDeviceContext @ 0x557c29cda0c0] VAAPI driver: Intel iHD driver for Intel(R) Gen Graphics - 25.1.0 (aa5ca48).
[AVHWDeviceContext @ 0x557c29cda0c0] Driver not found in known nonstandard list, using standard behaviour.
[AVHWDeviceContext @ 0x557c29d19bc0] 0.0: Intel(R) OpenCL Graphics / Intel(R) Graphics
[AVHWDeviceContext @ 0x557c29d19bc0] Intel QSV to OpenCL mapping function found (clCreateFromVA_APIMediaSurfaceINTEL).
[AVHWDeviceContext @ 0x557c29d19bc0] Intel QSV in OpenCL acquire function found (clEnqueueAcquireVA_APIMediaSurfacesINTEL).
[AVHWDeviceContext @ 0x557c29d19bc0] Intel QSV in OpenCL release function found (clEnqueueReleaseVA_APIMediaSurfacesINTEL).
Originally created by @Hukuma1 on GitHub (Jul 5, 2025). Original GitHub issue: https://github.com/games-on-whales/wolf/issues/222 Running headless on a system with an iGPU (Intel(R) Core(TM) Ultra 7 265K). I am shown a message by Moonlight that my display does not support HDR. I am streaming to an HDR display (LG C4). I don't have an HDMI dummy plugged into my port because I thought I wouldn't need one? Or is that the only way to make headless HDR working? ``` Linux nas 6.12.32+bpo-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.32-1~bpo12+1 (2025-06-21) x86_64 GNU/Linux ``` ``` services: wolf: image: ghcr.io/games-on-whales/wolf:stable environment: - XDG_RUNTIME_DIR=/tmp/sockets - HOST_APPS_STATE_FOLDER=/etc/wolf - WOLF_SOCKET_PATH=/etc/wolf/wolf.sock volumes: - /etc/wolf/:/etc/wolf - /tmp/sockets:/tmp/sockets:rw - /var/run/docker.sock:/var/run/docker.sock:rw - /dev/:/dev/:rw - /run/udev:/run/udev:rw device_cgroup_rules: - c 13:* rmw devices: - /dev/dri - /dev/uinput - /dev/uhid network_mode: host restart: unless-stopped ``` ``` root@nas:~# ls /dev/dri by-path card0 renderD128 ``` ``` (wolf:1): GStreamer-CRITICAL **: 16:15:38.043: Bus bus16 already has a GSource watch 0:20:58.993690172 1 0x7f1354007650 WARN basesink gstbasesink.c:1248:gst_base_sink_query_latency:<2635193443969945247_video> warning: Pipeline construction is invalid, please add queues. 0:20:58.993697186 1 0x7f1354007650 WARN basesink gstbasesink.c:1248:gst_base_sink_query_latency:<2635193443969945247_video> warning: Not enough buffering available for the processing deadline of 0:00:00.020000000, add enough queues to buffer 0:00:00.020000000 additional data. Shortening processing latency to 0:00:00.000000000. 15:15:38.066666763 INFO | Wayland display ready, listening on: wayland-1 Unsupported modifier, resource creation failed. 2025-07-05T15:15:38.072930Z WARN waylanddisplaycore::utils::allocator: Failed to create buffer with modifier I915_y_tiled, trying workaround modifier 0:20:59.058593357 1 0x7f1364001070 WARN qsvencoder gstqsvencoder.cpp:1115:gst_qsv_encoder_init_encode_session:<qsvh265enc2> MFXVideoENCODE::Query returned warning 5 (MFX_WRN_INCOMPATIBLE_VIDEO_PARAM) 15:15:38.165265994 INFO | [DOCKER] Starting container: /WolfES-DE_2635193443969945247 0:20:59.103794732 1 0x7f1364001070 WARN basesrc gstbasesrc.c:4255:gst_base_src_push_segment:<interpipesrc2> segment format mismatched, ignore 0:21:00.976689643 1 0x7f13640022f0 WARN basesrc gstbasesrc.c:4255:gst_base_src_push_segment:<interpipesrc3> segment format mismatched, ignore 0:21:46.822733687 1 0x7f1308001ae0 WARN audiosrc gstaudiosrc.c:227:audioringbuffer_thread_func:<pulsesrc1> error reading data -1 (reason: Success), skipping segment 15:16:26.165445152 INFO | Stopped container: /WolfES-DE_2635193443969945247 ``` ``` root@nas:~# lsmod | grep i915 i915 4325376 18 drm_buddy 20480 2 xe,i915 drm_display_helper 270336 2 xe,i915 cec 69632 3 drm_display_helper,xe,i915 ttm 102400 3 drm_ttm_helper,xe,i915 drm_kms_helper 249856 5 drm_shmem_helper,drm_display_helper,drm_ttm_helper,xe,i915 i2c_algo_bit 12288 2 xe,i915 drm 765952 27 gpu_sched,intel_vpu,drm_kms_helper,drm_exec,drm_gpuvm,drm_suballoc_helper,drm_shmem_helper,drm_display_helper,drm_buddy,drm_ttm_helper,xe,i915,ttm video 81920 2 xe,i915 ``` I don't have `vainfo` installed but maybe the Jellyfin output is helpful? It confirms my HWA is working in Jellyfin along with the Intel driver version: ``` root@nas:~# docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/vainfo Trying display: drm libva info: VA-API version 1.22.0 libva info: Trying to open /usr/lib/jellyfin-ffmpeg/lib/dri/iHD_drv_video.so libva info: Found init function __vaDriverInit_1_22 libva info: va_openDriver() returns 0 vainfo: VA-API version: 1.22 (libva 2.22.0) vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 25.1.0 (aa5ca48) ``` ``` root@nas:~# docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/ffmpeg -v verbose -init_hw_device vaapi=va -init_hw_device opencl@va ffmpeg version 7.0.2-Jellyfin Copyright (c) 2000-2024 the FFmpeg developers built with gcc 12 (Debian 12.2.0-14) configuration: --prefix=/usr/lib/jellyfin-ffmpeg --target-os=linux --extra-version=Jellyfin --disable-doc --disable-ffplay --disable-ptx-compression --disable-static --disable-libxcb --disable-sdl2 --disable-xlib --enable-lto=auto --enable-gpl --enable-version3 --enable-shared --enable-gmp --enable-gnutls --enable-chromaprint --enable-opencl --enable-libdrm --enable-libxml2 --enable-libass --enable-libfreetype --enable-libfribidi --enable-libfontconfig --enable-libharfbuzz --enable-libbluray --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libopenmpt --enable-libdav1d --enable-libsvtav1 --enable-libwebp --enable-libvpx --enable-libx264 --enable-libx265 --enable-libzvbi --enable-libzimg --enable-libfdk-aac --arch=amd64 --enable-libshaderc --enable-libplacebo --enable-vulkan --enable-vaapi --enable-amf --enable-libvpl --enable-ffnvcodec --enable-cuda --enable-cuda-llvm --enable-cuvid --enable-nvdec --enable-nvenc libavutil 59. 8.100 / 59. 8.100 libavcodec 61. 3.100 / 61. 3.100 libavformat 61. 1.100 / 61. 1.100 libavdevice 61. 1.100 / 61. 1.100 libavfilter 10. 1.100 / 10. 1.100 libswscale 8. 1.100 / 8. 1.100 libswresample 5. 1.100 / 5. 1.100 libpostproc 58. 1.100 / 58. 1.100 [AVHWDeviceContext @ 0x557c29cda0c0] Trying to use DRM render node for device 0. [AVHWDeviceContext @ 0x557c29cda0c0] libva: VA-API version 1.22.0 [AVHWDeviceContext @ 0x557c29cda0c0] libva: Trying to open /usr/lib/jellyfin-ffmpeg/lib/dri/iHD_drv_video.so [AVHWDeviceContext @ 0x557c29cda0c0] libva: Found init function __vaDriverInit_1_22 [AVHWDeviceContext @ 0x557c29cda0c0] libva: va_openDriver() returns 0 [AVHWDeviceContext @ 0x557c29cda0c0] Initialised VAAPI connection: version 1.22 [AVHWDeviceContext @ 0x557c29cda0c0] VAAPI driver: Intel iHD driver for Intel(R) Gen Graphics - 25.1.0 (aa5ca48). [AVHWDeviceContext @ 0x557c29cda0c0] Driver not found in known nonstandard list, using standard behaviour. [AVHWDeviceContext @ 0x557c29d19bc0] 0.0: Intel(R) OpenCL Graphics / Intel(R) Graphics [AVHWDeviceContext @ 0x557c29d19bc0] Intel QSV to OpenCL mapping function found (clCreateFromVA_APIMediaSurfaceINTEL). [AVHWDeviceContext @ 0x557c29d19bc0] Intel QSV in OpenCL acquire function found (clEnqueueAcquireVA_APIMediaSurfacesINTEL). [AVHWDeviceContext @ 0x557c29d19bc0] Intel QSV in OpenCL release function found (clEnqueueReleaseVA_APIMediaSurfacesINTEL). ```
Author
Owner

@ABeltramo commented on GitHub (Jul 5, 2025):

Wolf doesn't support HDR streaming, yet. It's definitely on my radar, I'm just busy with a few other new features at the moment 😉

<!-- gh-comment-id:3039533735 --> @ABeltramo commented on GitHub (Jul 5, 2025): Wolf doesn't support HDR streaming, yet. It's definitely on my radar, I'm just busy with a few other new features at the moment 😉
Author
Owner

@Hukuma1 commented on GitHub (Jul 5, 2025):

Oh oops! I feel silly copy-pastaing all that now haha. Keep up the great work! I'll leave this open as a feature request?

<!-- gh-comment-id:3039623749 --> @Hukuma1 commented on GitHub (Jul 5, 2025): Oh oops! I feel silly copy-pastaing all that now haha. Keep up the great work! I'll leave this open as a feature request?
Author
Owner

@ABeltramo commented on GitHub (Jul 5, 2025):

Sure thing! To be fair it wasn't written anywhere else!

<!-- gh-comment-id:3039635361 --> @ABeltramo commented on GitHub (Jul 5, 2025): Sure thing! To be fair it wasn't written anywhere else!
Author
Owner

@RyuunosukeDS3 commented on GitHub (Nov 17, 2025):

Hey! Just curious to know if anything changed since the last update on this. Are we getting close to HDR or there is still a lot to figure out?

<!-- gh-comment-id:3542759012 --> @RyuunosukeDS3 commented on GitHub (Nov 17, 2025): Hey! Just curious to know if anything changed since the last update on this. Are we getting close to HDR or there is still a lot to figure out?
Author
Owner

@ABeltramo commented on GitHub (Nov 17, 2025):

Unfortunately it seems that Smithay doesn't have support for it https://github.com/Smithay/smithay/pull/1143

Having proper HDR in our custom Wayland compositor is probably the first step required. After that we can start building out the additional video encoding pipelines and see what actually supports HDR downstream in our clients (Sway, Gamescope all the way down to Steam and so on..)

<!-- gh-comment-id:3542861337 --> @ABeltramo commented on GitHub (Nov 17, 2025): Unfortunately it seems that Smithay doesn't have support for it https://github.com/Smithay/smithay/pull/1143 Having proper HDR in our custom Wayland compositor is probably the first step required. After that we can start building out the additional video encoding pipelines and see what actually supports HDR downstream in our clients (Sway, Gamescope all the way down to Steam and so on..)
Author
Owner

@macher91 commented on GitHub (Dec 23, 2025):

Actually, Smithay does have HDR support. It supports the color-management-v1 Wayland protocol (which was standardized recently) and provides the necessary backend support for HDR metadata and WCG (Wide Color Gamut) through DRM/KMS. It's already being utilized by projects like COSMIC

<!-- gh-comment-id:3686311143 --> @macher91 commented on GitHub (Dec 23, 2025): Actually, Smithay does have HDR support. It supports the color-management-v1 Wayland protocol (which was standardized recently) and provides the necessary backend support for HDR metadata and WCG (Wide Color Gamut) through DRM/KMS. It's already being utilized by projects like COSMIC
Author
Owner

@ABeltramo commented on GitHub (Dec 23, 2025):

Actually, Smithay does have HDR support. It supports the color-management-v1 Wayland protocol

@macher91 are you sure about that, and can you provide any reference?
The official list of implemented wayland protocols links to https://github.com/Smithay/smithay/pull/1143 for color-management-v1. I can't find an official source for Cosmic but the Arch Wiki only says that

The COSMIC developers have promised HDR support in the initial stable release.

Only other thing I could find is https://github.com/pop-os/cosmic-comp/issues/1384 which seems to confirm that there's no HDR support in COSMIC.

I suppose only @Drakulix can say for sure, but from a quick look around I don't see HDR implemented..

<!-- gh-comment-id:3686384611 --> @ABeltramo commented on GitHub (Dec 23, 2025): > Actually, Smithay does have HDR support. It supports the color-management-v1 Wayland protocol @macher91 are you sure about that, and can you provide any reference? The official list of [implemented wayland protocols](https://github.com/Smithay/smithay/issues/781) links to https://github.com/Smithay/smithay/pull/1143 for `color-management-v1`. I can't find an official source for Cosmic but the [Arch Wiki](https://wiki.archlinux.org/title/HDR_monitor_support#COSMIC) only says that > The [COSMIC](https://wiki.archlinux.org/title/COSMIC) developers have [promised HDR support](https://blog.system76.com/post/may-flowers-spring-cosmic-showers) in the initial stable release. Only other thing I could find is https://github.com/pop-os/cosmic-comp/issues/1384 which seems to confirm that there's no HDR support in COSMIC. I suppose only @Drakulix can say for sure, but from a quick look around I don't see HDR implemented..
Author
Owner

@Drakulix commented on GitHub (Dec 23, 2025):

Actually, Smithay does have HDR support. It supports the color-management-v1 Wayland protocol

@macher91 are you sure about that, and can you provide any reference? The official list of implemented wayland protocols links to Smithay/smithay#1143 for color-management-v1. I can't find an official source for Cosmic but the Arch Wiki only says that

The COSMIC developers have promised HDR support in the initial stable release.

Only other thing I could find is pop-os/cosmic-comp#1384 which seems to confirm that there's no HDR support in COSMIC.

I suppose only @Drakulix can say for sure, but from a quick look around I don't see HDR implemented..

The PR you linked is the only work on smithay related to HDR support in the moment. COSMIC also indeed doesn't have any HDR support atm.

For fullscreen clients you can get away with hacking something together, but as soon as you potentially have multiple windows to render it falls apart as you might need to convert between color spaces and blend correctly.

I am finally looking into working on this in the new year, but it might still take a bit until wolf can adopt new smithay code with minimal changes. If you want to hack something together for gamescope or sway in the meantime, I am happy to provide some pointers.

<!-- gh-comment-id:3686928079 --> @Drakulix commented on GitHub (Dec 23, 2025): > > Actually, Smithay does have HDR support. It supports the color-management-v1 Wayland protocol > > [@macher91](https://github.com/macher91) are you sure about that, and can you provide any reference? The official list of [implemented wayland protocols](https://github.com/Smithay/smithay/issues/781) links to [Smithay/smithay#1143](https://github.com/Smithay/smithay/pull/1143) for `color-management-v1`. I can't find an official source for Cosmic but the [Arch Wiki](https://wiki.archlinux.org/title/HDR_monitor_support#COSMIC) only says that > > > The [COSMIC](https://wiki.archlinux.org/title/COSMIC) developers have [promised HDR support](https://blog.system76.com/post/may-flowers-spring-cosmic-showers) in the initial stable release. > > Only other thing I could find is [pop-os/cosmic-comp#1384](https://github.com/pop-os/cosmic-comp/issues/1384) which seems to confirm that there's no HDR support in COSMIC. > > I suppose only [@Drakulix](https://github.com/Drakulix) can say for sure, but from a quick look around I don't see HDR implemented.. The PR you linked is the only work on smithay related to HDR support in the moment. COSMIC also indeed doesn't have any HDR support atm. For fullscreen clients you can get away with hacking something together, but as soon as you potentially have multiple windows to render it falls apart as you might need to convert between color spaces and blend correctly. I am finally looking into working on this in the new year, but it might still take a bit until wolf can adopt new smithay code with minimal changes. If you want to hack something together for gamescope or sway in the meantime, I am happy to provide some pointers.
Author
Owner

@ABeltramo commented on GitHub (Dec 23, 2025):

Thanks @Drakulix for the quick reply!

If you want to hack something together for gamescope or sway in the meantime, I am happy to provide some pointers.

That would definitely be interesting since a single fullscreen app is always going the be the main usecase for Wolf (and gst-wayland-comp by extension). If you can spare some pointers I'll look into it after the xmass holidays, I'm sure also @DatCaptainHorse would be interested 😉

<!-- gh-comment-id:3686946618 --> @ABeltramo commented on GitHub (Dec 23, 2025): Thanks @Drakulix for the quick reply! > If you want to hack something together for gamescope or sway in the meantime, I am happy to provide some pointers. That would definitely be interesting since a single fullscreen app is always going the be the main usecase for Wolf (and gst-wayland-comp by extension). If you can spare some pointers I'll look into it after the xmass holidays, I'm sure also @DatCaptainHorse would be interested 😉
Author
Owner

@Drakulix commented on GitHub (Dec 23, 2025):

That would definitely be interesting since a single fullscreen app is always going the be the main usecase for Wolf (and gst-wayland-comp by extension). If you can spare some pointers I'll look into it after the xmass holidays, I'm sure also @DatCaptainHorse would be interested 😉

Okay sure.

  1. You still need the color-management-v1 protocol, as gamescope (or nested sway, if it supports that) would use this protocol to send you HDR metadata. So you either want to rebase https://github.com/Smithay/smithay/pull/1143 and use a smithay-fork or extract the contents into gst-wayland-comp (the code should work fine out of tree, but some imports, etc need to be cleaned up).

This only gives you data from the client, it obviously doesn't change any rendering. You probably want to support as little in terms of what the protocol offers as possible. For gamescope/gaming the following stuff should be sufficient:

  • perceptual rendering intent (and just ignore it, this basically means "the compositor does what it wants")
  • features: parametric
  • transfer functions: gamma22, st2084_pq
  • primaries: srgb, bt2020

With that srgb + gamma22 is basically what you are currently doing, while HDR apps should use BT2020 + PQ.

I don't think gamescope uses ext_srgb or hgl, but possibly check the source. It could probably make use of luminances, extended-color-volume and more, but I think it doesn't need it and can composite with just these. Using something like wine-wayland directly would probably need Windows-scrgb and much more. Also this is most likely not enough for video-players, but one step at a time.

I think you also need wp-color-representation-v1, but only for the alpha-modes. And premultiplied vs straight alpha is easy to support in the shader.

  1. This then means you will not only get windows in the sRGB color space, but also BT2020.

And for BT2020 you don't need to modify these values at all, if you are not rendering multiple windows, you just need to make sure the framebuffer has enough bits to represent the high color fidelity. Which is probably already has. You want to make sure you use at least a 10-bit format. (Something like ARGB2101010 is sufficient and in most cases pretty efficient. ARGB16161616f (16-bit float per component) works as well, but is probably more resource intensive.

Select something based on what your gst-pipeline supports, you need to make sure you never drop down to 8-bit buffers. If you can only encode 8-bit buffers, don't advertise the protocol.

Now Steam and other apps won't magically output HDR contents and I am not sure gamescope will internally convert everything to BT2020 or send you sRGB image descriptions while no HDR game is running. It might work to simply not advertise sRGB+gamma22, but a lot of apps will likely complain. So you need a new shader, that renders sRGB content in BT2020 color space. You can probably find something simple online to do that.

  1. And that's basically it. Now you just need to set the color space on the pipeline, so that gstreamer will do the right thing and pass HDR-enabled to the moonlight client. This is the most basic implementation, but it should work.

  2. Afterwards there are a lot of possible optimizations. Moonlight likely sends you information about the HDR properties of the display, e.g. it's maximum brightness, etc. Content out of that range will potentially get clipped, etc.

You can take this data and send it back using the protocol and allow the client to give you more data by enabling more features. You then need to figure out, if you can simply encode these bits on the gst-pipeline or if that means you might need to touch the buffer after all and mess with the color values.

But you can figure that out once it works at all, though until then it might not look the best depending on the display.

<!-- gh-comment-id:3687033394 --> @Drakulix commented on GitHub (Dec 23, 2025): > That would definitely be interesting since a single fullscreen app is always going the be the main usecase for Wolf (and gst-wayland-comp by extension). If you can spare some pointers I'll look into it after the xmass holidays, I'm sure also [@DatCaptainHorse](https://github.com/DatCaptainHorse) would be interested 😉 Okay sure. 1. You still need the color-management-v1 protocol, as gamescope (or nested sway, if it supports that) would use this protocol to send you HDR metadata. So you either want to rebase https://github.com/Smithay/smithay/pull/1143 and use a smithay-fork or extract the contents into `gst-wayland-comp` (the code should work fine out of tree, but some imports, etc need to be cleaned up). This only gives you data from the client, it obviously doesn't change any rendering. You probably want to support as little in terms of what the protocol offers as possible. For gamescope/gaming the following stuff should be sufficient: - perceptual rendering intent (and just ignore it, this basically means "the compositor does what it wants") - features: parametric - transfer functions: gamma22, st2084_pq - primaries: srgb, bt2020 With that srgb + gamma22 is basically what you are currently doing, while HDR apps should use BT2020 + PQ. I don't think gamescope uses ext_srgb or hgl, but possibly check the source. It could probably make use of luminances, extended-color-volume and more, but I think it doesn't need it and can composite with just these. Using something like wine-wayland directly would probably need Windows-scrgb and much more. Also this is most likely not enough for video-players, but one step at a time. I think you also need wp-color-representation-v1, but only for the alpha-modes. And premultiplied vs straight alpha is easy to support in the shader. 2. This then means you will not only get windows in the sRGB color space, but also BT2020. And for BT2020 you don't need to modify these values at all, if you are not rendering multiple windows, you just need to make sure the framebuffer has enough bits to represent the high color fidelity. Which is probably already has. You want to make sure you use at least a 10-bit format. (Something like ARGB2101010 is sufficient and in most cases pretty efficient. ARGB16161616f (16-bit float per component) works as well, but is probably more resource intensive. Select something based on what your gst-pipeline supports, you need to make sure you never drop down to 8-bit buffers. If you can only encode 8-bit buffers, don't advertise the protocol. Now Steam and other apps won't magically output HDR contents and I am not sure gamescope will internally convert everything to BT2020 or send you sRGB image descriptions while no HDR game is running. It might work to simply not advertise sRGB+gamma22, but a lot of apps will likely complain. So you need a new shader, that renders sRGB content in BT2020 color space. You can probably find something simple online to do that. 3. And that's basically it. Now you just need to set the color space on the pipeline, so that gstreamer will do the right thing and pass HDR-enabled to the moonlight client. This is the most basic implementation, but it should work. 4. Afterwards there are a lot of possible optimizations. Moonlight likely sends you information about the HDR properties of the display, e.g. it's maximum brightness, etc. Content out of that range will potentially get clipped, etc. You can take this data and send it back using the protocol and allow the client to give you more data by enabling more features. You then need to figure out, if you can simply encode these bits on the gst-pipeline or if that means you might need to touch the buffer after all and mess with the color values. But you can figure that out once it works at all, though until then it might not look the best depending on the display.
Author
Owner

@ABeltramo commented on GitHub (Dec 23, 2025):

Thanks for the very detailed answer! I'll try hacking something when I'm back home!

<!-- gh-comment-id:3687082244 --> @ABeltramo commented on GitHub (Dec 23, 2025): Thanks for the very detailed answer! I'll try hacking something when I'm back home!
Author
Owner

@DatCaptainHorse commented on GitHub (Dec 23, 2025):

That would definitely be interesting since a single fullscreen app is always going the be the main usecase for Wolf (and gst-wayland-comp by extension). If you can spare some pointers I'll look into it after the xmass holidays, I'm sure also @DatCaptainHorse would be interested 😉

🐴 - yep, though my monitor supports only "fake HDR" (HDR 400 nits), it might be useful for testing early implementations if you go forward with that 🙂

<!-- gh-comment-id:3687341498 --> @DatCaptainHorse commented on GitHub (Dec 23, 2025): > That would definitely be interesting since a single fullscreen app is always going the be the main usecase for Wolf (and gst-wayland-comp by extension). If you can spare some pointers I'll look into it after the xmass holidays, I'm sure also [@DatCaptainHorse](https://github.com/DatCaptainHorse) would be interested 😉 🐴 - yep, though my monitor supports only "fake HDR" (HDR 400 nits), it might be useful for testing early implementations if you go forward with that 🙂
Author
Owner

@realaod commented on GitHub (Jul 23, 2026):

This needs to be a thing in GoW now. When can we expect true HDR support? The latest Nvidia drivers support HDR natively now.

<!-- gh-comment-id:5059612479 --> @realaod commented on GitHub (Jul 23, 2026): This needs to be a thing in GoW now. When can we expect true HDR support? The latest Nvidia drivers support HDR natively now.
Author
Owner

@JBailes commented on GitHub (Jul 23, 2026):

We already have HDR in testing in gst-wayland, and have had in testing for a few weeks.

<!-- gh-comment-id:5059651207 --> @JBailes commented on GitHub (Jul 23, 2026): We already have HDR in testing in gst-wayland, and have had in testing for a few weeks.
Author
Owner

@ABeltramo commented on GitHub (Jul 23, 2026):

There are two parts to this:

  1. Being able to encode and stream in HDR
  2. Being able to have a functional HDR Wayland compositor + apps that support that

We are currently working on 1 (https://github.com/games-on-whales/gst-wayland-display/pull/37), and there's been recent upstream interest in 2 (https://github.com/Smithay/smithay/pull/1143) that we'll need to bring in.

When can we expect true HDR support?

No ETA, it'll be there when everything will be implemented; any help is appreciated though 😉

<!-- gh-comment-id:5060126531 --> @ABeltramo commented on GitHub (Jul 23, 2026): There are two parts to this: 1. Being able to encode and stream in HDR 2. Being able to have a functional HDR Wayland compositor + apps that support that We are currently working on 1 (https://github.com/games-on-whales/gst-wayland-display/pull/37), and there's been recent upstream interest in 2 (https://github.com/Smithay/smithay/pull/1143) that we'll need to bring in. > When can we expect true HDR support? No ETA, it'll be there when everything will be implemented; any help is appreciated though 😉
Author
Owner

@jfranco09 commented on GitHub (Aug 31, 2026):

I would love to help have HDR working. I work as a developer, but I worked with this kind of project before. What would be a good place to start or where is help needed?
My current machine is a amd 5600x + rtx 5090 with 32 Gb RAM.

<!-- gh-comment-id:5485772877 --> @jfranco09 commented on GitHub (Aug 31, 2026): I would love to help have HDR working. I work as a developer, but I worked with this kind of project before. What would be a good place to start or where is help needed? My current machine is a amd 5600x + rtx 5090 with 32 Gb RAM.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
games-on-whales/wolf#149
No description provided.