Я протестировал следующий патч для работы, хотя, как непрограммист, я не могу гарантировать, что он делает правильные вещи.Он вдохновлен тем, что git bisect
определено как плохой коммит, который является 05390ae36a0abb19f1d533ff95a3fceaafdf79c8 ( mirror )
Я вставляю патч ниже (но предположим, что вкладкистало пробелами, поэтому получите raw ):
this fixes the tearfree being disabled after waking up from a dpms suspend
patch for tag: xf86-video-ati-18.1.0
These are still appearing though:
[ 33.005] (WW) RADEON(0): flip queue failed: Device or resource busy
[ 33.005] (WW) RADEON(0): Page flip failed: Device or resource busy
but these are not:
[ 2691.018] (EE) RADEON(0): present flip failed
[ 2691.020] (WW) RADEON(0): flip queue failed in radeon_scanout_flip: Device or resource busy, TearFree inactive until next modeset
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 8445ef2a..8d530ed4 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -967,8 +967,8 @@ done:
if (drmmode_crtc->scanout[scanout_id].pixmap &&
fb != radeon_pixmap_get_fb(drmmode_crtc->
scanout[scanout_id].pixmap)) {
- radeon_drm_abort_entry(drmmode_crtc->scanout_update_pending);
- drmmode_crtc->scanout_update_pending = 0;
+ drmmode_crtc_wait_pending_event(drmmode_crtc, pRADEONEnt->fd,
+ drmmode_crtc->scanout_update_pending);
drmmode_crtc_scanout_free(drmmode_crtc);
} else if (!drmmode_crtc->tear_free) {
drmmode_crtc_scanout_destroy(drmmode,
@@ -3359,12 +3359,14 @@ Bool radeon_do_pageflip(ScrnInfoPtr scrn, ClientPtr client,
extents);
radeon_cs_flush_indirect(crtc->scrn);
- if (drmmode_crtc->scanout_update_pending) {
- radeon_drm_wait_pending_flip(crtc);
- handle_deferred = TRUE;
- radeon_drm_abort_entry(drmmode_crtc->scanout_update_pending);
- drmmode_crtc->scanout_update_pending = 0;
- }
+ if (drmmode_crtc->scanout_update_pending) {
+ radeon_drm_wait_pending_flip(crtc);
+ handle_deferred = TRUE;
+// radeon_drm_abort_entry(drmmode_crtc->scanout_update_pending);
+// drmmode_crtc->scanout_update_pending = 0;
+ }
+// drmmode_crtc_wait_pending_event(drmmode_crtc, pRADEONEnt->fd,
+// drmmode_crtc->scanout_update_pending);
} else {
drmmode_fb_reference(pRADEONEnt->fd, &flipdata->fb[i], fb);
}
Патч должен быть применен к тегу git xf86-video-ati-18.1.0
I 'я проверил это, чтобы работать (vsync остается включенным даже после приостановки dpms) для меня, используя test.sh
:
sleep 1
xset dpms force suspend #can replace "suspend" with "off" or "standby", it should have the same effect!
read -p "press Enter to continue"
sleep 5 #few seconds delay is needed before the log messages appear:
grep -i 'flip.*busy' -- "${HOME}/.local/share/xorg/Xorg.0.log"
Если вы видите present flip failed
и flip queue failed in radeon_scanout_flip: Device or resource busy, TearFree inactive until next modeset
, тогда tearfree отключен;примените вышеупомянутый патч (который я назвал 4reversed_05390ae36a0abb19f1d533ff95a3fceaafdf79c8.patch
), чтобы «исправить» его и перезапустить X (например, выйти из системы, затем startx
снова)
Иногда требуется два (или больше?) dpms, чтобы увидеть выше TearFree
линии, но вы всегда можете увидеть present flip failed
одну.
С патчем вы не увидите ни одной из двух вышеуказанных строк, но вы все равно увидите две другие: flip queue failed: Device or resource busy
и Page flip failed: Device or resource busy
иногда повторяется в 3 группах.
Я отслеживаю все будущие обновления на этом github gist