Files
lenovo-gentoo/Fix-DisplayLink-Artifacts.md
Alexander Hinrichs 8de3f16ee6 chore: initialize gentoo-setup documentation repository
Add comprehensive documentation for Lenovo ThinkPad Gentoo Linux setup
including:
- Complete system configuration guides (power, Bluetooth, WiFi, audio)
- Hardware setup documentation (touchpad, touchscreen, DisplayLink)
- Management scripts with ZSH completions
- Kernel configuration (6.12.41-gentoo-x86_64)
- Lid automation and monitor management
- Battery conservation system
- User guides and troubleshooting

Repository includes .gitignore to exclude logs, temporary files, and
secrets.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 18:22:51 +01:00

207 lines
5.6 KiB
Markdown

# DisplayLink Artifact Fix
## Problem Description
When using the USB-C dock with two external DisplayLink monitors (Shenzhen KTC Q3212RUC, 2560x1440@60Hz), visual artifacts appeared in applications:
- Rendering glitches in foot terminal emulator
- Visual artifacts in Firefox browser
- High CPU usage by DisplayLinkManager (22.8%)
- Kernel warnings about buffer sharing between evdi and AMD GPU drivers
## Root Cause
DisplayLink uses the EVDI (Extensible Virtual Display Interface) kernel driver, which creates virtual displays and copies framebuffers from the main GPU. The artifacts were caused by:
1. **Compositor conflicts**: Hyprland settings incompatible with DisplayLink's rendering pipeline
2. **VRR (Variable Refresh Rate)**: DisplayLink doesn't support VRR, causing timing conflicts
3. **GPU-intensive effects**: Blur and complex animations increased frame copy overhead
4. **Direct scanout**: Hyprland's optimization bypassed DisplayLink's buffer management
5. **Monitor positioning bug**: Incorrect calculations in monitor setup script
## Solution Applied
### 1. Hyprland Configuration Optimizations
**File**: `/home/alexander/.config/hypr/hyprland.conf`
#### Changes Made:
**Disabled VRR globally:**
```
misc {
vrr = 0
vfr = true
mouse_move_enables_dpms = true
key_press_enables_dpms = true
}
```
- DisplayLink doesn't support variable refresh rate
- Enabled VFR (variable frame rate) for power savings instead
**Disabled GPU-intensive effects:**
```
decoration {
rounding = 8
blur {
enabled = false
size = 3
passes = 1
}
}
```
- Blur effects require extra GPU work and framebuffer copies
- Significantly reduces load on DisplayLink pipeline
**Disabled tearing mode:**
```
general {
allow_tearing = false
}
```
- Tearing causes visual artifacts on DisplayLink monitors
**Simplified animations:**
```
animations {
enabled = yes
# Faster, simpler animations
animation = windows, 1, 3, myBezier, popin 80%
animation = windowsOut, 1, 3, default, popin 80%
animation = border, 1, 5, default
animation = fade, 1, 4, default
animation = workspaces, 1, 4, default, slide
}
```
- Reduced animation duration and complexity
- Less framebuffer updates = smoother DisplayLink rendering
**Disabled direct scanout:**
```
render {
explicit_sync = 2
direct_scanout = false
}
```
- Direct scanout bypasses compositor, conflicts with DisplayLink buffer management
- Explicit sync ensures proper frame ordering
**Hardware cursors:**
```
cursor {
no_hardware_cursors = false
no_warps = false
}
```
- Hardware cursors work better than software cursors on this setup
- Software cursors caused severe stuttering and trails
**Optimized damage tracking:**
```
debug {
disable_logs = false
damage_tracking = 2
}
```
- Level 2 damage tracking balances performance and correctness
### 2. Monitor Setup Script Fix
**File**: `/home/alexander/.config/hypr/scripts/monitor-setup.sh`
**Bug Fixed** (line 77-82):
- **Before**: Used 1920px for monitor positioning (wrong resolution)
- **After**: Correctly uses 2560px per monitor
- **Before**: Loop bug prevented XPOS from incrementing
- **After**: Fixed loop to properly accumulate monitor positions
**Improved 3-monitor layout** (line 92):
- Laptop screen now positioned centered below external monitors
- Position: `1280x1440` (centered under two 2560px wide monitors)
### 3. Kernel Module Configuration
**File**: `/etc/modprobe.d/displaylink.conf`
```
# DisplayLink/EVDI kernel module optimization
options evdi initial_device_count=2
options evdi initial_loglevel=3
```
**Why this helps:**
- Pre-allocates 2 evdi devices at module load (reduces initialization overhead)
- Reduces kernel log verbosity (minor performance improvement)
**To apply**: Module parameters take effect after reboot or manual reload:
```bash
modprobe -r evdi
modprobe evdi initial_device_count=2 initial_loglevel=3
```
## How to Verify It's Working
### Check for artifacts:
1. Open foot terminal on external monitor
2. Scroll through text rapidly
3. Open Firefox and browse websites
4. No visual glitches or tearing should appear
### Check DisplayLinkManager CPU usage:
```bash
ps aux | grep DisplayLinkManager
```
Should show lower CPU usage (ideally < 10% when idle)
### Check kernel messages:
```bash
dmesg | grep evdi | tail -20
```
Should not show repeated warnings or errors
### Monitor configuration:
```bash
hyprctl monitors
```
Should show:
- `eDP-1`: 2880x1800@120Hz (laptop)
- `DVI-I-1`: 2560x1440@60Hz (external left)
- `DVI-I-2`: 2560x1440@60Hz (external right)
## Trade-offs
**What we gave up:**
- VRR on laptop display (not critical for development work)
- Blur effects (aesthetic preference)
- Slightly faster animations
**What we gained:**
- Stable, artifact-free external displays
- Lower GPU load and better performance
- Lower DisplayLinkManager CPU usage
- More reliable dock connection/disconnection
## Future Improvements
If artifacts return or performance degrades:
1. **Try different rendering backend:**
- Set `WLR_RENDERER=vulkan` or `WLR_RENDERER=gles2` in environment
2. **Adjust refresh rate:**
- Try 50Hz or 75Hz instead of 60Hz
- Some USB-C docks work better at non-standard rates
3. **Update DisplayLink driver:**
- Check for newer evdi kernel module versions
- Monitor DisplayLink driver releases
4. **Consider alternative:**
- USB-C docks with native DP-Alt mode (no DisplayLink) perform better
- But lose flexibility of DisplayLink's multi-monitor support
## References
- Hyprland Wiki: https://wiki.hyprland.org/
- DisplayLink Driver: https://github.com/DisplayLink/evdi
- Monitor configuration was based on: `Monitor-Dock-via-DisplayLink.md`