О блоге

Все новые материалы размещаются на Блогосайте alv.me. Старые - в процессе переноса.

19.08.2008

DragonFlyBSD и графическая консоль

Консольная графика, то есть вывод произвольных попиксельных изображений (в том числе и шрифтов) средствами системы, без привлечения оконной системы X или специализированных библиотек (типа SVGAlib), до сего дня был слабым местом BSD-систем. Особенно - в сравнении с Linux, где графическая консоль (через Frame Buffer) поддерживается ядром уже очень давно. В OpenBSD же и NetBSD, насколько мне известно, вообще нет аналогов этому. А во FreeBSD графическая консоль (т.н. pixel mode) была реализована не лучшим образом: с максимальным разрешением до 800x600, да и не на всех видеокартах картина получалась мало-мальски приличной.

А вопрос консольной графики нынче приобретает актуальность в связи с распространением LCD-мониторов. Ведь на них оптимальным образом будет выглядеть картинка (идет ли речь о воспроизводстве собственно графики или текстов со шрифтовым оформлением) лишь при разрешении, равном физическому разрешению матрицы. Которое даже для 14-15-дюймовых моделей составляет минимум 1024x768. Я уж не говорю о совершенно непроизводительном расходе мест на больших (от 17 дюймов) экранах, на которых чисто текстовая консоль со стандартной плотностью символов (80x25) выглядит весьма убого. Попытка же использовать нестандартные текстовые плотности символов (типа 80x43 и так далее) приводит к тому, что зрелище становится просто душераздирающим.

И вот - свершилось: в DragonFlyBSD заявлена поддержка графической консоли, причем с разрешениями вплоть до максимально разумных (и допустимых для видеокарты). Остается только прикрутить эту самую графическую консоль - по умолчанию она не задействована, - и наслаждаться.

Впрочем, прикрутить к DragonFlyBSD графическую консоль легко: для этого достаточно переконфигурировать ядро системы, внеся в файл конфигурации строки

options         VESA       
options SC_PIXEL_MODE

скомпилировать и инсталлировать его. После чего дело остается за малым - опробовать все доступные разрешения и настроить виртуальные консоли на наиболее комфортное из них.

Все описанное ниже основано на моих экспериментах, базой которых послужила Toshiba Satellite Pro A40 с 15-дюймовым LCD-дисплеем (физическое разрешение 1024x768). Роль видеоадаптера в ней исполняет интегрированная в чипсет AGP-карта от Intel - i852GM, без собственной видеопамяти (в качестве таковой может отъедаться до 64 Мбайт памяти системной - у меня под это дело отдано 16 Мбайт).

Как известно, за поведение консоли в DragonFlyBSD (как и во FreeBSD) отвечает консольный драйвер syscons, а управление ее параметрами осуществляется двумя программами - kbdcontrol, делающая все, что связано с клавиатурой, и vidcontrol, обеспечивающая характеристики экранного вывода. К последней мы и обратимся, поскольку именно вывод в данный момент нас и интересует.

Перво-наперво с помощью vidcontrol можно получить информацию о видеоподсистеме машины. Для этого она дается в следующей форме

$ vidcontrol -i adapter

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

Однако та же опция -i с другим значением позволяет ознакомиться и с поддерживаемыми видеорежимами:

$ vidcontrol -i mode

В ответ на это выводится (при умолчальном ядре GENERIC) достаточно длинный список доступных режимов с различной плотностью символов - от стандартной 80x25 и пониженной 40x25 до максимально возможной 80x60:

  mode#     flags   type    size       font      window      linear buffer
------------------------------------------------------------------------------
0 (0x000) 0x00000001 T 40x25 8x8 0xb8000 32k 32k 0x00000000 32k
1 (0x001) 0x00000001 T 40x25 8x8 0xb8000 32k 32k 0x00000000 32k
2 (0x002) 0x00000001 T 80x25 8x8 0xb8000 32k 32k 0x00000000 32k
...
24 (0x018) 0x00000001 T 80x25 8x16 0xb8000 32k 32k 0x00000000 32k
...
30 (0x01e) 0x00000001 T 80x50 8x8 0xb8000 32k 32k 0x00000000 32k
32 (0x020) 0x00000001 T 80x30 8x16 0xb8000 32k 32k 0x00000000 32k
34 (0x022) 0x00000001 T 80x60 8x8 0xb8000 32k 32k 0x00000000 32k

В этом списке под номером 24 мы видим тот самый стандартный режим, обеспечивающий плотность символов 80x25 и предназначенный для использования со шрифтами с матрицей 8x16.

После перекомпиляции ядра с описанными выше опциями список видеорежимов расширился почти вдвое. В нем появились графические разрешения от 640x480 до (!) 1920x1440 при глубине цвета от 8 до 32 бит - прямо как в Иксах:-). Осталось определить, как же можно подключить эту красоту.

Выручила, как всегда, тетя Маня - man (1) vidcontrol. Правда, с описанным в качестве основного способом - через опцию -g (-geomerty) ничего не получилось - она категорически отказывалась переключать экран в какие-либо графические режимы, только в нестандартные текстовые (да и то не во все из списка).

Однако внимательное чтение показало другой способ - через опцию MODE_#режима. И какова же была моя радость, когда после команды

$ vidcontrol MODE_277

я получил режим с разрешением 800x600 при 32-битном цвете.

Дальнейшие эксперименты показали, что рабочими являются все режимы в диапазоне разрешений от 640x480 до 1024x768 при любой глубине цвета. Более высокие режимы имели для меня чисто теоретическое значение. Попытка выставить разрешение больше физически возможного для матрицы, естественно, потерпела фиаско: терминал просто разваливался. Однако и полученного было достаточно. Тем более, что при моей близорукости комфортно выглядел только режим 800x600. Хотя для людей с хорошим зрением 1024x768 будет, вероятно, самое то.

Правда, для достижения идеального эффекта потребовалась подборка шрифтов. Использовавшийся мной до этого шрифт ter-k16b.fnt из пакета terminus-fonts выглядел в графическом режиме... не то что бы плохо, но, скажем так, не идеально. Однако решение было рядом: в том же пакете имелся шрифт ter-k16f.fnt, специально предназначенный для консоли в режиме Frame Buffer. С его установкой была достигнута совершенно невероятная четкость символов - не превзойденная даже в графической консоли Linux. Приведенные скриншоты, полученные специально предназначенной для того утилитой scr2png (рис. 1-2) дают лишь бледное впечатление о реальности (в которой, как известно, все не так, как на самом деле).

Рис. 1. Воспроизведение латинского текста в графической консоли

Рис. 2. Воспроизведение русского текста в графической консоли

К слову сказать: я использую шрифты в кодировке KOI8-R. И из рис. 3 можно видеть, что даже программы, использующие псевдографику, выглядят при этом вполне пристойно.

Рис. 3. Воспроизведение в графической консоли программы (Midnight Commander), использующей псевдографику

Оставалось увековечить полученный результат ныне и присно. Для этого в файл /etc/rc.conf вписывается строка

allscreens_flags="MODE_277"

И теперь после перезагрузки графический режим активизируется на всех виртуальных консолях.

В заключение замечу, что возможность работать в консоли с разрешениями выше 800x600 нынче обратно портирована и во FreeBSD. Правда, не в официальных ветках, а с помощью дополнительных патчей (и включена уже в бета-версию 6-й ветки). О деталях можно узнать из следующего обсуждения.