Пользовательское разрешение дисплея Nvidia драйвер Pop!_OS 22.04 LTS

Вопрос или проблема

Я пытаюсь установить нестандартное разрешение для моего основного дисплея, которое монитор не рекламирует как доступное. В Windows я мог установить нестандартное разрешение в панели управления NVIDIA, а затем переключиться на него из командной строки с помощью qres.

Теперь, когда я использую Linux, я хочу создать нестандартный режим для моего дисплея и переключаться на него в любое время с помощью xrandr. Но все руководства, которые я нашел, не помогают мне, заканчивая ошибкой “BadMatch”.

ellitedev@twrreborn:~$ xrandr
Screen 0: minimum 8 x 8, current 3640 x 2580, maximum 32767 x 32767
DP-0 connected 1080x1920+0+660 left (normal left inverted right x axis y axis) 531mm x 298mm
   1920x1080     60.00*+ 144.00   119.98   119.88   100.00    99.93    74.99    59.94    50.00  
   1440x900     119.85  
   1280x1024    119.96    75.02    60.02  
   1280x960      99.78  
   1280x720      60.00    59.94    50.00  
   1024x768     119.99    75.03    60.00  
   800x600      119.97    99.66    75.00    60.32  
   720x576       50.00  
   720x480       59.94  
   640x480      119.52    75.00    59.94    59.93  
DP-1 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
DP-3 connected (normal left inverted right x axis y axis)
   1280x768      59.99 +
   1920x1080     60.00    59.94    50.00  
   1360x768      60.02  
   1360x765      60.00  
   1280x800      59.81  
   1280x720      60.00    59.94    50.00  
   1024x768      75.03    70.07    60.00  
   800x600       75.00    72.19    60.32    56.25  
   720x576       50.00  
   720x480       59.94  
   640x480       75.00    72.81    59.94    59.93  
HDMI-0 connected primary 2560x1080+1080+1080 (normal left inverted right x axis y axis) 798mm x 334mm
   2560x1080     59.98*+  74.99    50.00  
   3840x2160     29.97    25.00    23.98  
   2560x1440     59.95  
   1920x1080     75.00    60.00    59.94    50.00  
   1680x1050     59.95  
   1600x900      60.00  
   1280x1024     75.02    60.02  
   1280x800      59.81  
   1280x720      60.00    59.94    50.00  
   1152x864      60.00  
   1024x768      75.03    60.00  
   800x600       75.00    60.32  
   720x576       50.00  
   720x480       59.94  
   640x480       75.00    59.94    59.93  
DP-4 disconnected (normal left inverted right x axis y axis)
DP-5 connected 1920x1080+1400+0 (normal left inverted right x axis y axis) 531mm x 299mm
   1920x1080     60.00*+  59.94    50.00  
   1680x1050     59.95  
   1600x900      60.00  
   1440x900      59.89  
   1280x1024     75.02    60.02  
   1280x800      59.81  
   1280x720      60.00    59.94    50.00  
   1152x864      75.00  
   1024x768      75.03    70.07    60.00  
   800x600       75.00    72.19    60.32    56.25  
   720x576       50.00  
   720x480       59.94  
   640x480       75.00    72.81    59.94  
DVI-D-1-0 disconnected (normal left inverted right x axis y axis)
HDMI-1-0 disconnected (normal left inverted right x axis y axis)
DP-1-0 disconnected (normal left inverted right x axis y axis)
DP-1-1 disconnected (normal left inverted right x axis y axis)
ellitedev@twrreborn:~$ cvt 2400 1080 60
# 2400x1080 59.97 Hz (CVT) hsync: 67.16 kHz; pclk: 216.00 MHz
Modeline "2400x1080_60.00"  216.00  2400 2552 2808 3216  1080 1083 1093 1120 -hsync +vsync
ellitedev@twrreborn:~$ xrandr --newmode "2400x1080_60.00"  216.00  2400 2552 2808 3216  1080 1083 1093 1120 -hsync +vsync
ellitedev@twrreborn:~$ xrandr --addmode HDMI-0 "2400x1080_60.00"
X Error of failed request:  BadMatch (invalid parameter attributes)
  Major opcode of failed request:  140 (RANDR)
  Minor opcode of failed request:  18 (RRAddOutputMode)
  Serial number of failed request:  65
  Current serial number in output stream:  66

Я хочу убедиться, что все мои другие дисплеи останутся нетронутыми, когда я изменю этот один дисплей.

Я понимаю, что это может совпадать с другими постами, но я на пределе своих возможностей.

Я нашел решение!
Я получил основу того, что мне нужно знать, из поста на форуме и видео на YouTube.

В посте на форуме я нашел конкретную опцию, которую мне нужно добавить в мою конфигурацию xorg. Поскольку я использую Pop!_OS, я выяснил, что нужную мне можно найти в /usr/share/X11/xorg.conf.d/. Файл, который мне действительно нужно было изменить, был 10-nvidia.conf. Я предположил это потому, что в видео на YouTube я понял, что xorg загружает конфигурацию при загрузке в порядковом порядке названий файлов. И поскольку у меня были драйверы nvidia, я предположил, что это будет файл с названием nvidia.

Теперь строка, которую мне нужно было добавить, была:

Option "ModeValidation" "AllowNon60hzmodesDFPModes, NoEDIDDFPMaxSizeCheck, NoVertRefreshCheck, NoHorizSyncCheck, NoDFPNativeResolutionCheck, NoMaxSizeCheck, NoMaxPClkCheck,  AllowNonEdidModes, NoEdidMaxPClkCheck"

Теперь моя конфигурация выглядит так:

Section "OutputClass"
    Identifier "nvidia"
    MatchDriver "nvidia-drm"
    Driver "nvidia"
    Option "AllowEmptyInitialConfiguration"
    Option "ModeValidation" "AllowNon60hzmodesDFPModes, NoEDIDDFPMaxSizeCheck, NoVertRefreshCheck, NoHorizSyncCheck, NoDFPNativeResolutionCheck, NoMaxSizeCheck, NoMaxPClkCheck,  AllowNonEdidModes, NoEdidMaxPClkCheck"
    ModulePath "/usr/lib/x86_64-linux-gnu/nvidia/xorg"
EndSection

После сохранения этой конфигурации и перезагрузки я смог успешно добавить нестандартные режимы на свои дисплеи, используя

xrandr --newmode             "3840x2160ijk"  533.00  3840 3888 3920 4000  2160 2163 2168 2222 +hsync -vsync
xrandr --addmode DP-1        "3840x2160ijk"
xrandr --output  DP-1 --mode "3840x2160ijk"

Надеюсь, это поможет другим, кто находится в замешательстве.

Ответ или решение

Для того чтобы задать нестандартное разрешение дисплея в Pop!_OS 22.04 LTS с использованием драйверов Nvidia, требуется глубокое понимание как особенностей работы с графическим стеком Linux, так и специфики использования драйверов Nvidia. На Windows эта задача решается довольно просто с помощью Панели управления Nvidia и утилит обмена резолюциями, таких как QRes. Однако в Linux процесс более сложен, но, следуя ряду шагов, можно добиться успеха.

Теория: Почему это может не работать из коробки

Графическая система Linux использует протокол X11 совместно с утилитой xrandr для управления различными аспектами дисплеев, включая их разрешение. Когда вы создаете новое разрешение и добавляете его с помощью xrandr, это может завершиться ошибкой "BadMatch", означающей, что конфигурация не подходит для текущего подключения, вероятно, из-за ограничений проверок EDID (Extended Display Identification Data) драйверами Nvidia.

EDID — это метаданные, предоставляемые монитором, которые сообщают операционной системе о доступных разрешениях, частотах обновления и других возможностях. Nvidia драйверы строго следуют этим данным по умолчанию, чтобы избежать некорректных настроек.

Пример: Процесс добавления пользовательского разрешения

Ваша задача заключается в обходе ограничений EDID, чтобы установить нестандартное разрешение. В вашем случае вы изменяли файл конфигурации xorg.conf.d для указания драйверу игнорировать некоторые проверки. Это важное решение, поскольку изменения в этих настройках требуют понимания их воздействия.

Шаги, которые вы предприняли, включали генерацию пользовательского разрешения с помощью команды cvt, создание нового видеорежима через xrandr --newmode, а затем попытку добавить этот режим к определенному дисплею через xrandr --addmode. Необходимость изменения конфигурационного файла xorg возникла из-за строгих проверок Nvidia драйвера, и решением стало добавление специфической опции "ModeValidation".

Применение: Настройка конфигурации и переключение режимов

Вот как можно более детально описать настройку:

  1. Создание пользовательского режима:

    • Используйте команду cvt для генерации данных для нового разрешения. Например, cvt 2400 1080 60 создаст параметры для разрешения 2400×1080 на частоте 60 Гц.
  2. Настройка нового режима в xrandr:

    • Создайте новый видео режим:
      xrandr --newmode "2400x1080_60.00" 216.00 2400 2552 2808 3216 1080 1083 1093 1120 -hsync +vsync
  3. Добавление режима к устройству вывода:

    • Примените новый режим к специфическому выходу:
      xrandr --addmode HDMI-0 "2400x1080_60.00"

Но если вы получаете ошибку "BadMatch", это означает, что проверка EDID блокирует изменение. Тогда требуется модификация конфигурации X11.

  1. Изменение конфигурации X.org:

    • Вы можете редактировать файл /usr/share/X11/xorg.conf.d/10-nvidia.conf, добавив следующую строку в секцию "OutputClass":
      Option "ModeValidation" "AllowNon60hzmodesDFPModes, NoEDIDDFPMaxSizeCheck, NoVertRefreshCheck, NoHorizSyncCheck, NoDFPNativeResolutionCheck, NoMaxSizeCheck, NoMaxPClkCheck, AllowNonEdidModes, NoEdidMaxPClkCheck"
  2. Перезагрузка:

    • Перезагрузите систему для того, чтобы изменения вступили в силу и драйвер Nvidia учел новые условия конфигурации.

После того как конфигурация обновлена и система перезагружена, вы сможете устанавливать необходимые резолюции, которые изначально не поддерживаются, с помощью уже знакомых вам команд xrandr.

Итоги

Это решение подходит для пользователей, которые столкнулись с ограничениями стандартного набора разрешений их дисплеев. Применение пользовательских конфигураций в драйверах Nvidia позволяет расширять диапазон доступных резолюций, не теряя управление текущими настройками других дисплеев.

В итоге, вы получаете гибкость в выборе разрешений, что особенно актуально для специфических задач, как разработка, где требуется нестандартное отображение контента. Способность настройки системы по своим требованиям является одним из главных плюсов использования Linux, несмотря на начальные сложности конфигурирования.

Оцените материал
Добавить комментарий

Капча загружается...