Skip to content

Fullscreen windows are not unredirected on NVIDIA X11 even with unredirect-fullscreen-windows enabled, preventing G-SYNC/VRR #847

Open

Description

@Tedpac

Distribution

Linux Mint 22.3 (Zena), Cinnamon edition

Package version

Muffin v6.6.3, Cinnamon v6.6.9

Graphics hardware in use

NVIDIA GeForce GTX 1050 Ti, proprietary driver v580.173.02, X11 session. Display under test: ASUS ROG Strix XG27ACMES, 2560x1440 at up to 240 Hz, connected via DisplayPort (VRR capable, not on NVIDIA's validated G-SYNC Compatible list)

Frequency

Always

Bug description

With org.cinnamon.muffin unredirect-fullscreen-windows set to true (verified with dconf read, including after a full reboot), fullscreen applications are still being composited. I verified this with the NVIDIA Graphics API Visual Indicator (enabled via ShowGraphicsVisualIndicator), which always shows BLIT - VSYNC ON for a fullscreen Vulkan client running under Cinnamon. Since the client never flips, G-SYNC/VRR can never engage.

The compositor is the only variable: replacing the WM in the same X session with openbox --replace and running the exact same command immediately shows FLIP in the indicator, and VRR physically engages. The monitor's own OSD refresh rate counter follows the application frame rate (100 FPS in my test) instead of staying pinned at the panel's maximum 240 Hz.

To rule out the usual suspects, all of the following were true during every run under Cinnamon:

  • Only one monitor active, with the X screen framebuffer resized to match it exactly (xrandr --fb 2560x1440), so the fullscreen window covers the entire X screen, which the NVIDIA driver requires for flipping. My normal setup is dual monitor, but the bug reproduces with a single one.
  • Allow G-SYNC on monitor not validated as G-SYNC Compatible applied, and DisplayVRREnabled=1 for the display under test confirmed with nvidia-settings -q during the tests (immediately before and after the main runs).
  • Force Composition Pipeline and Force Full Composition Pipeline both off, no /etc/X11/xorg.conf, stock driver install.
  • Reproduced with two different builds of the same client: Flatpak mpv v0.41.0 (--vo=gpu-next, Vulkan) and the distro mpv v0.37.0 forced to Vulkan (--gpu-api=vulkan). Same BLIT result in both, so it is not a Flatpak sandbox issue.
  • No overlays or notifications on top of the window.

Steps to reproduce

  1. Run gsettings set org.cinnamon.muffin unredirect-fullscreen-windows true, then reboot (restarting Cinnamon only gives the same result).
  2. Enable the driver indicator: nvidia-settings --assign ShowGraphicsVisualIndicator=1
  3. Set single monitor geometry: xrandr --fb 2560x1440 --output HDMI-0 --off --output DP-0 --pos 0x0 (adjust output names). Then re-apply the Allow G-SYNC on monitor not validated as G-SYNC Compatible checkbox in nvidia-settings, because changing the metamode clears it.
  4. Run a fullscreen Vulkan client, for example: mpv --fs --no-audio --vo=gpu-next --gpu-api=vulkan "av://lavfi:testsrc2=size=2560x1440:rate=100" (use --vo=gpu --gpu-api=vulkan on builds without gpu-next)
  5. Read the indicator overlay in the corner of the video.

Expected behavior

The fullscreen window gets unredirected, the indicator shows FLIP, and G-SYNC can engage.

Additional information

This is related to #701 and #715, but it is a different case: there is no Wine involved, and the client is a Vulkan application, which according to the discussion in #715 is not affected by the 1x1 child window problem that PR works around. In this configuration, fullscreen unredirection simply never happens.

Activity

  1. itz-me-zappex commented on Aug 31, 2026

    @itz-me-zappex

    Here is a function that figures out whether window should be unredirected or not.

    gboolean
    meta_surface_actor_x11_should_unredirect (MetaSurfaceActorX11 *self)
    {
    if (!meta_surface_actor_x11_is_opaque (META_SURFACE_ACTOR (self)))
    return FALSE;
    if (!self->does_full_damage &&
    !meta_window_is_override_redirect (self->window))
    return FALSE;
    return TRUE;
    }

    As you can see, there is a filter that prevents unredirect under some circumstances, and there was said that dumb redirect/unredirect is not what devs want. #715 (comment)

  2. khameleonium commented on Sep 27, 2026

    @khameleonium

    Same thing here on Intel integrated graphics with a native Linux game, same Mint 22.3 / Muffin 6.6.3 / Cinnamon 6.6.9. So this doesn't look NVIDIA- or Wine-specific. On Intel it shows up as a clear FPS loss in every game. Below are my measurements, plus two related findings from the same investigation.

    Setup: Intel UHD (CometLake-U GT2, i915, modesetting DDX + glamor), Mesa 25.2.8, Xorg 21.1.12, i5-10210U laptop, kernel 7.0. Single active monitor (HDMI 1920x1080@60, laptop panel off). unredirect-fullscreen-windows = true. Only stock @cinnamon.org applets, and all desklets were removed for the last runs.

    1. Fullscreen games are never unredirected → 10–15 FPS lost

    Test game: Half-Life 2, native 32-bit hl2_linux (OpenGL/SDL, not Steam, no Wine), true fullscreen 1920x1080, in-game VSync off. The game window looks like a perfect unredirect candidate:

    _NET_WM_STATE(ATOM) = _NET_WM_STATE_FULLSCREEN, _NET_WM_STATE_FOCUSED
    _NET_WM_BYPASS_COMPOSITOR(CARDINAL) = 1
      Absolute upper-left X:  0   Y: 0   Width: 1920   Height: 1080   Depth: 24
      Override Redirect State: no
    

    Same machine, same game, same scene, 30 s averages (CPU = % of one core):

    Cinnamon X11 GNOME 46 X11 (same Xorg) KDE Plasma Wayland Cinnamon X11, no desklets
    In-game FPS 45–55 60 (capped) 60 45–55
    iGPU clock / idle (RC6) 1100 MHz (max) / 0 % 1100 / 0 % 1100 / 1 % 1100 / 0 %
    Package temp 67 °C 66 °C 68 °C 72 °C
    hl2_linux 62.5 % 66.0 % 67.5 % 64.4 %
    Compositor cinnamon 18.6 % gnome-shell 0.1 % kwin_wayland 6.7 % cinnamon 9.5 %
    Xorg / Xwayland 4.9 % 4.8 % 2.5 % 5.1 %

    No thermal or power throttling, and the GPU is fully loaded in every session. The only real difference is the compositor. On the same Xorg, gnome-shell goes idle during the fullscreen game (as expected after unredirecting). cinnamon keeps working, and the game loses ~10–15 FPS. It's not just HL2: all my Steam games (native and Proton) run fine in GNOME and KDE (both X11 and Wayland sessions) and noticeably worse in Cinnamon.

    A/B toggle of the setting while the game is focused (3 s settle, then 10 s sample; samples discarded if focus was lost):

    unredirect=true   cinnamon 10%  Xorg 6%
    unredirect=false  cinnamon 9%   Xorg 5%
    unredirect=true   cinnamon 10%  Xorg 6%
    unredirect=false  cinnamon 9%   Xorg 5%
    unredirect=true   cinnamon 9%   Xorg 5%
    unredirect=false  cinnamon 10%  Xorg 7%
    

    The setting makes no measurable difference: ~2 FPS in-game, and identical compositor load. Unlike the Wine case in #701, this is a native SDL window without the 1x1 child window problem, so it looks like the same "never unredirects" behaviour as in this issue.

    2. A desklet refreshing every 3 s froze all games for 0.5–1 s every 3 s

    Before the measurements above, every game in Cinnamon X11 froze completely (image stuck for 0.5–1 s, then smooth again) exactly every 3 seconds. This affected windowed and fullscreen games, native and Proton, even very light ones like Blobby Volley. Other desktops on the same machine had no such freezes.

    The cause was the third-party desklet commandResult@ZimiZones with a refresh interval of 3 s (delay = 3.0). On each refresh it runs 5 small commands through Util.spawn_async and redraws its text:

    date +"%A %B %d, %I:%M %p"                      3 ms
    hostname -I                                     2 ms
    sensors coretemp-isa-0000 / nvme-pci-2e00       5–7 ms
    upower -i $(upower -e | grep BAT)              19 ms
    uptime -p                                       2 ms
    

    The commands themselves are fast and run asynchronously. Still, removing the desklet completely fixed the freezes, while enabling unredirect-fullscreen-windows did not help at all.

    I'm reporting this here because it points to the same root cause. Game frames on X11 keep going through Cinnamon's compositor even in fullscreen, so any stall in Cinnamon's main loop (an xlet update, GJS work) freezes the game's image. The desklet may not be written ideally, but a desktop widget shouldn't be able to freeze a fullscreen game like this. With working unredirection, this wouldn't happen.

    3. Side note: the Wayland session gives clients only software rendering

    We know "Cinnamon on Wayland" is experimental, but this seemed worth mentioning. On this machine, every client in that session gets llvmpipe. Muffin itself uses the GPU, but Xwayland has no DRI3 and Wayland clients can't find the render node. Games are a slideshow there.

    $ glxinfo -B                    → llvmpipe (LLVM 20.1.2), Accelerated: no; "screen 0 does not appear to be DRI3 capable"
    $ eglinfo -B                    → GBM: Mesa Intel UHD (CML GT2);  Wayland / X11 platforms: llvmpipe
    $ wayland-info                  → zwp_linux_dmabuf_v1 version 3 only, no wl_drm
    EGL_LOG_LEVEL=debug             → "failed to get driver name for fd -1", "MESA-LOADER: failed to retrieve device information"
    open /dev/dri fds               → cinnamon: card1; Xwayland: none; game: none
    

    My guess is that Mesa 25.x needs linux-dmabuf v4 feedback (or wl_drm) to pick the device. I can open a separate issue for this if you prefer.


    I can run any additional tests or debug builds. If there's a way to log Muffin's unredirect decision, I'd be happy to capture it.

    The investigation (measurement scripts, xprop and A/B tests, finding the desklet) was done with the help of Claude Code (Anthropic's AI assistant). I verified the in-game behaviour myself.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions