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

Алексей Федорчук
2004.12.05

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

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

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

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

options   VESA   
options   SC_PIXEL_MODE

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

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

Как известно, за поведение консоли в DFBSD (как и во 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) дают лишь бледное впечатление о реальности (в которой, как известно, все не так, как на самом деле).

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

allscreens_flags="MODE_277"

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

Обновлено: 12.03.2015