hyprwm / Hyprland

Hyprland is an independent, highly customizable, dynamic tiling Wayland compositor that doesn't sacrifice on its looks.
https://hyprland.org
BSD 3-Clause "New" or "Revised" License
21.58k stars 902 forks source link

Cursor barely moves when tearing is active and explicit_sync_kms=true #7453

Closed Cloudperry closed 2 months ago

Cloudperry commented 2 months ago

Regression?

No

System Info and Version

System/Version info ```sh Hyprland, built from branch main at commit 3e7325af57c4670ebea65d2669f49526819c2260 (output: dont cast enum out of range (7448)). Date: Wed Aug 21 12:52:40 2024 Tag: v0.42.0-49-g3e7325af, commits: 5118 flags: (if any) System Information: System name: Linux Node name: roni-desktop Release: 6.10.6-2-cachyos-lto Version: #1 SMP PREEMPT_DYNAMIC Mon, 19 Aug 2024 23:31:19 +0000 GPU information: 0d:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Navi 21 [Radeon RX 6950 XT] [1002:73a5] (rev c0) (prog-if 00 [VGA controller]) os-release: NAME="Arch Linux" PRETTY_NAME="Arch Linux" ID=arch BUILD_ID=rolling ANSI_COLOR="38;2;23;147;209" HOME_URL="https://archlinux.org/" DOCUMENTATION_URL="https://wiki.archlinux.org/" SUPPORT_URL="https://bbs.archlinux.org/" BUG_REPORT_URL="https://gitlab.archlinux.org/groups/archlinux/-/issues" PRIVACY_POLICY_URL="https://terms.archlinux.org/docs/privacy-policy/" LOGO=archlinux-logo plugins: ======Config-Start====== Config File: /home/roni/.config/hypr/hyprland.conf: Read Succeeded source = ~/.config/hypr/startup.conf source = ~/.config/hypr/settings.conf source = ~/.config/hypr/input.conf source = ~/.config/hypr/rules.conf Config File: /home/roni/.config/hypr/startup.conf: Read Succeeded ################# ### AUTOSTART ### ################# # Hyprlock # exec-once = hyprlock # Hypridle exec-once = hypridle # Notification service exec-once = systemctl --user start swaync-without-graphical-target # Status bar exec-once = systemctl --user start ironbar # Wallpaper service exec-once = systemctl --user start hyprpaper # Polkit service exec-once = systemctl --user start lxqt-policykit-agent # Clipboard history daemon exec-once = systemctl --user start cliphist-text exec-once = systemctl --user start cliphist-image # Startup apps exec-once = discord & corectrl & blueman-applet ############################# ### ENVIRONMENT VARIABLES ### ############################# # See https://wiki.hyprland.org/Configuring/Environment-variables/ env = XCURSOR_SIZE,24 env = HYPRCURSOR_SIZE,24 #env = AQ_NO_ATOMIC,1 #env = HYPRLAND_TRACE,1 #env = AQ_TRACE,1 # Toolkit options env = GDK_BACKEND,wayland,x11,* env = QT_QPA_PLATFORM,wayland;xcb env = QT_QPA_PLATFORMTHEME,qt6ct env = QT_WAYLAND_DISABLE_WINDOWDECORATION,1 # KDE apps fixes env = XDG_MENU_PREFIX,arch- Config File: /home/roni/.config/hypr/settings.conf: Read Succeeded ################ ### MONITORS ### ################ # See https://wiki.hyprland.org/Configuring/Monitors/ monitor = DP-3, 2560x1440@144, 1920x0, 1 monitor = HDMI-A-1, 1920x1080@60, 0x700, 1 ################### ### MY PROGRAMS ### ################### # See https://wiki.hyprland.org/Configuring/Keywords/ # Set programs that you use $terminal = alacritty $fileManager = dolphin $browser = firefox $textEditor = neovide $menu = wofi --show drun $menuExec = wofi --show run ##################### ### LOOK AND FEEL ### ##################### # Refer to https://wiki.hyprland.org/Configuring/Variables/ # https://wiki.hyprland.org/Configuring/Variables/#general general { gaps_in = 4 gaps_out = 8 border_size = 2 # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg col.inactive_border = rgba(595959aa) # Set to true enable resizing windows by clicking and dragging on borders and gaps resize_on_border = false # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on allow_tearing = true layout = dwindle } # https://wiki.hyprland.org/Configuring/Variables/#decoration decoration { rounding = 6 # Change transparency of focused and unfocused windows active_opacity = 1.0 inactive_opacity = 1.0 drop_shadow = true shadow_range = 4 shadow_render_power = 3 col.shadow = rgba(1a1a1aee) # https://wiki.hyprland.org/Configuring/Variables/#blur blur { enabled = true size = 3 passes = 1 vibrancy = 0.1696 } } # https://wiki.hyprland.org/Configuring/Variables/#animations animations { enabled = true # Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more bezier = myBezier, 0.05, 0.9, 0.1, 1.05 animation = windows, 1, 7, myBezier animation = windowsOut, 1, 7, default, popin 80% animation = border, 1, 10, default animation = borderangle, 1, 8, default animation = fade, 1, 7, default animation = workspaces, 1, 6, default } # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more dwindle { preserve_split = false no_gaps_when_only = 1 } # https://wiki.hyprland.org/Configuring/Variables/#misc misc { enable_swallow = true swallow_regex = .* initial_workspace_tracking = 0 # Special workspaces bug workaround force_default_wallpaper = 1 disable_hyprland_logo = true vrr = 2 } cursor { #no_hardware_cursors = true #no_break_fs_vrr = true #min_refresh_rate = 48 } render { explicit_sync = 1 explicit_sync_kms = 0 direct_scanout = true } debug { #disable_logs = false } Config File: /home/roni/.config/hypr/input.conf: Read Succeeded input { # Keyboard kb_layout = fi kb_variant = nodeadkeys repeat_rate = 20 repeat_delay = 200 # Mouse follow_mouse = 1 sensitivity = -0.78 # -1.0 - 1.0, 0 means no modification. accel_profile = flat touchpad { natural_scroll = false } } gestures { workspace_swipe = false } # See https://wiki.hyprland.org/Configuring/Keywords/ $mainMod = SUPER # Sets "Windows" key as main modifier # Binds, see https://wiki.hyprland.org/Configuring/Binds/ for more bind = $mainMod, Q, killactive, bind = $mainMod, Z, exec, loginctl terminate-session $XDG_SESSION_ID bind = $mainMod Control_L, F, togglefloating, bind = $mainMod, space, exec, $menu bind = $mainMod SHIFT, space, exec, $menuExec bind = $mainMod Control_L, T, togglesplit, # dwindle # Important apps bind = $mainMod, C, exec, $terminal bind = $mainMod, B, exec, start-in-workspaces -a=$browser bind = $mainMod, F, exec, $fileManager bind = $mainMod, E, exec, $textEditor # Move focus with mainMod + arrow keys bind = $mainMod, H, movefocus, l bind = $mainMod, S, movefocus, r bind = $mainMod, N, movefocus, u bind = $mainMod, T, movefocus, d # Move window with mainMod + arrow keys bind = $mainMod SHIFT, H, movewindow, l bind = $mainMod SHIFT, S, movewindow, r bind = $mainMod SHIFT, N, movewindow, u bind = $mainMod SHIFT, T, movewindow, d # Move window with mainMod + arrow keys #bind = $mainMod, Left, swapwindow, l #bind = $mainMod, Right, swapwindow, r #bind = $mainMod, Up, swapwindow, u #bind = $mainMod, Down, swapwindow, d # Switch workspaces with mainMod + [0-9] bind = $mainMod, Down, workspace, r+1 bind = $mainMod, Up, workspace, r-1 bind = $mainMod, Left, focusmonitor, l bind = $mainMod, Right, focusmonitor, r # Move active window to a workspace with mainMod + SHIFT + [0-9] bind = $mainMod SHIFT, Down, movetoworkspace, r+1 bind = $mainMod SHIFT, Up, movetoworkspace, r-1 # Special workspaces bind = $mainMod, M, togglespecialworkspace, music bind = $mainMod SHIFT, C, togglespecialworkspace, terminal bind = $mainMod, G, togglespecialworkspace, fullscreenGame # Scroll through existing workspaces with mainMod + scroll bind = $mainMod, mouse_down, workspace, e+1 bind = $mainMod, mouse_up, workspace, e-1 # Move/resize windows with mainMod + LMB/RMB and dragging bindm = $mainMod, mouse:272, movewindow bindm = $mainMod, mouse:273, resizewindow # Clipboard history bind = $mainMod, V, exec, cliphist list | wofi --show dmenu | cliphist decode | wl-copy # Screenshotting bind = $mainMod, Print, exec, grim -o DP-3 bind = $mainMod SHIFT, Print, exec, grim -g "$(slurp)" bind = $mainMod CTRL, Print, exec, grim # Media keys and screen record replay bindel = , XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ bindel = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- bindl = , XF86AudioPlay, exec, playerctl play-pause bindl = , XF86AudioStop, exec, playerctl stop bindl = , XF86AudioNext, exec, playerctl next bindl = , XF86AudioPrev, exec, playerctl previous bindl = Control_L, XF86AudioNext, exec, playerctl position 5+ bindl = Control_L, XF86AudioPrev, exec, playerctl position 5- bindel = Control_L, XF86AudioRaiseVolume, exec, playerctl volume 0.05+ bindel = Control_L, XF86AudioLowerVolume, exec, playerctl volume 0.05- bind = $mainMod, R, exec, killall -SIGUSR1 gpu-screen-recorder # Wallpaper switching bind = $mainMod, W, exec, hyprctl hyprpaper preload /home/roni/Pictures/Wallpapers/hyprland-current-background.png bind = $mainMod, W, exec, hyprctl hyprpaper wallpaper /home/roni/Pictures/Wallpapers/hyprland-current-background.png bind = $mainMod, W, exec, hyprctl hyprpaper unload unused Config File: /home/roni/.config/hypr/rules.conf: Read Succeeded # See https://wiki.hyprland.org/Configuring/Window-Rules/ for more # See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules # Example windowrule v1 # windowrule = float, ^(kitty)$ # Example windowrule v2 # windowrulev2 = float,class:^(kitty)$,title:^(kitty)$ $high = 0.88 0.88 $medium = 0.91 0.91 $subtle = 0.94 0.94 $minimal = 0.97 0.97 windowrulev2 = suppressevent maximize,class:.* windowrulev2 = workspace special:fullscreenGame, class:steam_app_[0-9]+, fullscreen:1 windowrulev2 = immediate, class:.* windowrulev2 = opacity $minimal, class:^(neovide)$ windowrulev2 = opacity $subtle, class:^(Alacritty)$ windowrulev2 = opacity $subtle, class:^(org.kde.dolphin)$ windowrulev2 = opacity $minimal, class:^(discord)$ windowrulev2 = opacity 1.0 1.0, fullscreen:1 workspace = r[1-6], persistent:true workspace = 1, monitor:DP-3, default:true workspace = r[1-3], monitor:DP-3 workspace = 4, monitor:HDMI-A-1, default:true workspace = r[4-6], monitor:HDMI-A-1 workspace = special:music, on-created-empty:deadbeef workspace = special:terminal, on-created-empty:$terminal workspace = special:fullscreenGame animation = workspaces,1,4,default,slidefadevert windowrulev2 = workspace 4 silent, class:^(discord)$ ======Config-End======== ```

Description

Having both tearing and explicit_sync_kms enabled causes the cursor to lag hard. Hyprland seems to corrupt the state of something in the graphics stack, because disabling explicit_sync_kms is not enough to fix the cursor lag. Its only fixed after a reboot. I first noticed this issue with https://github.com/hyprwm/Hyprland/pull/7151#issuecomment-2267209244.

How to reproduce

  1. Enable tearing by setting general:allow_tearing = true and make a window rule for tearing (e.g. windowrulev2 = immediate, class:.*)
  2. Set render:explicit_sync = 1 and render:explicit_sync_kms = 1
  3. Open a fullscreen application that is set to have tearing on
  4. Cursor stutters and barely moves while tearing is active
  5. Setting explicit_sync_kms = 0 fixes this, but only after a full PC reboot (restarting Hyprland is not enough)

Crash reports, logs, images, videos

No response

Cloudperry commented 2 months ago

Okay idk what caused this, but its not happening anymore. Maybe it was fixed by https://github.com/hyprwm/aquamarine/pull/60 or somewhere else.

Now this cursor slowdown is happening when using hardware cursors with tearing. When its happening the log has a lot of this: [ERR] [AQ] atomic drm request: failed to commit: Invalid argument, flags: ATOMIC_NONBLOCK PAGE_FLIP_EVENT PAGE_FLIP_ASYNC.

This is probably caused by kernel support for async page flips being incomplete. The kernel might need this patch or something like that for cursor planes. Plasma doesn't have this with hw cursors though, so maybe it could be worked around by not doing tearing commits only for the cursor plane (just a guess). Not creating a bug report for this yet, because idk if it can be fixed by Hyprland.