RDM/2 The Russian Electronic Developer Magazine  
RDM/2 Русский электронный журнал разработчика  
ДомойОт редактораПишите намОбратная связьRU/2

Дисплейные драйверы технологии GRADD.

Что это такое?

В свое время в поставку OS/2 Warp 4 был включены модули поддержки дисплейных драйверов по новой технологии построения дисплейных драйверов для OS/2 GRADD (расшифровывается как GRaphics Adapter Device Driver). Также в поставку вошли несколько собственно драйверов GRADD - VGA, Generic VESA Unaccelerated, S3 864, давая возможность, хоть и в ограниченном объёме, испытать новую технологию. В примеры DDK были включены исходные тексты Generic GRADD и S3 864 GRADD драйверов, а также исходный текст отладочного фильтра для GRADD драйверов. Через некоторое время после выхода 5-го фикспака к Warp 4 программисты фирмы IBM выпустили дополнительный (бесплатный) пакет драйверов GRADD, поддерживающий наборы микросхем (chipsets) Chips & Technologies CT6555x Family, ATI Mach64/Rage Family, Matrox Millenium & Mystique Family, S3 86x/96x/Trio Family, S3 Virge/Trio3D Family, а также обновленный Generic VESA Unaccelerated. Первоначально малопригодный для нормального использования, данный пакет, начиная с версии 0.077 (последняя на данный момент официально опубликованная версия - 0.080 от 10.08.99), вполне приличный вид и параметры, и используется в качестве базового в коммерческом пакете GRADD драйверов SciTech Display Doctor for OS/2 от фирмы SciTech (последняя на данный момент официально опубликованная версия - 2.70 beta 5 от 13.08.99). Начиная с 35-го фикспака, GRADD драйверы поддерживаются также и на платформе OS/2 Warp 3.

Согласно информации фирмы IBM, последующие обновления для GRADD и прочих дисплейных драйверов по мере опубликования следует искать в Интернете: http://ps.software.ibm.com

Насколько хороша данная технология? Мнения, как обычно, различаются. GRADD драйверы компактны, просты в установке, и, будучи успешно установленными, практически никогда не являются причиной сбоев в работе системы. Generic драйвер дает возможность использовать любые (или практически любые) графические адаптеры, имеющие в своем BIOS поддержку VESA, в режимах SVGA разрешений, т.е. становится возможным более комфортное пользование теми из адаптеров, которые не снабжены штатными драйверами для OS/2. Однако Generic драйвер не позволит переключить частоту обновления кадров (vertical refresh rate) с универсального значения 60 Гц, и достаточно медленно работает с графическими примитивами типа линий или растров (bitmaps).

С точки же зрения программиста, GRADD драйвер на порядок (возможно, и на два) проще в написании по сравнению с драйвером традиционной схемы, и заслуживает самого пристального внимания.

Что внутри?

Видеоподсистема GRADD определяется фирмой IBM как поддерживающая все стандартные графические подсистемы на платформе OS/2 (а это, на данный момент, Presentation Manager GRE (Graphics Runtime Engine) и WIN-OS/2 GDI), максимально использующая общий код, имеющая модульную конструкцию, и использующая доступ к аппаратуре только в тех модулях, которые непосредственно заняты обслуживанием данной аппаратуры. Одной из задач ставилось значительное упрощение разработки дисплейных драйверов, и следует признать, что IBM это удалось.

Видеоподсистема GRADD

Видеоподсистема GRADD состоит из следующих компонентов:

Как это работает?

Каждый модуль GRADD является 32-битной DLL, имеющей одну экспортируемую точку входа с заранее оговоренным именем. Для сервисного модуля это:

ULONG EXPENTRY HWEntry( GID gid, ULONG ulFun, PVOID pInput, PVOID pOutput )

Любая функция GRADD обслуживается в контексте вызова этой точки входа. Параметр gid обозначает идентификатор модуля GRADD, ulFun - номер функции, pInput и pOutput - указатели на входной и выходной блоки данных, соответственно. В зависимости от вида функции один или оба этих указателя могут быть нулевыми.

GRADD драйвер получает запросы в формате GHI на исполнение команд с заранее определенными кодами. Обслуживание пяти из этих команд обязательно для каждого драйвера - инициализация драйвера, запрос возможностей драйвера, запрос поддерживаемых драйвером видеорежимов, установка видеорежима, запрос и установка палитры (для 256-цветных режимов). Некоторые команды допускается не обслуживать, а некоторые можно перенаправить в библиотеку программной эмуляции.

Команды GHI конвертируются модулем VMAN из команд VHI, которые, в свою очередь, исходят из модулей трансляции запросов графических подсистем (пример такого модуля - GRE2VMAN.DLL). Конкретный модуль GRADD или самостоятельно обслуживает запрос, или же возвращает код неподдерживаемой функции (тогда запрос передается следующему в цепочке модулю GRADD), или же код запроса программной эмуляции функции (тогда VMAN обращается с данным запросом к модулю программной эмуляции рисования SOFTDRAW). Для расширения системы кодами команд, не предусмотренных заранее, существует специальный вид запроса - операция расширенная.

Для получения драйверами GRADD системных сервисов в интерфейсе VMI существуют вспомогательные функции (helpers): VHAllocMem, VHFreeMem, VHLockMem, VHMap, VHMapVRAM, а также вспомогательные функции для работы с аппаратурой: HWInpByte, HWInpWord, HWInpDWord, HWOutpByte, HWOutpWord, HWOutpDWord, HWOutpString, HWOutpRect, HWOutpBitRect, HWOutpTransRect, HWInpString (определены в DDI.H). Также GRADD драйвера имеют возможность использования функций VESA Video BIOS Extensions через вызовы SVGA Protected Mode Interface, в том числе имеется возможность вызова программных прерываний BIOS. Эти вызовы широко используются как в видеодрайверах традиционной модели, так и в видеодрайверах GRADD. (В качестве интересного нюанса заметим, что в видеодрайверах NT4 такая возможность тоже есть - и тоже используется :)

Практическое применение

Рассмотрим практическое применение технологии на примере опубликованного в июле драйвера GRADD для адаптеров ET6000. По существу он представляет собой исходный текст драйвера GENGRADD из примеров DDK, датированный 20.04.98, модифицированный для получения возможности переключения частот вертикального обновления (первичная цель), и скомпилированный компилятором Zortech C++ 3.1 (в экспериментальных целях, а как побочный результат был получен замечательно малый размер модуля - 4.5kB).

Ralph Brown Interrupt List rev.59 даёт следующую информацию относительно частот вертикальной развёртки для адаптеров Tseng ET4000 (предшественник ET6000, практически совместимый снизу-вверх):

INT 10 - Tseng ET-4000 BIOS - GET/SET SCREEN REFRESH RATE
AH = 12h
BL = F1h
AL = subfunction
00h set refresh rate
01h get refresh rate
BH = video mode
00h 640x480
01h 800x600
02h 1024x768
03h 1280x1024
CX = new refresh rate (see #00034) if AL = 00h
Return: AL = 12h if supported
CX = current rate (for AL=00h, a changed CX indicates failure)

(Table 00034)
Values for Tseng ET4000 refresh rate:
CX 640x480 800x600 1024x768/1280x1024
00h 60 Hz 56 Hz interlaced
01h 72 Hz 60 Hz 60 Hz
02h 75 Hz 72 Hz 70 Hz
03h 90 Hz 75 Hz 75 Hz
04h -- 90 Hz --
В процедуру загрузки параметров всех доступных видеорежимов добавлено "размножение" записей для режимов соответствующих разрешений согласно количеству частот вертикальной развёртки, которые можно включить в видеоадаптерах Tseng средствами BIOS для данных разрешений. Это значит, что для, например, общего количества 22 видеорежимов каждый из доступных режимов 800х600 пикселов должен быть занесён в результирующую таблицу 5 раз, с частотами вертикальной развёртки 56, 60, 72, 75 и 90 Гц. Позже из этих режимов будут выбраны те, которые можно установить на подключенном мониторе.

При установке режима проверяется, определены ли для него значения регистров вызова Video BIOS, и если это так, то перед вызовом SVGAPMI PMIREQUEST_SETMODE (стандартная методика в GENGRADD) производится вызов PMIREQUEST_SOFTWAREINT с соответствующими параметрами.

Эти два простые добавления позволили с минимальными усилиями получить на адаптерах ET6000 возможность включения более приятных частот вертикальной развёртки (правда, отсутствие более подробной информации не позволило ввести полезные промежуточные значения частот, например, 85 Гц). Этот драйвер для ET6000 доступен со страницы http://www.geocities.com/SiliconValley/Pines/4388/et6/. Попутно выявилось то, что при наличии в системе DDC монитора (теоретически обладающего широким набором возможных разрешений), SVGAPMI предоставляет пользователю выбор из трёх стандартных разрешений 640х480, 800х600, 1024х768, а это значит, что, несмотря на наличие в адаптере ET6000 режима 1152х864, включен этот режим никогда не будет. Известная фирма SciTech обходит эту проблему в своих драйверах тем, что добавляет в файл описания мониторов PRIVATE.DIF псевдо-монитор SciTech, в котором описывает все (но на самом деле не все :) ) возможные разрешения с одной частотой развёртки 60 Гц.

За более подробной информацией следует обратиться в DDK Documentation и DDK header files (они более актуальны в отношении состава структур данных, чем давно не обновляемая документация).

Yury Tarasievich
http://www.geocities.com/SiliconValley/Pines/4388

---
Комментариев к странице: 0 | Добавить комментарий
---
Редактор: Дмитрий Бан
Оформление: Евгений Кулешов