Skip to content

add hdr support#18

Open
sophietheopossum wants to merge 43 commits into
bea4dev:mainfrom
sophietheopossum:hdr
Open

add hdr support#18
sophietheopossum wants to merge 43 commits into
bea4dev:mainfrom
sophietheopossum:hdr

Conversation

@sophietheopossum

Copy link
Copy Markdown
Contributor

fairly self explanatory, it took me way longer than i thought it would.... tested it on a hdr device, it looks the same as hdr on kde, so it all seems to work as expected.

This commit introduces the `wp_color_management_v1` Wayland protocol, allowing clients to provide parametric image descriptions for surfaces. This enables the compositor to correctly interpret and display content on various display types, such as HDR or wide-gamut monitors.

The implementation focuses on parametric descriptions (primaries, transfer functions, luminances) and explicitly does not support ICC profiles, aligning with the scope of GLES-based rendering pipelines.
Introduce core types for managing output color modes (SDR/HDR10) and blending spaces (sRGB/Linear BT.2020). This includes enabling 10-bit scanout formats (ABGR/ARGB2101010) and integrating a new color management protocol, laying the groundwork for full HDR support.
Introduce detailed parametric descriptions for color primaries, transfer
characteristics, and luminances via `ImageDescription`. These types form the
basis for `wp_color_management_v1` and DRM metadata signaling.

Implement logic to dynamically resolve the `OutputColorMode` for each
connector, factoring in EDID capabilities and the `SHOJI_HDR_OUTPUTS`
experimental gate. Per-output state now captures a synthesized
`ImageDescription` based on the resolved mode.

Note that while HDR signaling is enabled, the compositor's blend space remains
sRGB; full linear BT.2020 blending is a future phase.
Introduce `Chromaticity` and `PrimariesChromaticities` types to represent
CIE 1931 color primary and white point data for standards like sRGB (BT.709)
and BT.2020.

This also includes utility methods for encoding this data into formats used
by the Wayland color management protocol (`wp_image_description_info_v1`)
and DRM HDR metadata (CTA-861-G).
This module introduces functionality to read HDR static metadata from a
connector's EDID, determining capabilities like EOTF support and luminance
ranges.

It also implements the signaling mechanism for HDR10 output, configuring
DRM connector properties such as `max bpc`, `Colorspace` (to BT2020_RGB),
and `HDR_OUTPUT_METADATA` (SMPTE ST 2086 / CTA-861.3 blob) to inform the
display about the incoming HDR signal.

These properties are set using legacy `SET_PROPERTY` ioctl to ensure
persistence across smithay's atomic commits. A reset function is provided
for transitioning back to SDR.
This change fully implements the `wp_color_management_v1` Wayland protocol
for parametric image descriptions. It allows clients to query output color
capabilities, provide color descriptions for their surfaces, and request
preferred descriptions from the compositor.

HDR features, such as BT.2020 primaries and ST.2084 PQ transfer functions,
are now dynamically advertised based on the `SHOJI_HDR_OUTPUTS` experiment
gate, ensuring clients only use capabilities the compositor supports.
The implementation includes comprehensive state management and error handling
for all protocol objects.
This change integrates the previously introduced EDID HDR probing and DRM HDR10 signaling into the output connection process.

When a connector is detected, its color pipeline is resolved, determining if HDR10 signaling is applicable based on EDID. The necessary DRM connector properties are configured to signal HDR to the display.

The resolved output color state is then stored and made available to Wayland clients via the `wp_color_management_v1` protocol.
The kernel only frees DRM property blobs when the device file descriptor closes.
Since the DRM device remains open across hotplug cycles, explicitly destroy
HDR metadata blobs when an output disconnects to prevent resource leaks
during replug cycles.
Extract the logic for destroying HDR output metadata blobs into a dedicated helper function. This centralizes the destruction process, adds error logging, and improves code organization within the color management backend.
Adjust how enum property values are retrieved from the `drm` crate's
`ValueType::Enum` variant to match an API change. The values are now
accessed via `values().1`.
These tests verify the correct extraction of HDR static metadata from EDID
blocks. They also confirm that the Rust `HdrOutputMetadata` and
`HdrMetadataInfoframe` structs match the expected kernel ABI, which is crucial
to prevent silent corruption of HDR infoframe data passed to the display.
Provides Rust implementations for RGB-XYZ matrix derivation and SMPTE ST 2084 (PQ) curves. Unit tests use these to validate hardcoded color transformation constants in GLSL shaders, preventing subtle color errors.
The `ModeTypeFlags` import and its associated `_keep_mode_type_flags` function were a temporary workaround to silence dead-code warnings. They are no longer necessary.
This flag is probed once per device to indicate if the GPU can render into fp16 targets. It gates HDR10 output modes, which require fp16 intermediates.
This adds the logic to detect if the GPU supports rendering into FP16 targets and stores this capability in the backend data. This information is essential for enabling HDR10 output modes.
This applies the HDR10 encode pipeline to composite the entire frame for outputs configured in HDR10. All elements are composited into an FP16 intermediate buffer before PQ encoding.

It also ensures that HDR10 mode is only enabled if the GPU supports FP16 render targets, which are required by the pipeline.
When HDR encoding is active, frame optimizations such as direct scanout or plane
promotion would bypass the HDR encode pass. This could cause sRGB content to
be misinterpreted as PQ (Perceptual Quantizer) by an HDR display, leading
to incorrect colors.
some minor reformatting too
The`wp_image_description_v1::Request::GetInformation` response must be deferred. Sending the response from inside the dispatch handler that created the `info` object would cause wayland-backend to write through a freed pointer, as the `done` destructor event may already have occurred.
The `wp_image_description_info_v1` response must be deferred. Sending the response from inside the dispatch handler that created the `info` object would cause wayland-backend to write through a freed pointer, as the `done` destructor event may already have occurred
Previously, HDR output mode resolution relied on a generic experiment flag. This change introduces an explicit check against `runtime_output_configs` and environment variables for HDR requests, directly informing the color mode selection. This ensures user-defined HDR preferences are applied, with a re-resolution handled for config updates.
This introduces a mechanism to re-evaluate and apply requested color modes (e.g., HDR via runtime config or environment variables) to already
connected TTY outputs. Outputs connect before the full runtime config is evaluated, so this allows a "live switch" into or out of HDR mode without requiring an output reconnect, by managing DRM connector state.
The HDR opt-in is determined by output configurations. This ensures the session-wide HDR advertisement and TTY output color modes are updated when output configs change, addressing timing issues where outputs connect before full config evaluation.
This option allows configuring whether a specific output should attempt to drive HDR10 (PQ/BT.2020 signaling) when its EDID advertises ST 2084
support. It is an experimental feature, and SDR content is composited in sRGB and PQ-encoded as a final pass.
Verify the correct deserialization of the `hdr` option in `RuntimeDisplayConfigUpdate`, ensuring `Some(true)` for an explicit `true` value and `None` when the key is absent to preserve SDR behavior for older configurations.
@bea4dev

bea4dev commented Jul 8, 2026

Copy link
Copy Markdown
Owner

That’s great! Thank you.
Please give me a little time to review it and test it.
Fortunately, I have one HDR 1000 monitor, so I’ll test it with that.

@bea4dev

bea4dev commented Jul 8, 2026

Copy link
Copy Markdown
Owner

@sophietheopossum
I tried it, but it does not seem to work properly.
When running through the AMD GPU, SDR content does indeed become washed out, but the important part—the HDR content—does not appear to be displayed correctly. It looks no different from the surrounding SDR content. In addition, commits from clients on the HDR monitor seem to happen at one-second intervals. I’ll paste the logs from that below.
When running through the NVIDIA GPU, the compositor freezes.
At the very least, I think HDR content needs to be displayed correctly on the AMD GPU.
However, could your monitor perhaps be one of those so-called “pseudo-HDR” monitors?
If testing this is difficult on your side, it may be worth considering having me take over this issue.

2026-07-08T12:51:58.354884Z  INFO shoji_wm: starting shoji_wm backend=TTY
2026-07-08T12:51:58.566493Z ERROR shoji_wm::ssd::runtime: decoration runtime log (node:11907) [DEP0205] DeprecationWarning: `module.register()` is deprecated. Use `module.registerHooks()` instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
2026-07-08T12:51:58.588812Z  INFO shoji_wm::state: xwayland-satellite started, DISPLAY exported display=:0
2026-07-08T12:51:58.589575Z  INFO shoji_wm::backend: initialized tty session seat=seat0
2026-07-08T12:51:58.677394Z  INFO shoji_wm::backend: selected primary drm node primary_node=DrmNode { dev: 57856, ty: Primary }
2026-07-08T12:51:58.677510Z  INFO shoji_wm::backend: discovered drm device without connected connectors candidate.node=DrmNode { dev: 57856, ty: Primary } path="/dev/dri/card0" is_primary=true
2026-07-08T12:51:58.677516Z  INFO shoji_wm::backend: discovered drm device with connected connectors candidate.node=DrmNode { dev: 57857, ty: Primary } path="/dev/dri/card1" is_primary=false connectors=["card1-eDP-1", "card1-DP-1"]
2026-07-08T12:51:58.677529Z  INFO shoji_wm::backend: selected tty drm devices selected=["/dev/dri/card1"]
2026-07-08T12:51:58.677531Z  INFO shoji_wm::backend: initializing drm device candidate.node=DrmNode { dev: 57857, ty: Primary } path="/dev/dri/card1" connectors=["card1-eDP-1", "card1-DP-1"]
2026-07-08T12:51:58.677540Z  INFO shoji_wm::backend::tty: opening drm device node=DrmNode { dev: 57857, ty: Primary } path="/dev/dri/card1"
2026-07-08T12:51:58.679134Z  WARN smithay::backend::drm::device::fd: Unable to become drm master, assuming unprivileged mode
2026-07-08T12:51:59.182074Z  WARN shoji_wm::backend::tty: failed to bind wl_display for tty EGL clients node=DrmNode { dev: 57857, ty: Primary } error=EglExtensionNotSupported(["EGL_WL_bind_wayland_display"])
2026-07-08T12:51:59.182116Z  INFO shoji_wm::backend::tty: advertising linux-dmabuf modifiers node=DrmNode { dev: 57857, ty: Primary } modifier_count=312 unique_modifier_count=9 unique_modifiers=["0x0", "0xffffffffffffff", "0x200000000000a04", "0x200000010401604", "0x200000010401b04", "0x200000010437b04", "0x200000010467b04", "0x20000001046bb04", "0x2000000104abb04"]
2026-07-08T12:51:59.182208Z  INFO shoji_wm::backend::tty: initialized linux-dmabuf global node=DrmNode { dev: 57857, ty: Primary }
2026-07-08T12:51:59.182332Z  INFO shoji_wm::backend::tty: probed fp16 render target support node=DrmNode { dev: 57857, ty: Primary } supports_fp16=true
2026-07-08T12:51:59.182337Z  INFO shoji_wm::backend::tty: drm backend stored in state node=DrmNode { dev: 57857, ty: Primary }
2026-07-08T12:51:59.184180Z  INFO shoji_wm::backend::tty: resolved output color mode output=eDP-1 mode=Sdr edid_hdr=None
2026-07-08T12:51:59.184197Z  INFO shoji_wm::state: seeded xwayland refresh override output=eDP-1 refresh_mhz=120000 reason="tty-output-connected"
2026-07-08T12:51:59.184210Z  INFO shoji_wm::backend::tty: connected tty output node=DrmNode { dev: 57857, ty: Primary } crtc=crtc::Handle(86) output=eDP-1 size=Size<smithay::utils::geometry::Physical> { w: 2880, h: 1800 } refresh_mhz=120000 available_modes=["2880x1800@2880x1800(drm:120 wl:120000)", "2880x1800@2880x1800(drm:60 wl:60001)", "1920x1200@1920x1200(drm:120 wl:120000)", "1920x1080@1920x1080(drm:120 wl:120000)", "1600x1200@1600x1200(drm:120 wl:120000)", "1680x1050@1680x1050(drm:120 wl:120000)", "1280x1024@1280x1024(drm:120 wl:120000)", "1440x900@1440x900(drm:120 wl:120000)", "1280x800@1280x800(drm:120 wl:120000)", "1280x720@1280x720(drm:120 wl:120000)", "1024x768@1024x768(drm:120 wl:120000)", "800x600@800x600(drm:120 wl:120000)", "640x480@640x480(drm:120 wl:120000)"]
2026-07-08T12:51:59.191403Z  WARN smithay::backend::drm::surface::atomic: Failed to destroy old mode property blob: No such file or directory (os error 2)
2026-07-08T12:51:59.931634Z  INFO shoji_wm::backend::tty: built tty output dmabuf scanout feedback scanout_node=DrmNode { dev: 57857, ty: Primary } render_feedback_format_count=312 scanout_feedback_format_count=312 filtered_nvidia_compressed_formats=0 primary_scanout_format_count=57 primary_or_overlay_scanout_format_count=57
2026-07-08T12:51:59.932239Z  INFO shoji_wm::backend::tty: tty surface async page-flip (tearing) capability node=DrmNode { dev: 57857, ty: Primary } crtc=crtc::Handle(86) output=eDP-1 supports_async_flip=true
2026-07-08T12:51:59.932347Z  INFO shoji_wm::backend::tty: resolved output color mode output=DP-1 mode=Sdr edid_hdr=Some(EdidHdrMetadata { supports_pq: true, supports_hlg: false, max_luminance: Some(1107.1279), max_frame_avg_luminance: Some(972.19794), min_luminance: Some(0.18541522) })
2026-07-08T12:51:59.932374Z  INFO shoji_wm::backend::tty: connected tty output node=DrmNode { dev: 57857, ty: Primary } crtc=crtc::Handle(90) output=DP-1 size=Size<smithay::utils::geometry::Physical> { w: 3840, h: 2160 } refresh_mhz=120000 available_modes=["3840x2160@3840x2160(drm:60 wl:60000)", "3840x2160@3840x2160(drm:120 wl:120000)", "3840x2160@3840x2160(drm:120 wl:119880)", "3840x2160@3840x2160(drm:60 wl:60000)", "3840x2160@3840x2160(drm:60 wl:59940)", "3840x2160@3840x2160(drm:30 wl:30000)", "3840x2160@3840x2160(drm:30 wl:29970)", "2560x1440@2560x1440(drm:60 wl:60000)", "1920x1080@1920x1080(drm:120 wl:120000)", "1920x1080@1920x1080(drm:120 wl:119880)", "1920x1080@1920x1080(drm:60 wl:60000)", "1920x1080@1920x1080(drm:60 wl:60000)", "1920x1080@1920x1080(drm:60 wl:59940)", "1920x1080@1920x1080(drm:50 wl:50000)", "1280x720@1280x720(drm:60 wl:60000)", "1280x720@1280x720(drm:60 wl:59940)", "1280x720@1280x720(drm:50 wl:50000)", "1024x768@1024x768(drm:75 wl:75029)", "1024x768@1024x768(drm:60 wl:60004)", "800x600@800x600(drm:75 wl:75000)", "800x600@800x600(drm:60 wl:60317)", "720x576@720x576(drm:50 wl:50000)", "720x576@720x576(drm:50 wl:50000)", "720x480@720x480(drm:60 wl:60000)", "720x480@720x480(drm:60 wl:60000)", "720x480@720x480(drm:60 wl:59940)", "720x480@720x480(drm:60 wl:59940)", "640x480@640x480(drm:75 wl:75000)", "640x480@640x480(drm:60 wl:60000)", "640x480@640x480(drm:60 wl:59940)", "640x480@640x480(drm:60 wl:59940)"]
2026-07-08T12:51:59.933817Z  WARN smithay::backend::drm::surface::atomic: Failed to destroy old mode property blob: No such file or directory (os error 2)
2026-07-08T12:52:00.049044Z  INFO shoji_wm::backend::tty: built tty output dmabuf scanout feedback scanout_node=DrmNode { dev: 57857, ty: Primary } render_feedback_format_count=312 scanout_feedback_format_count=312 filtered_nvidia_compressed_formats=0 primary_scanout_format_count=57 primary_or_overlay_scanout_format_count=57
2026-07-08T12:52:00.049139Z  INFO shoji_wm::backend::tty: tty surface async page-flip (tearing) capability node=DrmNode { dev: 57857, ty: Primary } crtc=crtc::Handle(90) output=DP-1 supports_async_flip=true
2026-07-08T12:52:00.049168Z  INFO shoji_wm::backend: set wayland display for tty backend socket="wayland-1"
2026-07-08T12:52:00.288409Z  INFO shoji_wm::backend::tty: output color mode changed by runtime display config output=DP-1 mode=Hdr10 { max_display_luminance: 1107.1279, min_display_luminance: 0.18541522 }
2026-07-08T12:52:00.290685Z  INFO shoji_wm::state: started runtime managed service process_id=cliphist-image
2026-07-08T12:52:00.290841Z  INFO shoji_wm::state: started runtime managed service process_id=cliphist-text
2026-07-08T12:52:00.290981Z  INFO shoji_wm::state: started runtime once process process_id=shell run_policy=OncePerSession
2026-07-08T12:52:00.299031Z  INFO shoji_wm::backend: spawned weston-terminal
2026-07-08T12:52:00.299099Z  INFO shoji_wm::state: detected xwayland refresh-override client pid=11923 command="xwayland-satellite :0 -listenfd 23 -listenfd 22"
2026-07-08T12:52:00.299106Z  INFO shoji_wm::state: accepted new wayland client connection client_is_xwayland_bridge=true
2026-07-08T12:52:00.299131Z  INFO shoji_wm::state: accepted new wayland client connection client_is_xwayland_bridge=false
2026-07-08T12:52:00.299143Z  INFO shoji_wm::state: accepted new wayland client connection client_is_xwayland_bridge=false
2026-07-08T12:52:00.375087Z  INFO shoji_wm::backend::tty: fullscreen fast path disengaged: full scene compositing resumed output=eDP-1
2026-07-08T12:52:00.375827Z  INFO shoji_wm::backend::tty: direct scanout disengaged: GL compositing resumed output=eDP-1 fullscreen_fast_path=false
2026-07-08T12:52:00.375847Z  INFO shoji_wm::backend::tty: tearing disengaged: synced (vblank) page flips resumed output=eDP-1
2026-07-08T12:52:00.376477Z  INFO shoji_wm::backend::tty: fullscreen fast path disengaged: full scene compositing resumed output=DP-1
2026-07-08T12:52:00.379879Z  INFO shoji_wm::backend::tty: direct scanout disengaged: GL compositing resumed output=DP-1 fullscreen_fast_path=false
2026-07-08T12:52:00.379904Z  INFO shoji_wm::backend::tty: tearing disengaged: synced (vblank) page flips resumed output=DP-1
2026-07-08T12:52:00.519918Z  INFO shoji_wm::state: accepted new wayland client connection client_is_xwayland_bridge=false
2026-07-08T12:52:00.584511Z  INFO shoji_wm::state: accepted new wayland client connection client_is_xwayland_bridge=false
2026-07-08T12:52:48.662227Z  INFO shoji_wm::state: accepted new wayland client connection client_is_xwayland_bridge=false
2026-07-08T12:52:48.673805Z  INFO shoji_wm::handlers::xdg_shell: new xdg toplevel received surface=ObjectId(wl_surface@31)
2026-07-08T12:52:48.684835Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced34b3930, alive: true }:31 title= cached_title=None app_id=Some("kitty") cached_app_id=None reason="xdg-toplevel-app-id-changed"
2026-07-08T12:52:48.684874Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced34b3930, alive: true }:31 title=kitty cached_title=None app_id=Some("kitty") cached_app_id=None reason="xdg-toplevel-title-changed"
2026-07-08T12:52:48.772013Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced34b3930, alive: true }:31 title=zsh cached_title=Some("kitty") app_id=Some("kitty") cached_app_id=Some("kitty") reason="xdg-toplevel-title-changed"
2026-07-08T12:52:48.870063Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced34b3930, alive: true }:31 title=…/Documents/development/ShojiWM cached_title=Some("zsh") app_id=Some("kitty") cached_app_id=Some("kitty") reason="xdg-toplevel-title-changed"
2026-07-08T12:52:48.905049Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced34b3930, alive: true }:31 title=bea4dev@archlinux:~/Documents/development/ShojiWM cached_title=Some("…/Documents/development/ShojiWM") app_id=Some("kitty") cached_app_id=Some("kitty") reason="xdg-toplevel-title-changed"
2026-07-08T12:53:00.433535Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced34b3930, alive: true }:31 title=nvim cached_title=Some("bea4dev@archlinux:~/Documents/development/ShojiWM") app_id=Some("kitty") cached_app_id=Some("kitty") reason="xdg-toplevel-title-changed"
2026-07-08T12:53:45.472531Z  INFO shoji_wm::state: accepted new wayland client connection client_is_xwayland_bridge=false
2026-07-08T12:53:45.472588Z  INFO shoji_wm::state: accepted new wayland client connection client_is_xwayland_bridge=false
2026-07-08T12:53:45.555054Z  INFO shoji_wm::state: accepted new wayland client connection client_is_xwayland_bridge=false
2026-07-08T12:53:46.245277Z  INFO shoji_wm::handlers::xdg_shell: new xdg toplevel received surface=ObjectId(wl_surface@66)
2026-07-08T12:53:46.247410Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:66 title=Mozilla Firefox cached_title=None app_id=None cached_app_id=None reason="xdg-toplevel-title-changed"
2026-07-08T12:53:46.247424Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel maximize request received surface=ObjectId(wl_surface@66)
2026-07-08T12:53:46.247428Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel maximize request matched window window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:66 title=Mozilla Firefox app_id=None
2026-07-08T12:53:46.247432Z  INFO shoji_wm::input: runtime window maximize request dispatch window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:66 title=Mozilla Firefox app_id=None maximized=true source=ClientCsd
2026-07-08T12:53:46.248419Z  INFO shoji_wm::input: runtime window maximize request result window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:66 invoked=true
2026-07-08T12:53:46.248427Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:66 title=Mozilla Firefox cached_title=None app_id=Some("firefox") cached_app_id=None reason="xdg-toplevel-app-id-changed"
2026-07-08T12:54:18.240707Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:66 title=New Tab — Mozilla Firefox cached_title=Some("Mozilla Firefox") app_id=Some("firefox") cached_app_id=Some("firefox") reason="xdg-toplevel-title-changed"
2026-07-08T12:54:18.328136Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:66 title=新しいタブ — Mozilla Firefox cached_title=Some("New Tab — Mozilla Firefox") app_id=Some("firefox") cached_app_id=Some("firefox") reason="xdg-toplevel-title-changed"
2026-07-08T12:55:53.057112Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:66 title=Mozilla Firefox cached_title=Some("新しいタブ — Mozilla Firefox") app_id=Some("firefox") cached_app_id=Some("firefox") reason="xdg-toplevel-title-changed"
2026-07-08T12:55:53.068694Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:66 title=YouTube — Mozilla Firefox cached_title=Some("Mozilla Firefox") app_id=Some("firefox") cached_app_id=Some("firefox") reason="xdg-toplevel-title-changed"
2026-07-08T12:56:19.349830Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:66 title=hdr - YouTube — Mozilla Firefox cached_title=Some("YouTube — Mozilla Firefox") app_id=Some("firefox") cached_app_id=Some("firefox") reason="xdg-toplevel-title-changed"
2026-07-08T12:56:33.682263Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:66 title=YouTube — Mozilla Firefox cached_title=Some("hdr - YouTube — Mozilla Firefox") app_id=Some("firefox") cached_app_id=Some("firefox") reason="xdg-toplevel-title-changed"
2026-07-08T12:56:34.535327Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:66 title=2020 LG OLED l The Black 4K HDR 60fps - YouTube — Mozilla Firefox cached_title=Some("YouTube — Mozilla Firefox") app_id=Some("firefox") cached_app_id=Some("firefox") reason="xdg-toplevel-title-changed"
2026-07-08T12:56:48.986461Z  INFO shoji_wm::state: accepted new wayland client connection client_is_xwayland_bridge=false
2026-07-08T12:56:49.019097Z  INFO shoji_wm::state: accepted new wayland client connection client_is_xwayland_bridge=false
2026-07-08T12:56:49.243903Z  INFO shoji_wm::handlers::xdg_shell: new xdg toplevel received surface=ObjectId(wl_surface@27)
2026-07-08T12:56:49.245489Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 title= cached_title=None app_id=Some("google-chrome") cached_app_id=None reason="xdg-toplevel-app-id-changed"
2026-07-08T12:56:49.245505Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 title=新しいタブ - Google Chrome cached_title=None app_id=Some("google-chrome") cached_app_id=None reason="xdg-toplevel-title-changed"
2026-07-08T12:56:49.247796Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel maximize request received surface=ObjectId(wl_surface@27)
2026-07-08T12:56:49.247814Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel maximize request matched window window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 title=新しいタブ - Google Chrome app_id=Some("google-chrome")
2026-07-08T12:56:49.247830Z  INFO shoji_wm::input: runtime window maximize request dispatch window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 title=新しいタブ - Google Chrome app_id=Some("google-chrome") maximized=true source=ClientCsd
2026-07-08T12:56:49.248763Z  INFO shoji_wm::input: runtime window maximize request result window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 invoked=true
2026-07-08T12:56:55.024707Z ERROR smithay::wayland::shell::xdg: surface missing from known popups
2026-07-08T12:56:56.084638Z ERROR smithay::wayland::shell::xdg: surface missing from known popups
2026-07-08T12:56:56.238779Z  INFO shoji_wm::input: runtime window minimize request dispatch window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 title=新しいタブ - Google Chrome app_id=Some("google-chrome") minimized=false source=XdgActivation
2026-07-08T12:56:56.240092Z  INFO shoji_wm::input: runtime window minimize request result window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 invoked=true
2026-07-08T12:56:56.240101Z  INFO shoji_wm::input: runtime window activate request dispatch window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 title=新しいタブ - Google Chrome app_id=Some("google-chrome") source=XdgActivation
2026-07-08T12:56:56.240617Z  INFO shoji_wm::input: runtime window activate request result window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 invoked=true
2026-07-08T12:56:56.307278Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 title=YouTube - Google Chrome cached_title=Some("新しいタブ - Google Chrome") app_id=Some("google-chrome") cached_app_id=Some("google-chrome") reason="xdg-toplevel-title-changed"
2026-07-08T12:57:19.357444Z ERROR smithay::wayland::shell::xdg: surface missing from known popups
2026-07-08T12:57:27.761981Z ERROR smithay::wayland::shell::xdg: surface missing from known popups
2026-07-08T12:57:27.770664Z  INFO shoji_wm::input: runtime window minimize request dispatch window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 title=YouTube - Google Chrome app_id=Some("google-chrome") minimized=false source=XdgActivation
2026-07-08T12:57:27.771601Z  INFO shoji_wm::input: runtime window minimize request result window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 invoked=true
2026-07-08T12:57:27.771619Z  INFO shoji_wm::input: runtime window activate request dispatch window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 title=YouTube - Google Chrome app_id=Some("google-chrome") source=XdgActivation
2026-07-08T12:57:27.771858Z  INFO shoji_wm::input: runtime window activate request result window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 invoked=true
2026-07-08T12:57:42.122282Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 title=hdr - YouTube - Google Chrome cached_title=Some("YouTube - Google Chrome") app_id=Some("google-chrome") cached_app_id=Some("google-chrome") reason="xdg-toplevel-title-changed"
2026-07-08T12:57:56.196756Z  INFO shoji_wm::state: idle inhibition started apps=["google-chrome"]
2026-07-08T12:57:56.276788Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 title=YouTube - Google Chrome cached_title=Some("hdr - YouTube - Google Chrome") app_id=Some("google-chrome") cached_app_id=Some("google-chrome") reason="xdg-toplevel-title-changed"
2026-07-08T12:57:59.235324Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 title=2020 LG OLED l The Black 4K HDR 60fps - YouTube - Google Chrome cached_title=Some("YouTube - Google Chrome") app_id=Some("google-chrome") cached_app_id=Some("google-chrome") reason="xdg-toplevel-title-changed"
2026-07-08T12:59:28.481499Z ERROR smithay::wayland::shell::xdg: surface missing from known popups
2026-07-08T12:59:28.666065Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 title=hdr - YouTube - Google Chrome cached_title=Some("2020 LG OLED l The Black 4K HDR 60fps - YouTube - Google Chrome") app_id=Some("google-chrome") cached_app_id=Some("google-chrome") reason="xdg-toplevel-title-changed"
2026-07-08T12:59:30.674983Z  INFO shoji_wm::state: idle inhibition stopped apps=["google-chrome"]
2026-07-08T13:00:15.997431Z  INFO shoji_wm::state: idle inhibition started apps=["google-chrome"]
2026-07-08T13:00:17.256740Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 title=3 Hours of Rainy Night Walk in Tokyo, Japan • 4K HDR - YouTube - Google Chrome cached_title=Some("hdr - YouTube - Google Chrome") app_id=Some("google-chrome") cached_app_id=Some("google-chrome") reason="xdg-toplevel-title-changed"
2026-07-08T13:02:02.604691Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 title=hdr - YouTube - Google Chrome cached_title=Some("3 Hours of Rainy Night Walk in Tokyo, Japan • 4K HDR - YouTube - Google Chrome") app_id=Some("google-chrome") cached_app_id=Some("google-chrome") reason="xdg-toplevel-title-changed"
2026-07-08T13:02:04.613415Z  INFO shoji_wm::state: idle inhibition stopped apps=["google-chrome"]
2026-07-08T13:02:20.240198Z  INFO shoji_wm::state: idle inhibition started apps=["google-chrome"]
2026-07-08T13:02:21.131312Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 title=Don't Buy an OLED Until You Watch This! | 4K HDR 240FPS Dolby Vision TV Test (4K Video) - YouTube - Google Chrome cached_title=Some("hdr - YouTube - Google Chrome") app_id=Some("google-chrome") cached_app_id=Some("google-chrome") reason="xdg-toplevel-title-changed"
2026-07-08T13:02:24.418144Z  INFO shoji_wm::state: idle inhibition stopped apps=["google-chrome"]
2026-07-08T13:02:36.155963Z  INFO shoji_wm::handlers::xdg_shell: xdg toplevel metadata changed window_id=InnerClientId { ptr: 0x55ced3564080, alive: true }:27 title=Escape the Backrooms – Launch Trailer – Nintendo Switch 2 - YouTube - Google Chrome cached_title=Some("Don't Buy an OLED Until You Watch This! | 4K HDR 240FPS Dolby Vision TV Test (4K Video) - YouTube - Google Chrome") app_id=Some("google-chrome") cached_app_id=Some("google-chrome") reason="xdg-toplevel-title-changed"
2026-07-08T13:02:36.200406Z  INFO shoji_wm::state: idle inhibition started apps=["google-chrome"]
2026-07-08T13:02:37.531788Z  INFO shoji_wm::state: idle inhibition stopped apps=["google-chrome"]
2026-07-08T13:02:41.000106Z  INFO shoji_wm::state: shutdown requested
2026-07-08T13:02:41.000195Z  INFO shoji_wm::backend: tty backend loop exited

@sophietheopossum

Copy link
Copy Markdown
Contributor Author

Ah, I Don't have an AMD GPU admittedly, only other GPU is an integrated intel xe. This is the test display : https://www.philips.co.uk/c-p/43PUS8505_12/8500-series-4k-uhd-led-android-tv-with-ambilight-3-sided I think it's HDR 400 iirc.

@sophietheopossum

sophietheopossum commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

Oh, actually I do, I have a steamdeck, and it has an oled HDR display..... okay i'll look into this further, but you're welcome to work on it too if i take too long

Sign up for free to 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.

2 participants