You drag a window and it splits horizontally
You drag a terminal window across the desktop and it fractures. The top half shows your wallpaper. The bottom half shows the window contents. You just upgraded to a newer Fedora release, switched to Wayland, and the tearing is back. Or maybe you are on Xorg and your high refresh rate monitor is locked at sixty hertz. The compositor and the graphics card are out of sync. You can fix it by enabling variable refresh rate or locking a fixed refresh rate. The exact steps depend on your display server.
What is actually happening
Screen tearing is a timing mismatch between three components. Your monitor refreshes at a fixed interval. Your GPU renders frames as fast as the application demands. Your compositor or X server stitches the frames into a single buffer. When the monitor reads that buffer while the GPU is still writing to it, you get a split image. Older systems relied on vertical sync to wait for the monitor cycle. That introduced input lag and made window dragging feel sluggish. Modern systems use variable refresh rate. The monitor adjusts its refresh cycle to match the GPU output. The buffer swap happens exactly when the monitor is ready. The image stays whole.
Think of it like a conveyor belt in a factory. The monitor is the packing station. The GPU is the assembly line. If the packing station grabs a box while the assembly line is still attaching a label, the box ships incomplete. Variable refresh rate tells the packing station to pause until the label is attached. Fedora supports this on both Wayland and Xorg. The configuration paths differ because the display servers handle buffer management differently. Wayland compositors negotiate timing directly with the kernel DRM subsystem. Xorg relies on the X server and the driver to translate EDID data into mode settings.
The fix for Wayland
GNOME on Wayland includes variable refresh rate support behind an experimental feature flag. The flag has been stable for several releases. It remains opt-in to avoid hardware compatibility issues on older panels. You enable it by modifying the GNOME mutter settings. The command updates a GSettings key that mutter reads on startup.
Here is how to enable variable refresh rate for the current user.
gsettings get org.gnome.mutter experimental-features
# Check the current array. You will see a list of strings like ['scale-monitor-framebuffer'].
gsettings set org.gnome.mutter experimental-features "['scale-monitor-framebuffer', 'vrr']"
# Add 'vrr' to the array. Keep existing flags if your system uses them.
# The quotes and brackets are required. GSettings expects a strict D-Bus array format.
# Mutator reads this key on session start. Changes do not apply to a running compositor.
Log out and log back in. The compositor reloads with the new flag. You do not need to reboot. If you are using KDE Plasma, the setting lives in the display configuration GUI under Adaptive Sync. The CLI approach only applies to GNOME mutter. Trust the package manager. Manual file edits drift, snapshots stay.
The fix for Xorg
Xorg does not negotiate variable refresh rate automatically on all hardware. You often need to declare the monitor capabilities explicitly. The X server reads configuration snippets from /etc/X11/xorg.conf.d/. Files in that directory override defaults shipped by packages. Never edit files in /usr/lib/X11/. Those belong to the xorg-x11-drv-* packages and get overwritten on updates.
Here is how to force a specific refresh rate for a monitor.
xrandr --query
# List connected outputs. Look for the line marked 'connected'.
# Note the exact output name. It is usually DP-1, HDMI-1, or eDP-1.
sudo mkdir -p /etc/X11/xorg.conf.d
# Create the directory if it does not exist. Xorg ignores missing config paths.
sudo tee /etc/X11/xorg.conf.d/10-monitor.conf > /dev/null << 'EOF'
Section "Monitor"
Identifier "Monitor0"
Option "PreferredMode" "1920x1080"
Option "RefreshRate" "144"
EndSection
EOF
# Write the configuration file. The heredoc prevents shell variable expansion.
# 'PreferredMode' ensures Xorg picks the resolution before applying the refresh rate.
# Xorg applies this snippet during server initialization. A session restart is required.
Restart your Xorg session. The X server reads the new snippet during initialization. If you have multiple monitors, you must add a separate Section "Monitor" block for each one. Use the Option "Monitor" directive to bind the section to a specific output name. Run journalctl first. Read the actual error before guessing.
Kernel parameters and driver quirks
The kernel DRM subsystem must support atomic mode setting for variable refresh rate to work. AMD and Intel drivers enable this by default on modern Fedora releases. NVIDIA proprietary drivers require an explicit kernel parameter. Without it, the driver falls back to legacy mode setting. The compositor cannot negotiate refresh rates.
Here is how to add the required kernel parameter using the Fedora standard tool.
sudo grubby --update-kernel=ALL --args="nvidia-drm.modeset=1"
# Append the parameter to all installed kernels. Grubby handles GRUB config regeneration.
# This parameter forces the NVIDIA driver to use the kernel DRM mode setting interface.
# Atomic commits become available. The compositor can now request VRR or fixed rates.
Reboot the system. The parameter takes effect on the next boot. Verify it loaded by checking the kernel command line.
cat /proc/cmdline
# Look for 'nvidia-drm.modeset=1' in the output.
# If it is missing, the grubby command failed or was overwritten by a custom GRUB edit.
Reboot before you debug. Half the time the symptom is gone.
Verify it worked
Run the display query command for your active session. On Xorg, xrandr --query shows the active mode and refresh rate next to the connected output. Look for 1920x1080 (144.00 Hz) or similar. On Wayland, the compositor does not expose xrandr. Open Settings and check the Displays panel. The refresh rate dropdown should show your target value. If the value matches and the tearing stops, the configuration is active.
Check the system journal for compositor warnings if the setting did not apply.
journalctl -xeu gnome-shell.service
# Review recent mutter logs. Look for 'Failed to enable VRR' or 'DRM atomic commit failed'.
# The 'x' flag adds explanatory context. The 'e' flag jumps to the end of the log.
# Filter by unit to avoid scrolling through unrelated systemd noise.
Run journalctl first. Read the actual error before guessing.
Common pitfalls and what the error looks like
The gsettings command will fail silently if you miss the array syntax. You will see this exact error in the terminal.
Error: Expected end of input, but got "'"
The D-Bus interface requires exact bracket placement. Double check the quotes and commas. Fedora's GSettings schema validation is strict. It will not guess your intent.
Xorg will ignore malformed configuration files. If you mistype Section "Monitor" as Section "monitor", the X server prints warning lines during startup. The server falls back to default EDID values. You will not get a hard crash. The monitor simply stays at sixty hertz. Check /var/log/Xorg.0.log for (WW) or (EE) markers. The log tells you exactly which file was skipped.
Hardware limitations also cause silent failures. Some older displays advertise VRR in their EDID but lack the physical circuitry. The compositor enables the flag, the kernel accepts it, and the monitor ignores it. You will see no errors in the journal. The tearing persists. Test with a different cable or a different monitor to isolate the issue. HDMI 1.4 caps at 60Hz for many resolutions. Use DisplayPort or HDMI 2.0+ for high refresh rates. Cable bandwidth limits are a frequent culprit.
When to use this vs alternatives
Use Wayland VRR when you want automatic refresh rate synchronization without manual configuration. Use Xorg fixed refresh when your monitor does not support Adaptive Sync or when you need a stable frame rate for competitive gaming. Use xrandr --rate 144 when you need a temporary override for testing without writing permanent config files. Stay on the default compositor settings if your hardware already syncs correctly out of the box.