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.88k stars 910 forks source link

Enabling vsync in games causes screen tearing when moving the mouse (Nvidia gpu) #7652

Open arash28134 opened 2 months ago

arash28134 commented 2 months ago

Regression?

No

System Info and Version

System/Version info ```sh Hyprland, built from branch at commit 9a09eac79b85c846e3a865a9078a3f8ff65a9259 (props: bump version to 0.42.0). Date: Wed Aug 7 19:17:10 2024 Tag: v0.42.0, commits: 5069 flags: (if any) System Information: System name: Linux Node name: arash Release: 6.10.7-arch1-1 Version: #1 SMP PREEMPT_DYNAMIC Thu, 29 Aug 2024 16:48:57 +0000 GPU information: 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP106 [GeForce GTX 1060 6GB] [10de:1c03] (rev a1) (prog-if 00 [VGA controller]) NVRM version: NVIDIA UNIX x86_64 Kernel Module 560.35.03 Fri Aug 16 21:39:15 UTC 2024 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/viper/.config/hypr/hyprland.conf: Read Succeeded # todo: tabbed windows # You can split this configuration into multiple files # Create your files separately and then link them to this file like this: source = ~/.config/hypr/nvidia.conf ################ ### MONITORS ### ################ monitor = DP-3, 1920x1080, 1920x0, 1 monitor = HDMI-A-1, 1920x1080, 0x0, 1 monitor = DP-2, 1024x768, -1024x312, 1 ################### ### MY PROGRAMS ### ################### $terminal = kitty $fileManager = nemo $menu = wofi --show drun $music = spotify-launcher $browser = firefox $messager1 = telegram-desktop $messager2 = discord $screenshot = flameshot gui $editor1 = nvim $editor2 = vim # Todo ################# ### AUTOSTART ### ################# # Autostart necessary processes (like notifications daemons, status bars, etc.) # Or execute your favorite apps at launch like this: # exec-once = btop & asciiquarium exec-once = waybar & hyprpaper ############################# ### ENVIRONMENT VARIABLES ### ############################# env = XCURSOR_SIZE,24 env = HYPRCURSOR_SIZE,24 # Todo ##################### ### LOOK AND FEEL ### ##################### # Refer to https://wiki.hyprland.org/Configuring/Variables/ # https://wiki.hyprland.org/Configuring/Variables/#general general { gaps_in = 5 gaps_out = 20 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 = false layout = dwindle } # https://wiki.hyprland.org/Configuring/Variables/#decoration decoration { rounding = 10 # 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 { pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below preserve_split = true # You probably want this } # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more master { new_status = master } # https://wiki.hyprland.org/Configuring/Variables/#misc misc { force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :( } ############# ### INPUT ### ############# input { kb_layout = eu,ir kb_options = grp:alt_shift_toggle } ################### ### KEYBINDINGS ### ################### $mainMod = SUPER # App binds bind = $mainMod, C, killactive, bind = $mainMod, M, exit, bind = $mainMod, V, togglefloating, bind = $mainMod, P, pseudo, # dwindle bind = $mainMod, J, togglesplit, # dwindle bind = $mainMod, R, exec, $menu bind = $mainMod, X, exec, $music bind = $mainMod, D, exec, $messager2 bind = $mainMod, Z, exec, $fileManager bind = $mainMod, T, exec, $messager1 bind = $mainMod, Q, exec, $terminal bind = $mainMod, A, exec, $browser bind = $mainMod, W, exec, $editor1 bind = $mainMod, E, exec, $editor2 bind = $mainMod, F, exec, $screenshot # PulseAudio controls bind = , XF86AudioMute, exec, pactl set-sink-mute @DEFAULT_SINK@ toggle bind = , XF86AudioLowerVolume, exec, pactl set-sink-volume @DEFAULT_SINK@ -5% bind = , XF86AudioRaiseVolume, exec, pactl set-sink-volume @DEFAULT_SINK@ +5% bind = , XF86AudioPlay, exec, playerctl play-pause # Move focus with mainMod + arrow keys bind = $mainMod, left, movefocus, l bind = $mainMod, right, movefocus, r bind = $mainMod, up, movefocus, u bind = $mainMod, down, movefocus, d # Switch workspaces with mainMod + [0-9] bind = $mainMod, 1, workspace, 1 bind = $mainMod, 2, workspace, 2 bind = $mainMod, 3, workspace, 3 bind = $mainMod, 4, workspace, 4 bind = $mainMod, 5, workspace, 5 bind = $mainMod, 6, workspace, 6 bind = $mainMod, 7, workspace, 7 bind = $mainMod, 8, workspace, 8 bind = $mainMod, 9, workspace, 9 bind = $mainMod, 0, workspace, 10 # Move active window to a workspace with mainMod + SHIFT + [0-9] bind = $mainMod SHIFT, 1, movetoworkspace, 1 bind = $mainMod SHIFT, 2, movetoworkspace, 2 bind = $mainMod SHIFT, 3, movetoworkspace, 3 bind = $mainMod SHIFT, 4, movetoworkspace, 4 bind = $mainMod SHIFT, 5, movetoworkspace, 5 bind = $mainMod SHIFT, 6, movetoworkspace, 6 bind = $mainMod SHIFT, 7, movetoworkspace, 7 bind = $mainMod SHIFT, 8, movetoworkspace, 8 bind = $mainMod SHIFT, 9, movetoworkspace, 9 bind = $mainMod SHIFT, 0, movetoworkspace, 10 # Special workspace (scratchpad) bind = $mainMod, S, togglespecialworkspace, magic bind = $mainMod SHIFT, S, movetoworkspace, special:magic # 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 bind = $mainMod SHIFT, F, fullscreen ############################## ### WINDOWS AND WORKSPACES ### ############################## windowrulev2 = suppressevent maximize, class:.* # You'll probably like this. Config File: /home/viper/.config/hypr/nvidia.conf: Read Succeeded ############################################################ ### NVIDIA (Remove if on a system without an nvidia gpu) ### ############################################################ env = LIBVA_DRIVER_NAME,nvidia env = XDG_SESSION_TYPE,wayland env = GBM_BACKEND,nvidia-drm env = __GLX_VENDOR_LIBRARY_NAME,nvidia cursor { no_hardware_cursors = true } ======Config-End======== ```

Description

Enabling vsync in games causes screen tearing when moving the mouse. they work fine without vsync or with vsync if one doesn't move the mouse.

How to reproduce

Enable vsync option in games Minecraft and Postal 2. So far these are the only games I've played in Hyperland and they both have had this issue.

Crash reports, logs, images, videos

https://github.com/user-attachments/assets/a6a85b5b-e6d5-4fd3-9f25-66c05f45c3ca

Sorry for bad quality

XNEP1 commented 2 months ago

The same thing happens to me in Genshin Impact. And I am using an AMD card and hyprland on version v0.42.0.

I noticed two things that may help identify the problem:

  1. Setting render:explicit_sync and explicit_sync_kms to 0 solved the problem for me (although it is not ideal).
  2. The game allows me to hold ALT to move the mouse around the hud. While holding ALT, the problem does not occur. More specifically, the problem only occurs when the mouse is centered and invisible.
arash28134 commented 2 months ago

The same thing happens to me in Genshin Impact. And I am using an AMD card and hyprland on version v0.42.0.

I noticed two things that may help identify the problem:

  1. Setting render:explicit_sync and explicit_sync_kms to 0 solved the problem for me (although it is not ideal).
  2. The game allows me to hold ALT to move the mouse around the hud. While holding ALT, the problem does not occur. More specifically, the problem only occurs when the mouse is centered and invisible.

I can confirm this only happens inside the game (where mouse is invisible/centered). In Minecraft as you can see both in the menu and also inventory moving the mouse works with no issue. Same in Postal 2, except for the game's starting menu (which involves 3d objects moving in a circle and is not a flat menu) every other part where the mouse is visible (e.g. menus, inventory) vsync works ok.

I guess this is not really GPU related. I also tried with no_hardware_cursors set to false and it didn't change anything.

danielah05 commented 2 months ago

seem to be having the same issue, while disabling explicit sync fixes the problem, it also then causes issues for screen capturing programs like obs or discord screenshare, causing extreme stutters in them, making just disabling explicit sync not a good solution at all

arash28134 commented 2 months ago

seem to be having the same issue, while disabling explicit sync fixes the problem, it also then causes issues for screen capturing programs like obs or discord screenshare, causing extreme stutters in them, making just disabling explicit sync not a good solution at all

What gpu are you using?

XNEP1 commented 2 months ago

For now, I am limiting my games FPS to 1 lower than my monitor Hz. For some reason doing this your problem can be ""fixed"" too.

danielah05 commented 2 months ago

seem to be having the same issue, while disabling explicit sync fixes the problem, it also then causes issues for screen capturing programs like obs or discord screenshare, causing extreme stutters in them, making just disabling explicit sync not a good solution at all

What gpu are you using?

nvidia gtx 980, ive only had this issue on hyprland, when i was on plasma still about a month ago this wasnt an issue for me

jaredmontoya commented 2 months ago

I started experiencing similar issues in a game under wine since 0.43 (Nvidia Optimus laptop) Did not have that on 0.42 at all.

arash28134 commented 2 months ago

Here's the footage I recorded from Postal 2. by default Postal 2's ini file has UseVSync enabled. disabling it makes no difference. I also tried enabling OverrideDesktopRefreshRate which didn't change anything. In all cases this is the result:

https://github.com/user-attachments/assets/3dedd180-e917-4666-8408-15fdfe3ee4fd

(the video is intentionally muted)

arash28134 commented 2 months ago

Update: I tried Postal 2 with hyperland's screen tearing option enabled which didn't change anything

arash28134 commented 2 months ago

Update: This issue occurs when enabling vsync in Counter Strike 1.6 (Steam) as well. disabling it fixes screen flickering.

NyanMaths commented 2 months ago

I had the tearing on cursor issue on Geometry Dash (OpenGL) using a hybrid graphics laptop and turns out my MangoHUD settings were causing it. I disabled hardware cursors and vsync from both MangoHUD and Geometry Dash and no more tearing nor stutterings (caused by Geometry Dash vsync). CPU : Intel i5-11400H (Tiger Lake) GPU : NYAVIDIA RTX 3050 (4 GB) Non-Optimus laptop, Hyprland rendered by iGPU and environment from wiki.

XNEP1 commented 1 month ago

In version v0.41.2 this problem does not occur. I believe it is a consequence of Wlroots being dropped as a dependency in v0.42.

NyanMaths commented 3 weeks ago

I can't reproduce this tearing anymore on hypr*-git, this commit might have fixed the issue : https://github.com/hyprwm/Hyprland/commit/ee8116ac5dc412dce924a0163074ce7988dd0cfc

XNEP1 commented 3 weeks ago

Still happen to me.

jaredmontoya commented 3 weeks ago

This happens to me only in nvidia optimus mode, If I run everything directly on the nvidia gpu it doesn't happen.

sudoharun commented 3 weeks ago

For me, with the following env vars, the problem is gone is most games I've tested except Minecraft:

env = XDG_SESSION_TYPE,wayland
env = MOZ_ENABLE_WAYLAND,1
env = ELECTRON_OZONE_PLATFORM_HINT,auto
env = WINIT_UNIX_BACKEND,wayland
env = HYPRLAND_LOG_WLR,1

env = CLUTTER_BACKEND,wayland
env = GDK_BACKEND,wayland,x11,*
env = QT_AUTO_SCREEN_SCALE_FACTOR,1
env = QT_QPA_PLATFORM,wayland;xcb
env = QT_QPA_PLATFORMTHEME,qt6ct
env = QT_SCALE_FACTOR,1
env = QT_WAYLAND_DISABLE_WINDOWDECORATION,1
env = XDG_SESSION_DESKTOP,Hyprland

env = LIBVA_DRIVER_NAME,nvidia
env = GBM_BACKEND,nvidia-drm
env = __GLX_VENDOR_LIBRARY_NAME,nvidia
env = NVD_BACKEND,direct

I also get terrible fps in Minecraft and it doesn't help that the fps display just straight is not right (displays 60fps but feels like 10). Running Minecraft in native wayland with glfw-wayland helps, and the fps display is accurate, but I still don't get amazing performance I would expect compared to Windows. I can test other desktop environments however.

HOWEVER if I do any of the following, I get the issue that OP is experiencing on all games:

If I turn off explicit sync, everything works fine except recording (as shown in https://github.com/hyprwm/Hyprland/issues/7640).

Enabling tearing does seem to work but I haven't done any extensive testing on that side. I also don't really want to use tearing anyway since, well, it's tearing.

Specs (if they are of any use):

jaredmontoya commented 3 weeks ago

Until this is fixed the only way to play minecraft is using native wayland with https://modrinth.com/mod/wayfix. I can't play at resolutions less than native because of wayland auto scaling but it's better than whatever happens under xwayland on my optimus laptop.

sudoharun commented 2 weeks ago

Just installed hypr*-git (0.45.0 at commit a425fbebe4cf4238e48a42f724ef2208959d66cf) and here is stuff that has changed.

Stuff that's been fixed:

Issues (some of these I forgot to mention this in my first post):

I also want to add that personally running Minecraft in native wayland is just not viable since I get about 25% of the performance compared to xwayland (~120fps in wayland compared to ~480fps in xwayland, and ~65fps with shaders in xwayland compared to ~18fps in native wayland). And yes, I did check if the game is using my dGPU.

sr-tream commented 1 week ago

The same thing happens to me in Genshin Impact. And I am using an AMD card and hyprland on version v0.42.0.

I noticed two things that may help identify the problem:

1. Setting render:explicit_sync and explicit_sync_kms to 0 solved the problem for me (although it is not ideal).

2. The game allows me to hold ALT to move the mouse around the hud. While holding ALT, the problem does not occur. More specifically, the problem only occurs when the mouse is centered and invisible.

This work for me too.

Additional solutions, what I found:

  1. Launch games natively in Wayland
  2. Use xwayland-satellite

To run games natively on Wayland, I use:

wine reg add "HKEY_CURRENT_USER\Software\Wine\Drivers" /v Graphics /t REG_SZ /d "wayland" /f # For wine/proton games
SDL_VIDEODRIVER=wayland # For SDL2 games, like cs2

Also, not all XWayland games affected to this bug for me

sudoharun commented 1 week ago

Running games in native wayland, whether it's Minecraft or any game with Proton, I get much worse performance, up to a 50% performance loss (probably more, since some of those games have locked vsync).

Reishimanfr commented 1 week ago

The same thing happens to me in Genshin Impact. And I am using an AMD card and hyprland on version v0.42.0.

I noticed two things that may help identify the problem:

1. Setting render:explicit_sync and explicit_sync_kms to 0 solved the problem for me (although it is not ideal).

2. The game allows me to hold ALT to move the mouse around the hud. While holding ALT, the problem does not occur. More specifically, the problem only occurs when the mouse is centered and invisible.

I can confirm that disabling render:explicit_sync and explicit_sync_kms solved the issue with games flickering, but it made obs extremely jittery. I've also noticed a really big drop in GPU usage while playing minecraft with shaders enabled