Как исправить ошибку «Перевернуть очередь в radeon_scanout_flip: устройство или ресурс заняты, TearFree неактивен до следующего режима»? - PullRequest
0 голосов
/ 05 октября 2018

В ArchLinux с обновленным пакетом xf86-video-ati с 1:18.0.1-2 до 1:18.1.0-1 у меня возникает разрыв экрана после того, как экран моего монитора возобновляет работу из режима ожидания (т.е. после xset dpms force suspend).Другими словами, мой ноутбук в конечном итоге (на 10 минут) отключает дисплей из-за простоя (нет активности клавиатуры / мыши), а затем, когда я прихожу и просыпаюсь, нажимая клавишу или перемещая мышь, с этого момента X действует какесли VSync (он же TearFree) выключен, хотя изначально он был включен после startx.

Следующие сообщения появляются на Xorg.0.log после того, как монитор просыпается от выключения программным обеспечением:

[   189.015] (WW) RADEON(0): flip queue failed: Device or resource busy
[   189.015] (WW) RADEON(0): Page flip failed: Device or resource busy
[   189.015] (EE) RADEON(0): present flip failed
[   189.030] (WW) RADEON(0): flip queue failed: Device or resource busy
[   189.030] (WW) RADEON(0): Page flip failed: Device or resource busy
[   189.030] (EE) RADEON(0): present flip failed
[   189.072] (WW) RADEON(0): flip queue failed: Device or resource busy
[   189.072] (WW) RADEON(0): Page flip failed: Device or resource busy
[   189.072] (EE) RADEON(0): present flip failed
[   189.086] (WW) RADEON(0): flip queue failed: Device or resource busy
[   189.086] (WW) RADEON(0): Page flip failed: Device or resource busy
[   189.086] (EE) RADEON(0): present flip failed
[ 189.096] (WW) RADEON(0): flip queue failed in radeon_scanout_flip: Device or resource busy, TearFree inactive until next modeset

Какой патч мне нужно применить поверх xf86-video-ati-18.1.0 gitтег (он же версия пакета Linux linux 1:18.1.0-1), чтобы мой VSync (TearFree) оставался включенным, как это было со старой (1:18.0.1-2) версией?

Стоит отметить, что со старой версией ()Я по-прежнему получаю похожих сообщений, но vsync по-прежнему будет включен:

[    38.004] (WW) RADEON(0): flip queue failed: Device or resource busy
[    38.004] (WW) RADEON(0): Page flip failed: Device or resource busy
[    38.005] (EE) RADEON(0): present flip failed
[    38.019] (WW) RADEON(0): flip queue failed: Device or resource busy
[    38.019] (WW) RADEON(0): Page flip failed: Device or resource busy
[ 38.019] (EE) RADEON(0): present flip failed

Примечание: я могу проверить, включен ли vsync, перемещая любое окно X с помощью мыши, и вижу гладкий-tearing.

1 Ответ

0 голосов
/ 05 октября 2018

Я протестировал следующий патч для работы, хотя, как непрограммист, я не могу гарантировать, что он делает правильные вещи.Он вдохновлен тем, что 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

...