(Есть решение) Артефакты xfce4-terminal

Модератор: Модераторы разделов

Aliech
Сообщения: 1004
Статус: дилетант широкого профиля
ОС: debian/gentoo/openbsd

Re: Артефакты xfce4-terminal

Сообщение Aliech »

ormorph писал(а):
21.09.2024 18:49
А пардон, я переписал было на:
Ну вы вспомнили!

Кажется последний раз, когда полноценное ускорение 2D было, это EXA в AMD Northern Islands, а это 2010 год! Ну и да, в то же время SNA у intel.
С уважением,
Павел Алиев
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2861
ОС: Gentoo

Re: Артефакты xfce4-terminal

Сообщение ormorph »

Aliech писал:
21.09.2024 18:54
Ну и да, в то же время SNA у intel.
Ну так как раз оно...
Добавлено (19:11):
Ну и вспомнил на Intel при glamoor, как раз и были атрефакты в Tilda, только на много круче, там было целая куча всяких точек.
Спасибо сказали:
Аватара пользователя
Лия
Сообщения: 54
ОС: Debian stable + KDE

Re: Артефакты xfce4-terminal

Сообщение Лия »

Теперь понятно, почему на GTK 4 этой проблемы нет :)
Там не используется cairo_surface_create_similar, которая и использует XCreatePixmap из Xlib, который имеет проблемы с glamor
Вместо неё используется похожая cairo_surface_create_similar_image, которая не использует Xlib
Добавлено (20:30):
Репортнула: https://gitlab.gnome.org/GNOME/vte/-/issues/2821
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2861
ОС: Gentoo

Re: Артефакты xfce4-terminal

Сообщение ormorph »

Лия писала:
21.09.2024 20:14
Теперь понятно, почему на GTK 4 этой проблемы нет
Там не используется cairo_surface_create_similar, которая и использует XCreatePixmap из Xlib, который имеет проблемы с glamor
Не совсем понятно где не используется. Посмотрел:
gtk3:
Spoiler

Shell

$ grep -R cairo_surface_create_similar .
./gdk/gdkcairo.c: surface = cairo_surface_create_similar_image (cairo_get_target (cr),
./gdk/gdkgl.c: image = cairo_surface_create_similar_image (cairo_get_target (cr),
./gdk/gdkwindow.c: surface = cairo_surface_create_similar (window_surface,
./gdk/gdkwindow.c: * Note that unlike cairo_surface_create_similar_image(), the new
./gdk/gdkwindow.c: cairo_surface_create_similar_image (window_surface,
./gdk/x11/gdkwindow-x11.c: * cairo_surface_create_similar(). In some cases however, we must use a
./gtk/deprecated/gtknumerableicon.c: surface = cairo_surface_create_similar (image, CAIRO_CONTENT_COLOR_ALPHA,
./gtk/gtkcssimage.c: result = cairo_surface_create_similar (target,
./gtk/gtkcssimagesurface.c: surface->cache = cairo_surface_create_similar_image (surface->surface,
./gtk/gtkcssshadowvalue.c: surface = cairo_surface_create_similar_image (cairo_get_target (cr),
./gtk/gtkcssshadowvalue.c: surface = cairo_surface_create_similar_image (cairo_get_target (existing_cr),
./gtk/gtkcssshadowvalue.c: mask = cairo_surface_create_similar_image (cairo_get_target (cr), CAIRO_FORMAT_A8,
./gtk/gtkrenderbackground.c: surface = cairo_surface_create_similar (cairo_get_target (cr),
./tests/animated-resizing.c: source_surface = cairo_surface_create_similar (target, CAIRO_CONTENT_COLOR_ALPHA,
./tests/testcairo.c: overlay = cairo_surface_create_similar (cairo_get_target (cr),
./tests/testcairo.c: punch = cairo_surface_create_similar (cairo_get_target (cr),
./tests/testcairo.c: circles = cairo_surface_create_similar (cairo_get_target (cr),
gtk4:
Spoiler

Shell

$ grep -R cairo_surface_create_similar .
./demos/gtk-demo/drawingarea.c: overlay = cairo_surface_create_similar (cairo_get_target (cr),
./demos/gtk-demo/drawingarea.c: punch = cairo_surface_create_similar (cairo_get_target (cr),
./demos/gtk-demo/drawingarea.c: circles = cairo_surface_create_similar (cairo_get_target (cr),
./gdk/gdkcairo.c: surface = cairo_surface_create_similar_image (cairo_get_target (cr),
./gdk/gdkgl.c: image = cairo_surface_create_similar_image (cairo_get_target (cr),
./gdk/x11/gdksurface-x11.c: * cairo_surface_create_similar(). In some cases however, we must use a
./gsk/gskcairoblur.c: surface = cairo_surface_create_similar_image (cairo_get_target (cr),
./gsk/gskrendernodeimpl.c: mask = cairo_surface_create_similar_image (cairo_get_target (cr), CAIRO_FORMAT_A8,
./gsk/gskrendernodeimpl.c: surface = cairo_surface_create_similar_image (cairo_get_target (cr),
./gsk/gskrendernodeparser.c: return cairo_surface_create_similar (closure, content, width, height);
./gtk/gtkcssimage.c: result = cairo_surface_create_similar (target,
./tests/animated-resizing.c: source_surface = cairo_surface_create_similar (target, CAIRO_CONTENT_COLOR_ALPHA,
Почему после закомментирования всё заработало понятно, так как теперь стала выполняться cairo_surface_create_similar_image, но в vte она не прописана. Ну и в gtk4 нельзя напрямую использовать cairo для surface, только через функции gtk4.
Для gtk3 использование переменной GDK_RENDERING=image, используется функция cairo_image_surface_create, при GDK_RENDERING=recording функция cairo_recording_surface_create, при GDK_RENDERING=similar - функция cairo_surface_create_similar, она же по дефолту.
Другими словами тут дело не столько в libvte сколько в gtk3, так как libvte использует стандартный вызов из gtk3.
В libvte смотреть src/app/app.cc, для gtk3 смотреть вызов gdk_cairo_surface_create_from_pixbuf.
Спасибо сказали:
Аватара пользователя
Лия
Сообщения: 54
ОС: Debian stable + KDE

Re: Артефакты xfce4-terminal

Сообщение Лия »

ormorph писал(а):
21.09.2024 23:20
Не совсем понятно где не используется
Используется в ./gdk/gdkwindow.c (которого нет в gtk4)
ormorph писал(а):
21.09.2024 23:20
В libvte смотреть src/app/app.cc, для gtk3 смотреть вызов gdk_cairo_surface_create_from_pixbuf.

Код: Выделить всё

static void
vteapp_terminal_realize(GtkWidget* widget)
{
        GTK_WIDGET_CLASS(vteapp_terminal_parent_class)->realize(widget);

        if (!options.background_pixbuf)
                return;

        auto terminal = VTEAPP_TERMINAL(widget);

#if VTE_GTK == 3
        auto surface = vte::take_freeable
                (gdk_cairo_surface_create_from_pixbuf(options.background_pixbuf,
                                                      0 /* take scale from window */,
                                                      gtk_widget_get_window(widget)));
Этот код выполняется только при установленном фоновом изображении (background_pixbuf) (по умолчанию его нет)
Добавлено (05:25):
Учитывая, что при отключении glamor всё нормально, надо смотреть его код и реализацию CreatePixmap :)
Добавлено (05:30):
https://gitlab.freedesktop.org/xorg/xserver/-/blob/master/glamor/glamor.c#L201
https://gitlab.freedesktop.org/xorg/xserver/-/blob/master/glamor/glamor_egl.c#L1082

https://gitlab.freedesktop.org/xorg/xserver/-/blob/master/glamor/glamor_glx_provider.c#L385
Включить здесь GL_KHR_debug и EGL_KHR_debug?
Добавлено (05:46):
Ещё можно попробовать покрутить RenderingAPI: https://gitlab.freedesktop.org/xorg/xserver/-/blob/master/hw/xfree86/man/xorg.conf.man#L2100
This option specifies an rendering API for use in conjunction with Glamor
accel method. You can specify OpenGL with a value "gl" and OpenGL ES with a
value "es", and the default is both, when Glamor fallbacks to GLES if GL 2.1 is
not available. This may be useful for embedded and old cards, where GL ES
feature set works faster than GL feature set.
Default: gl.
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2861
ОС: Gentoo

Re: Артефакты xfce4-terminal

Сообщение ormorph »

Попробовал использовать cairo_surface_create_similar_image в gtk3 вместо cairo_surface_create_similar, добавил такой патч:
Spoiler

Код: Выделить всё

--- a/gdk/gdkwindow.c   2024-09-22 06:00:58.675945141 +0300
+++ b/gdk/gdkwindow.c   2024-09-22 06:10:12.134921994 +0300
@@ -10184,8 +10184,9 @@
       break;
     case GDK_RENDERING_MODE_SIMILAR:
     default:
-      surface = cairo_surface_create_similar (window_surface,
-                                              content,
+      surface = cairo_surface_create_similar_image (window_surface,
+                                              content == CAIRO_CONTENT_COLOR ? CAIRO_FORMAT_RGB24 :
+                                              content == CAIRO_CONTENT_ALPHA ? CAIRO_FORMAT_A8 : CAIRO_FORMAT_ARGB32,
                                               width, height);
       break;
   }
Вот что получилось.
С патчем:
Изображение
Без патча:
Изображение
В остальном не знаю что быстрее. Как временное решение должно работать, это хорошо для Gentoo или Arch, так как можно быстро пересобрать. Но скорее всего нужно разбираться с libX11 или даже драйвером. Но тут уже сами, я не использую этот драйвер.
Спасибо сказали:
Аватара пользователя
Лия
Сообщения: 54
ОС: Debian stable + KDE

Re: Артефакты xfce4-terminal

Сообщение Лия »

ormorph писал(а):
22.09.2024 07:16
Как временное решение должно работать
Да, помогает :)
Добавлено (08:57):
ormorph писал(а):
22.09.2024 07:16
Но скорее всего нужно разбираться с libX11 или даже драйвером
Ага
В NVIDIA есть тройная буферизация, есть ли что-нибудь похожее в amdgpu?
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2861
ОС: Gentoo

Re: Артефакты xfce4-terminal

Сообщение ormorph »

Но лучше патч gtk3 привести к такому виду:
Spoiler

Код: Выделить всё

--- a/gdk/gdkwindow.c   2024-09-22 08:49:35.688978557 +0300
+++ b/gdk/gdkwindow.c   2024-09-22 08:51:23.621974043 +0300
@@ -10183,11 +10183,16 @@
       cairo_surface_set_device_scale (surface, sx, sy);
       break;
     case GDK_RENDERING_MODE_SIMILAR:
-    default:
       surface = cairo_surface_create_similar (window_surface,
                                               content,
                                               width, height);
       break;
+    default:
+      surface = cairo_surface_create_similar_image (window_surface,
+                                              content == CAIRO_CONTENT_COLOR ? CAIRO_FORMAT_RGB24 :
+                                              content == CAIRO_CONTENT_ALPHA ? CAIRO_FORMAT_A8 : CAIRO_FORMAT_ARGB32,
+                                              width, height);
+      break;
   }

   cairo_surface_destroy (window_surface);
Тогда если переменная GDK_RENDERING не задана, то будет выполняться cairo_surface_create_similar_image, по дефолту. Если задать GDK_RENDERING=similar, то артефакты можно будет вернуть. По крайней мере это будет удобнее для дальнейшего тестирования.
Добавлено (09:04):
Лия писала:
22.09.2024 08:53
В NVIDIA есть тройная буферизация, есть ли что-нибудь похожее в amdgpu?
Тут не знаю, тут я не специалист, в смысле и не лез туда :rolleyes:. Специалистом делает время и опыт.
Спасибо сказали:
Аватара пользователя
Лия
Сообщения: 54
ОС: Debian stable + KDE

Re: Артефакты xfce4-terminal

Сообщение Лия »

Ещё у меня в BIOS отключено Integrated Graphics - потому что встроенная AMD и внешняя AMD видеокарты начинали конфликтовать друг с другом :)
Если включить - картинка по-прежнему выдаётся через внешнюю видеокарту, но ускорение 2D происходит на встроенной - и артефактов нет :)
Интересно...
Может что тут покрутить https://docs.kernel.org/gpu/amdgpu/module-parameters.html...
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2861
ОС: Gentoo

Re: Артефакты xfce4-terminal

Сообщение ormorph »

Лия писала:
22.09.2024 09:49
Может что тут покрутить https://docs.kernel.org/gpu/amdgpu/module-parameters.html...
Можете попробовать. Но доступные параметры желательно смотреть командой:

Shell

$ modinfo amdgpu
$ modinfo <путь>/amdgpu.ko
В информации по модулю отображена информация о доступных параметрах.
Спасибо сказали:
Аватара пользователя
Лия
Сообщения: 54
ОС: Debian stable + KDE

Re: Артефакты xfce4-terminal

Сообщение Лия »

Удалось добиться того, чего хотелось - заставить glamor использовать "что-нибудь другое", чтобы понять, в нём ли проблема

Код: Выделить всё

MESA_LOADER_DRIVER_OVERRIDE=zink
в /etc/environment и перезагрузиться
Заработало :) И артефактов нет.

Код: Выделить всё

[2024-09-22 08:12:40] (II) AMDGPU(0): glamor X acceleration enabled on zink Vulkan 1.3(AMD Radeon RX 7600 (RADV NAVI33) (MESA_RADV))
Но разница в производительности, конечно, огромная.
Получается, вернулись к тому, откуда начали - к mesa (точнее, к radeonsi) :)
Последний раз редактировалось Лия 22.09.2024 15:16, всего редактировалось 1 раз.
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2861
ОС: Gentoo

Re: Артефакты xfce4-terminal

Сообщение ormorph »

Лия писала:
22.09.2024 11:28
Получается, вернулись к тому, откуда начали - к mesa
Хорошо что получилось. Но в документации этот драйвер для использования для отдельных приложений. Но похоже благодаря строчке MESA_LOADER_DRIVER_OVERRIDE=zink, вам удалось заставить mesa работать через vulkan-amdgpu-pro, если объявлена переменная VK_DRIVER_FILES, без неё не получилось бы.
Лия писала:
22.09.2024 11:28
Но разница в производительности, конечно, огромная:
Как бы для вашей видеокарты совсем мало на свободных. А если для сравнения запустить с опцией:

Shell

$ vblank_mode=0 glxgears
Может на свободных дровах больше fps покажет.
Добавлено (12:58):
Упс, пересмотрел вывод эта опция уже включена. Получается маленькая производительность при использовании MESA_LOADER_DRIVER_OVERRIDE=zink?
Спасибо сказали:
Аватара пользователя
Лия
Сообщения: 54
ОС: Debian stable + KDE

Re: Артефакты xfce4-terminal

Сообщение Лия »

ormorph писал(а):
22.09.2024 12:55
если объявлена переменная VK_DRIVER_FILES, без неё не получилось бы
Если удалить amdvlk и AMDGPU Pro - работает и без неё :)
ormorph писал(а):
22.09.2024 12:55
Получается маленькая производительность при использовании MESA_LOADER_DRIVER_OVERRIDE=zink?

Код: Выделить всё

$ vblank_mode=0 glxgears
ATTENTION: default value of option vblank_mode overridden by environment.
137695 frames in 5.0 seconds = 27538.811 FPS

$ vblank_mode=0 MESA_LOADER_DRIVER_OVERRIDE=zink glxgears
ATTENTION: default value of option vblank_mode overridden by environment.
49128 frames in 5.0 seconds = 9825.432 FPS
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2861
ОС: Gentoo

Re: Артефакты xfce4-terminal

Сообщение ormorph »

Я могу предположить, что маленькая производительность связана с преобразованием в mesa Vulkan в OpneGL. Просто опция MESA_LOADER_DRIVER_OVERRIDE=zink заставляет работать только с устройствами vulkan, при этом opengl доступен, но через API Vulkan.
Т.е. то что на Vulkan должно работать быстрее.
Спасибо сказали:
Аватара пользователя
Лия
Сообщения: 54
ОС: Debian stable + KDE

Re: Артефакты xfce4-terminal

Сообщение Лия »

ormorph писал(а):
22.09.2024 13:17
Т.е. то что на Vulkan должно работать быстрее.

Код: Выделить всё

$ mangohud vkcube --present_mode 0
Изображение
Добавлено (13:36):
Ладно, буду ковырять radeonsi :)
Добавлено (14:31):
Кажется, нашла!

Код: Выделить всё

AMD_DEBUG=nodcc
в /etc/environment и перезагрузиться

Отключает DCC (Delta Color Compression)
https://gpuopen.com/learn/dcc-overview/

Артефакты полностью исчезают :)
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2861
ОС: Gentoo

Re: Артефакты xfce4-terminal

Сообщение ormorph »

Лия писала:
22.09.2024 13:18
AMD_DEBUG=nodcc
Ну так вроде как DCC в mesa был поломан. Они исправили его вроде как для драйвера vulkan - radv, это который у вас автоматически запускался с параметром MESA_LOADER_DRIVER_OVERRIDE=zink. Видно в radeonsi так и не исправили это. Это судя по новостям. А так на эту тему можно задать вопрос разработчикам mesa.
Спасибо сказали:
Aliech
Сообщения: 1004
Статус: дилетант широкого профиля
ОС: debian/gentoo/openbsd

Re: Артефакты xfce4-terminal

Сообщение Aliech »

Лия, мои поздравления с решением проблемы. Возможно хорошей идеей является об найденном решении сообщить в тикет сообщества gnome, куда вы оставляли багрепорт ранее.
С уважением,
Павел Алиев
Спасибо сказали:
Аватара пользователя
Лия
Сообщения: 54
ОС: Debian stable + KDE

Re: Артефакты xfce4-terminal

Сообщение Лия »

ormorph писал(а):
22.09.2024 16:26
А так на эту тему можно задать вопрос разработчикам mesa.
Готово: https://gitlab.freedesktop.org/mesa/mesa/-/issues/11927
Aliech писал:
22.09.2024 16:42
Возможно хорошей идеей является об найденном решении сообщить в тикет сообщества gnome, куда вы оставляли багрепорт ранее.
Написала :)
Спасибо сказали: