Bug 38841

Summary: Неверный возврат размера экрана дисплея в parse-edid
Product: Sisyphus Reporter: Speccyfighter <zxwarior>
Component: read-edidAssignee: Vladislav Zavjalov <slazav>
Status: NEW --- QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: asy, slazav, stranger573
Version: unstable   
Hardware: all   
OS: Linux   
Attachments:
Description Flags
Точный реальный dpi
none
dpi на одну единицу в одном измерении меньше none

Description Speccyfighter 2020-08-24 20:28:36 MSK
Исполняемый файл parse-edid неверно возвращает размер экрана:

# parse-edid < /sys/devices/pci0000\:00/0000\:00\:02.0/drm/card0/card0-eDP-1/edid | grep DisplaySize
Checksum Correct

	DisplaySize 340 190

# rpm -qf /usr/bin/parse-edid 
read-edid-3.0.2-alt2.x86_64


Причина:
Нарушение спецификации VESA E-EDID 1R4 в коде parse-edid.
Байты 15h 16h пятибайтной секции Basic Display Parameters & Features, переведены из сантиметров в миллиметры, что недопустимо ни при каких условиях.


Подробно с цитированием пунктов 3.6.2 и 3.10 спецификации VESA E-EDID Version 1 Revision 4:
https://forum.altlinux.org/index.php?topic=13216.msg351156#msg351156

Побайтный разбор байтов 12 13 14 первого дескриптора EDID в decimal:
https://forum.altlinux.org/index.php?topic=13216.msg351162#msg351162

Побайтный разбор байтов 12 13 14 первого дескриптора EDID в hex:
https://forum.altlinux.org/index.php?topic=13216.msg351168#msg351168


Для возврата размера экрана, должны использоваться только байты 12 и 13 первого дескриптора и два полубайта байта 14 первого дескриптора. Здесь порядок байтов дан в decimal.


Скрипт, который верно возвращает размер экрана дисплея в миллиметрах, пересчётом  байтов 12, 13 и 14 первого дескриптора:
https://forum.altlinux.org/index.php?topic=13216.msg351176#msg351176


Пакет:

# rpm -qf /usr/bin/edid-decode 
edid-decode-20170207-alt1.1.x86_64

с исполняемым файлом edid-decode, который возвращает edid в hex по секциям и верно возвращает размер экрана дисплея:

# edid-decode < /sys/devices/pci0000\:00/0000\:00\:02.0/drm/card0/card0-eDP-1/edid | grep 'Maximum image size'
Maximum image size: 34 cm x 19 cm

См. раздел 3.6.2 спецификации VESA E-EDID Release 1, Revision 4
Comment 1 Speccyfighter 2020-08-24 20:41:56 MSK
Спецификация VESA E-EDID Version 1 Revision 4 (1.8 Mb):
https://glenwing.github.io/docs/VESA-EEDID-A2.pdf

# edid-decode < /sys/devices/pci0000\:00/0000\:00\:02.0/drm/card0/card0-eDP-1/edid | grep 'Manufacturer:\|EDID version\|ASCII'
Manufacturer: LGD Model 468 Serial Number 0
EDID version: 1.4
ASCII string: LG Display
ASCII string: LP156WHB-TPC1


Спецификация дисплея LP156WHB-TPC1 ноутбука Lenovo G50-80 (pdf, 5.3 Mb):
http://www.datasheet-pdf.com/PDF/LP156WHB-TPC1-Datasheet-LG-929726
Comment 2 Vladislav Zavjalov 2020-08-26 07:15:25 MSK
Правильно ли я понимаю проблему:

По стандарту VESA E-EDID в разделе "Basic Display Parameters and Features" указан примерный размер экрана (округленный до сантиметров). Для того, чтобы устанавливать подходящий размер шрифта, картинок и т.п.

В разделах "Detailed Timing Descriptor" указаны более точные размеры изображения для конкретных видеорежимов. Из них первый, "Preferred Timing Mode" всегда должен присутствовать и показывать оптимальный режим для данного монитора.

parse-edid выдает секцию "Monitor" для xorg.conf с DisplaySize, выставленным по первому (неточному) размеру. DisplaySize в xserver нужен для выставления DPI, то есть, тоже для получения правильного размера шрифтов, картинок и т.п. То есть, формально все сделано правильно, особенно, учитывая, что это делалось во времена CRT-мониторов с разными режимами. Вы предлагаете выдавать более точный размер, из "Preferred Timing Mode", что будет точнее для LCD-мониторов с одним режимом.

Мне не очень понятно, какие проблемы может вызвать неточное выставление DisplaySize (и, соответственно DPI). Вроде, вся графика привязана к точкам экрана, DPI применяется только для оценки размера дефолтного шрифта, чтоб не было слишком мелко/крупно, и тому подобных вещей.
Собственно, вопрос, в чем именно заключается наблюдаемая проблема? Решается ли она установкой правильного DisplaySize в xorg.conf или DPI через xrandr?
Comment 3 Sergey Y. Afonin 2020-08-26 08:26:55 MSK
(In reply to Vladislav Zavjalov from comment #2)

> Собственно, вопрос, в чем именно заключается наблюдаемая проблема?

Speccyfighter завёл ещё один баг на эту же тему, про xorg: bug 38777, там уже описано, к чему предположительно это у него приводит.

> Решается ли она установкой правильного DisplaySize в xorg.conf или DPI через xrandr?

Вероятно тут кроется другая проблема - xorg, похоже, перестал на DisplaySize реагировать.
Comment 4 Speccyfighter 2020-08-27 02:56:07 MSK
(Ответ для Vladislav Zavjalov на комментарий #2)
> Правильно ли я понимаю проблему:
> 
> По стандарту VESA E-EDID в разделе "Basic Display Parameters and Features"
> указан примерный размер экрана (округленный до сантиметров). Для того, чтобы
> устанавливать подходящий размер шрифта, картинок и т.п.
> 
> В разделах "Detailed Timing Descriptor" указаны более точные размеры
> изображения для конкретных видеорежимов. Из них первый, "Preferred Timing
> Mode" всегда должен присутствовать и показывать оптимальный режим для
> данного монитора.
> 
> parse-edid выдает секцию "Monitor" для xorg.conf с DisplaySize, выставленным
> по первому (неточному) размеру. DisplaySize в xserver нужен для выставления
> DPI, то есть, тоже для получения правильного размера шрифтов, картинок и
> т.п. То есть, формально все сделано правильно, особенно, учитывая, что это
> делалось во времена CRT-мониторов с разными режимами. Вы предлагаете
> выдавать более точный размер, из "Preferred Timing Mode", что будет точнее
> для LCD-мониторов с одним режимом.
> 

Предлагаю привести вывод DisplaySize в соответствие со спецификацией по байтам 15h 16h, т.е. в сантиметрах. Либо делать вывод в миллиметрах по байтам 42h 43h 44h первого дескриптора, с отображением точного размера дисплея.

Некоторые размышления по поводу термина DisplaySize в парсинге edid:
Термин DisplaySize в контексте экрана, некорректен.
Поскольку сам DisplaySize, скорее воспринимается как Outline Dimension (определение спецификации на LP156WHB-TPC1), т.е. габаритный размер дисплея, а не как ScreenSize, который в той же спецификации на LP156WHB-TPC1 определён как Active Display Area, т.е. активная область дисплея (экран, screen).
Поскольку экран как активная область, лишь часть дисплея, габариты которого скрыты от пользователя корпусом монитора. Это скорее ScreenSize как размер экрана, а не DisplaySize как устройство отображения целиком.


> Мне не очень понятно, какие проблемы может вызвать неточное выставление
> DisplaySize (и, соответственно DPI). Вроде, вся графика привязана к точкам
> экрана, DPI применяется только для оценки размера дефолтного шрифта, чтоб не
> было слишком мелко/крупно, и тому подобных вещей.
> Собственно, вопрос, в чем именно заключается наблюдаемая проблема? Решается
> ли она установкой правильного DisplaySize в xorg.conf или DPI через xrandr?

Не решается установкой DisplaySize в 10-monitor.conf:

$ cat /etc/X11/xorg.conf.d/10-monitor.conf 
# Generated by xsetup

Section "Monitor"
    Identifier "Monitor0"
    DisplaySize 344 194
EndSection

Section "Device"
    Identifier "Card0"
    Option "SwapbuffersWait" "false"
    Driver "intel"
EndSection

Неверный размер экрана, неверный dpi:

$ sed -n '145,146p' /var/log/Xorg.0.log
[    40.477] (II) intel(0): switch to mode 1366x768@60.0 on eDP1 using pipe 0, position (0, 0), rotation normal, reflection none
[    40.478] (II) intel(0): Setting screen physical size to 340 x 190

$ xdpyinfo | grep -B2 resol
screen #0:
  dimensions:    1366x768 pixels (340x190 millimeters)
  resolution:    102x103 dots per inch


Решается установкой через xrandr:

$ xrandr --dpi 100.79365079365079365079

$ xdpyinfo | grep -B2 resol
screen #0:
  dimensions:    1366x768 pixels (344x193 millimeters)
  resolution:    101x101 dots per inch

Истинный точный dpi для дисплея LP156WHB-TPC1:

$ echo -e '2.54*10*1366/(1366*0.252)\n2.54*10*768/(768*0.252)' | bc -l
100.79365079365079365079
100.79365079365079365079

Истинный точный размер экрана дисплея LP156WHB-TPC1:

$ echo -e '1366*0.252\n768*0.252' | bc -l
344.232
193.536
Comment 5 Speccyfighter 2020-08-27 19:37:57 MSK
(In reply to Speccyfighter from comment #4)
> (Ответ для Vladislav Zavjalov на комментарий #2)
> > Решается ли она установкой правильного DisplaySize в xorg.conf или DPI
> > через xrandr?
> 
> Не решается установкой DisplaySize в 10-monitor.conf:
> 
> $ cat /etc/X11/xorg.conf.d/10-monitor.conf 
> # Generated by xsetup
> 
> Section "Monitor"
>     Identifier "Monitor0"
>     DisplaySize 344 194
> EndSection
> 
> Section "Device"
>     Identifier "Card0"
>     Option "SwapbuffersWait" "false"
>     Driver "intel"
> EndSection
> 

В X-сах сломан синтаксис.
Решается, если в секции Monitor, индентификатор установлен как

Identifier "<default monitor>"

а не

Identifier "Monitor0"


$ cat /etc/X11/xorg.conf.d/10-monitor.conf
Section "Monitor"
    Identifier "<default monitor>"
    DisplaySize 344 194
EndSection

Section "Device"
    Identifier "Card0"
    Option "SwapbuffersWait" "false"
    Driver "intel"
EndSection

Тогда опция

DisplaySize 344 194

отрабатывает:
https://bugzilla.altlinux.org/show_bug.cgi?id=38777#c7

За подсказку
https://bugzilla.altlinux.org/show_bug.cgi?id=38777#c5
спасибо stranger573.
Comment 6 Sergey Y. Afonin 2020-08-27 20:04:10 MSK
(In reply to Speccyfighter from comment #5)

> В X-сах сломан синтаксис.
> Решается, если в секции Monitor, индентификатор установлен как
> 
> Identifier "<default monitor>"

Нет, именно тут синтаксис не сломан. Так как это не полный конфиг, а только фрагмент, Identifier не может быть произвольным, он должен быть таким, какой ждёт xorg. Или уж тогда надо описывать, начиная с Section "ServerLayout" и произвольными Identifier. Ну а что хочет xorg от фрагментов можно увидеть в логе (это у меня без monitor.conf):

[   338.866] (==) No Layout section.  Using the first Screen section.
[   338.866] (==) No screen section available. Using defaults.
[   338.866] (**) |-->Screen "Default Screen Section" (0)
[   338.866] (**) |   |-->Monitor "<default monitor>"
[   338.867] (==) No monitor specified for screen "Default Screen Section".
Comment 7 Speccyfighter 2020-08-28 00:54:18 MSK
(Ответ для Sergey Y. Afonin на комментарий #6)
> (In reply to Speccyfighter from comment #5)
> 
> > В X-сах сломан синтаксис.
> > Решается, если в секции Monitor, индентификатор установлен как
> > 
> > Identifier "<default monitor>"
> 
> Нет, именно тут синтаксис не сломан. Так как это не полный конфиг, а только
> фрагмент, Identifier не может быть произвольным, он должен быть таким, какой
> ждёт xorg. Или уж тогда надо описывать, начиная с Section "ServerLayout" и
> произвольными Identifier. Ну а что хочет xorg от фрагментов можно увидеть в
> логе (это у меня без monitor.conf):
> 
> [   338.866] (==) No Layout section.  Using the first Screen section.
> [   338.866] (==) No screen section available. Using defaults.
> [   338.866] (**) |-->Screen "Default Screen Section" (0)
> [   338.866] (**) |   |-->Monitor "<default monitor>"
> [   338.867] (==) No monitor specified for screen "Default Screen Section".

p8-sysv-xfce:

Он не случайный. Он 0 (ноль) или eDP1:

$ xrandr --listmonitors
Monitors: 1
 0: +eDP1 1366/340x768/190+0+0  eDP1

Альтераторной конфигурялкой с ручной правкой и прописыванием eDP1:

# grep -v '#' /etc/X11/xorg.conf.d/10-monitor.conf

Section "Monitor"
    Identifier "eDP1"
    DisplaySize 344 194
EndSection

Section "Device"
    Identifier "Card0"
    Driver "intel"
EndSection

Section "Screen"
    Identifier "Screen0"
    Device "Card0"
    Monitor "eDP1"
    SubSection "Display"
        Modes "1366x768"
    EndSubSection
EndSection


Может и ошибаюсь, но думается что в бинарнике Xorg, этот Monitor%d не случаен:

# strings /usr/bin/Xorg | grep '^Monitor%\|<default'
Monitor%d
<default monitor>

Монитор подхватывается, размер экрана устанавливается правильный с правильным dpi:

# sed -n '19,26p; 69,71p; 81,85p' /var/log/Xorg.0.log 
[  4998.170] (==) No Layout section.  Using the first Screen section.
[  4998.170] (**) |-->Screen "Screen0" (0)
[  4998.170] (**) |   |-->Monitor "eDP1"
[  4998.171] (**) |   |-->Device "Card0"
[  4998.171] (==) Automatically adding devices
[  4998.171] (==) Automatically enabling devices
[  4998.171] (==) Automatically adding GPU devices
[  4998.171] (==) Automatically binding GPU devices
[  4998.230] (II) intel(0): Output eDP1 using monitor section eDP1
[  4998.230] (**) intel(0): Found backlight control interface intel_backlight (type 'raw') for output eDP1
[  4998.230] (II) intel(0): Enabled output eDP1
[  4998.231] (--) intel(0): Output eDP1 using initial mode 1366x768 on pipe 0
[  4998.231] (==) intel(0): TearFree enabled
[  4998.231] (==) intel(0): Using gamma correction (1.0, 1.0, 1.0)
[  4998.231] (**) intel(0): Display dimensions: (344, 194) mm
[  4998.231] (**) intel(0): DPI set to (100, 100)

Но несмотря на это, xdpyinfo в p8 врёт безбожно, игнорируя всё что установил X-сервер:

# xdpyinfo | grep -B2 resolution
screen #0:
  dimensions:    1366x768 pixels (361x203 millimeters)
  resolution:    96x96 dots per inch

Наверное надо бы глянуть, как это всё будет выглядеть, если это же подсунуть в p9-xfce-sysv.
Comment 8 Speccyfighter 2020-08-28 02:46:49 MSK
Посмотрел и в системе на alt-p9-xfce-sysv-*-x86_64:

Правильное разрешение и правильный dpi будет установлено X-сервером:

$ sed -n '68,70p; 80,84p' /var/log/Xorg.0.log
[  1271.795] (II) intel(0): Output eDP1 using monitor section Monitor0
[  1271.795] (**) intel(0): Found backlight control interface intel_backlight (type 'raw') for output eDP1
[  1271.795] (II) intel(0): Enabled output eDP1
[  1271.796] (--) intel(0): Output eDP1 using initial mode 1366x768 on pipe 0
[  1271.796] (==) intel(0): TearFree enabled
[  1271.796] (==) intel(0): Using gamma correction (1.0, 1.0, 1.0)
[  1271.796] (**) intel(0): Display dimensions: (344, 194) mm
[  1271.796] (**) intel(0): DPI set to (100, 100)


если сгенерирован такой конфиг:

$ grep -v '#' /etc/X11/xorg.conf.d/10-monitor.conf

Section "Monitor"
    Identifier "Monitor0"
    DisplaySize 344 194
EndSection

Section "Device"
    Identifier "Card0"
    Driver "intel"
EndSection

Section "Screen"
    Identifier "Screen0"
    Device "Card0"
    Monitor "Monitor0"
    SubSection "Display"
        Modes "1366x768"
    EndSubSection
EndSection


Но xdpyinfo про размер экрана и dpi продолжит врать:

$ xdpyinfo | grep -B2 resol
screen #0:
  dimensions:    1366x768 pixels (361x203 millimeters)
  resolution:    96x96 dots per inch


Всё отработает, если есть секция "Screen" в таком виде. Конфигурированием через alterator-standalone x11, с явным указанием всех необходимых опций и параметров.

В alt-p9-xfce-sysv-*-{i586,x86_64}, через модуль альтератора x11, на ноутбуке Lenovo G50-80 с дисплеем LP156WHB-TPC1, сгенерировать секцию "Screen" невозможно. За отсутствием разрешения 1366x768 в списке доступных разрешений.
Этот конфиг выше, был сгенерирован в системе на alt-p8-sysv-xfce-*-i586 и был скопирован вручную в систему на alt-p9-xfce-sysv-*-x86_64.

Ошибка:
В модуле альтератора x11, в списке доступных разрешений, отсутствует разрешение 1366x768. Генерация секции "Screen" в 10-monitor.conf невозможна на дисплеях с максимальным разрешением 1366x768.

Обход ошибки:
Для генерации секции "Screen" через альтератор, выбрать любое доступное наиболее близкое разрешение. После генерации 10-monitor.conf, в секции "Screen" вручную сменить это разрешение на максимальное рекомендуемое для дисплея.

На DisplaySize parse-edid внимания не обращать: для LP156WHB-TPC1 он покажет неверный размер экрана в 340x190. Но этот точный размер экрана в миллиметрах нужен, для установки правильного размера экрана в модуле альтератора x11, для установки X-сервером правильного размера экрана и правильного dpi. Правильный размер экрана с точностью до миллиметра, возвращает edid-decode. Необходимо в случае, если точный размер экрана неизвестен и документация на дисплей отсутствует.
Comment 9 Sergey Y. Afonin 2020-08-28 09:16:38 MSK
(In reply to Speccyfighter from comment #7)

> Он не случайный. Он 0 (ноль) или eDP1:

Нет. Он eDP1, в данном случае, потому, что есть 

Section "Screen"
    Monitor "eDP1"

Только из-за этого подхватился

Section "Monitor"
    Identifier "eDP1"

Если Section "Screen" убрать, то, очевидно, не подхватится, если Identifier не поменять соответствующим образом.
Comment 10 Speccyfighter 2020-08-28 19:35:16 MSK
(Ответ для Sergey Y. Afonin на комментарий #9)
> (In reply to Speccyfighter from comment #7)
> 
> > Он не случайный. Он 0 (ноль) или eDP1:
> 
> Нет. Он eDP1, в данном случае, потому, что есть 
> 
> Section "Screen"
>     Monitor "eDP1"
> 
> Только из-за этого подхватился
> 
> Section "Monitor"
>     Identifier "eDP1"
> 
> Если Section "Screen" убрать, то, очевидно, не подхватится, если Identifier
> не поменять соответствующим образом.

Не совсем так.
Всё зависит от используемого драйвера, intel_drv или modesetting_drv.
А в Линукс единого стандарта на имя устройства отображения под графикой intel нет.

Штука вот в чём:

Для драйвера modesetting_drv, c LP156WHB-TPC1, устройство отображения это eDP-1:

$ cat p9-modeset_drv.txt 
$ ls /etc/X11/xorg.conf.d/10-monitor.conf
ls: невозможно получить доступ к '/etc/X11/xorg.conf.d/10-monitor.conf': Нет такого файла или каталога

$ xrandr | grep eDP
eDP-1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 344mm x 194mm

$ xrandr --listmonitors
Monitors: 1
 0: +eDP-1 1366/344x768/194+0+0  eDP-1

$ grep -r eDP /var/log/Xorg.0.log
 [ 14413.049] (II) modeset(0): Output eDP-1 has no monitor section
 [ 14413.053] (II) modeset(0): EDID for output eDP-1
 [ 14413.054] (II) modeset(0): Printing probed modes for output eDP-1
 [ 14413.057] (II) modeset(0): Output eDP-1 connected
 [ 14413.057] (II) modeset(0): Output eDP-1 using initial mode 1366x768 +0+0


В то время как для X-драйвера intel_drv, устройство отображения, это eDP1.

Это устройство:

$ xrandr --listmonitors
Monitors: 1
 0: +*eDP1 1366/340x768/190+0+0  eDP1

прекрасно подтянется:

$ grep eDP /var/log/Xorg.0.log | head -n5
[ 17782.787] (II) intel(0): Output eDP1 using monitor section eDP1
[ 17782.788] (**) intel(0): Found backlight control interface intel_backlight (type 'raw') for output eDP1
[ 17782.788] (II) intel(0): Enabled output eDP1
[ 17782.789] (--) intel(0): Output eDP1 using initial mode 1366x768 on pipe 0
[ 17782.818] (II) intel(0): switch to mode 1366x768@60.0 on eDP1 using pipe 0, position (0, 0), rotation normal, reflection none

и установится правильный размер экрана (Active Display Area):

$ grep -ri physical  /var/log/Xorg.0.log | head -n1
[ 17782.819] (II) intel(0): Setting screen physical size to 344 x 194

даже если секция "Screen" отсутствует:

$ grep -v '#' /etc/X11/xorg.conf.d/10-monitor.conf

Section "Monitor"
    Identifier "eDP1"
    DisplaySize 344 194
EndSection

Section "Device"
    Identifier "Card0"
    Driver "intel"
EndSection


Но X-сервер будет продолжать форсить 96 dpi:

$ grep DPI /var/log/Xorg.0.log | head -n1
[ 17782.789] (==) intel(0): DPI set to (96, 96)

что является неправильным для LP156WHB-TPC1:
https://bugs.freedesktop.org/show_bug.cgi?id=23705#c27

При этом, при конфигурировании на intel графике, нужно быть предельно внимательным с именем устройства отображения, на имя которого, стандарт в Линукс отсутствует:
С modesetting_drv на Lenovo G50-80 с LP156WHB-TPC1, это eDP-1.
С intel_drv на этом же железе, это eDP1.

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

Но если монитор указан как Monitor0 (как его и конфигурирует alterator-x11), а не как реальное имя устройства:

$ grep -v '#' /etc/X11/xorg.conf.d/10-monitor.conf

Section "Monitor"
    Identifier "Monitor0"
    DisplaySize 344 194
EndSection

Section "Device"
    Identifier "Card0"
    Driver "intel"
EndSection

то без описания Monitor0 в секции "Screen", DisplaySize будет игнорироваться и размер экрана LP156WHB-TPC1 при X-драйвере intel_drv, свалится в неправильные 340x190:

$ grep -ri physical  /var/log/Xorg.0.log | head -n1
[ 19722.916] (II) intel(0): Setting screen physical size to 340 x 190


Не факт конечно что скажу не глупость, но вот тут меня смущает этот Monitor%d, который по моему разумению, допускаю что и неправильному, и должен обрабатываться как обнаруженный Monitor0, если монитор один:

# strings /usr/bin/Xorg | grep 'Monitor%'
Monitor%d

Предположил, что %d, это номер устройства вывода в Monitor%d:

$ xrandr --listmonitors
Monitors: 1
 0: +*eDP1 1366/340x768/190+0+0  eDP1

Тогда, продолжая, почему DisplaySize подхватывается без секции "Screen" при указании реального имени устройства, с поправкой на X-драйвер, и не подхватывается при указании Monitor0, не знаю.
Comment 11 Speccyfighter 2020-08-28 20:48:12 MSK
В продолжение  Комментарий 10:

Но если идентификатор, т.е. имя реального устройства отображения,

$ xrandr --listmonitors
Monitors: 1
 0: +*eDP1 1366/340x768/190+0+0  eDP1


$ grep eDP /var/log/Xorg.0.log | head -n5
[ 25360.356] (II) intel(0): Output eDP1 has no monitor section
[ 25360.356] (**) intel(0): Found backlight control interface intel_backlight (type 'raw') for output eDP1
[ 25360.356] (II) intel(0): Enabled output eDP1
[ 25360.357] (--) intel(0): Output eDP1 using initial mode 1366x768 on pipe 0
[ 25360.386] (II) intel(0): switch to mode 1366x768@60.0 on eDP1 using pipe 0, position (0, 0), rotation normal, reflection none


для соответствующего драйвера указать неверным:

$ cat /etc/X11/xorg.conf.d/10-monitor.conf
# Generated by xsetup

Section "Monitor"
#    Identifier "Monitor0"
#    Identifier "eDP1" # intel_drv
    Identifier "eDP-1" # modesetting_drv
    DisplaySize 344 194
EndSection

Section "Device"
    Identifier "Card0"
    Driver "intel"
EndSection


то DisplaySize в 10-monitor.conf будет проигнорирован и размер экрана свалится в неверные 340x190 mm:

$ grep -ri physical  /var/log/Xorg.0.log | head -n1
[ 25360.389] (II) intel(0): Setting screen physical size to 340 x 190
Comment 12 stranger573 2020-08-30 04:38:03 MSK
(Ответ для Vladislav Zavjalov на комментарий #2)
> По стандарту VESA E-EDID в разделе "Basic Display Parameters and Features"
> указан примерный размер экрана (округленный до сантиметров). Для того, чтобы
> устанавливать подходящий размер шрифта, картинок и т.п.
Не подходящий а приблизительный размер. Тем кого это устраивает.

> parse-edid выдает секцию "Monitor" для xorg.conf с DisplaySize, выставленным
> по первому (неточному) размеру.
До недавнего времени выдавал точный размер. И совсем непонятно для чего это понадобилось менять.

>Вы предлагаете
> выдавать более точный размер, из "Preferred Timing Mode", что будет точнее
> для LCD-мониторов с одним режимом.
Не совсем так. Вернуть выдачу точного размера, так как было ранее. Ибо было лучше. С неточными размерами часто выставляется dpi с неквадратной точкой для мониторов у которых она квадратная и наоборот. Также во всех случаях выставляется неточный dpi.

> Мне не очень понятно, какие проблемы может вызвать неточное выставление
> DisplaySize (и, соответственно DPI). Вроде, вся графика привязана к точкам
> экрана, DPI применяется только для оценки размера дефолтного шрифта, чтоб не
> было слишком мелко/крупно, и тому подобных вещей.
   Нет, dpi это не крутилка для выставления размеров по вкусу. Нет, не вся графика привязана к точкам экрана. Есть целый класс программ работающих с реальными размерами, такие как: офисные пакеты, CAD-ы, Inkscape, Scribus, просмотрщики pdf и прочих документов.
   Людям работающим с графикой, шрифтами, вёрсткой и допечатной подготовкой необходимо знать и выставлять абсолютно точное значение dpi. И не только из-за отображаемых размеров. Неправильный dpi вызывает чудовищную растровую интерференцию (см. вложения, изменил dpi всего лишь на единичку в одном из двух измерений, чтобы увидеть разницу необходимо смотреть в масштабе 1:1 или 100%), очень даже может вызывать нарушения в работе видеокарты (по многолетнему опыту), неправильное позиционирование элементов интерфейса, неправильный рендеринг шрифтов и много чего ещё в самых неожиданных местах.
   Вот вы как думаете, такие вещи как read-edid нужны тем для кого размеры монитора не важны? Они могут без каких-либо программ и EDID получить тоже самое с помощью резиновой портновской ленты с сантиметровыми делениями.
Comment 13 stranger573 2020-08-30 04:40:08 MSK
Created attachment 8920 [details]
Точный реальный dpi
Comment 14 stranger573 2020-08-30 04:41:20 MSK
Created attachment 8921 [details]
dpi на одну единицу в одном измерении меньше
Comment 15 Speccyfighter 2020-12-16 12:10:51 MSK
parse-edid при выводе DisplaySize, должен точно следовать спецификации:

VESA EEDID Version 1, Revision 4:
https://glenwing.github.io/docs/VESA-EEDID-A2.pdf
VESA EEDID Version 1, Revision 3
https://glenwing.github.io/docs/VESA-EEDID-A1.pdf


Описание байтов 15h 16h:
VESA EEDID Version 1, Revision 4
https://glenwing.github.io/docs/VESA-EEDID-A2.pdf

Таблица структуры EDID:
Table 3.1 - EDID Structure Version 1, Revision 4
Page 19 of 91

Раздел детального описания байтов 15h 16h:
3.6.2 Horizontal and Vertical Screen Size or Aspect Ratio: 2 Bytes
Page 25 of 91

Цитата из описания байтов 15h 16h:
The horizontal and vertical screen size parameters provide information on the screen dimensions of the display device, rounded to the nearest centimeter (cm).

Байты 15h 16h содержат размер дисплея округлённый до ближайшего сантиметра. При декодировании edid, размер дисплея при использовании байтов 15h 16h, должен указываться только в сантиметрах. Переводить содержимое этих байтов из сантиметров в миллиметры нельзя.

Эти же два байта, 15h 16h, кратко упоминаются примечанием в колонке Format, таблицы 3.1 EDID Format Overview, в спецификации 1R3.

edid-decode, декодирует edid верно. Правильно указывая размер дисплея и в Maximum image size, и в Detailed Timing Descriptors.


Ошибка пересекается с багом:
Ошибка 38777 - xorg устанавливает малый неверный размер матрицы
https://bugzilla.altlinux.org/show_bug.cgi?id=38777
Comment 16 Speccyfighter 2020-12-16 12:24:47 MSK
(Ответ для Vladislav Zavjalov на комментарий #2)
> DisplaySize в xserver нужен для выставления DPI, ...

И для

LG Display LP156WHB-TPC1 Lenovo G50-80
http://www.datasheet-pdf.com/PDF/LP156WHB-TPC1-Datasheet-LG-929726

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

$ echo -e '1366*0.252\n768*0.252' | bc -l
344.232
193.536

и целочисленном 344x194, верный DPI, это 101 dpi. Или 100.
Потому что истинное точное значение для этой матрицы, находится между 100 и 101.
Но никак не 96.