Параллельные вычисления в ИММ УрО РАН
 
 
ИПМ им. М. В. Келдыша РАН                                А. О. Лацис




                      Операционная среда ROUTER
                      для транспьютерных систем.
                       Графическая библиотека.

Введение.
     Ниже описывается базовая графическая библиотека для использования
в рамках операционной среды Router.  Библиотека может использоваться в
двух вариантах:  однопроцессном (независимо от Router'а)  и  многопро-
цессном.  Данная реализация библиотеки опирается на стандартный прото-
кол ввода/вывода Inmos C Toolset  и  VESA  BIOS  видеоадаптера  класса
SVGA. Возможна работа на просто VGA  в режиме 320*200*256цветов.

1. Основные понятия для программиста.
     Доступные прикладной программе внешние переменные и функции  опи-
саны в bgraphic.h. Общая схема работы приводится ниже.
     Перед началом работы следует перевести экран в графический режим.
Это делается обращением к функции

        extern int bgr_init( int mode, int *s_x, int *s_y );

     Здесь mode - номер требуемого режима (не в смысле BIOS, а в своей
нумерации, принятой в данной  библиотеке,  см.  ниже),  s_x  и  s_y  -
возвращаемые размеры экрана в пикселах.  Функция возвращает значение -
код ответа: BGR_OK соответствует успешному завершению, о прочих значе-
ниях см. ниже.
     Во всех режимах предполагается дисплей класса "псевдоцвет" с фор-
матом видеопамяти "1 байт на пиксел".  Для управления палитрой исполь-
зуется функция:

        extern void bgr_setpal( int c, int cr, int cg, int cb );

     Здесь c - значение пиксела, cr, cg, cb - компоненты цвета. Диапа-
зон значений компонент цвета ни к чему не приводится:  значения непос-
редственно поступают в видеоадаптер.  Поскольку данная реализация опи-
рается на VGA/SVGA, диапазон значений - от 0 до 63.
     Для записи в видеопамять строки растра, сформированной прикладной
программой, используется функция:

        extern void bgr_write( int xto, int yto, int xsize, char *start );

     Здесь (xto,  yto) - точка начала строки, xsize - длина записывае-
мой строки, start - указатель на строку.
     Также предоставляется  возможность закрасить заданным цветом пря-
моугольник со сторонами, параллельными сторонам экрана:

      extern void bgr_rect( int c, int xmin, int ymin, int xmax, int ymax );

и написать горизонтальную строку текста заданным цветом в заданной позиции:
      extern void bgr_text( int c, int xto, int yto, char *string );

     Видеопамять при  работе библотеки предполагается дважды буферизо-
ванной (работа непосредственно в экран возможна,  но выглядит довольно
некрасиво). Это значит,  что построения производятся в невидимом буфе-
ре, который в некоторый момент копируется на экран,  и все накопленное
с момента  прошлого копирования изображение становится видимым.  Такое
копирование делается явно, обращением к функции:

        extern void bgr_flbuf( int xmin, int ymin, int xmax, int ymax );

     Аргументы этой функции задают так называемый динамический прямоу-
гольник со сторонами, параллельными сторонам экрана. Сразу после обра-
щения к bgr_flbuf невидимая видеопамять, в которой программа формирует
изображение, в пределах динамического прямоугольника заполняется нуля-
ми, а за его пределами - сохраняется.  Такая схема  помогает  повысить
эффективность для некоторых способов двойной буферизации.
     Однопроцессные возможности библиотеки этим  исчерпываются.  Расс-
мотрим организацию  работы многих процессов пользователя в рамках сис-
темы Router.
     Прежде всего,  все  процессы равноправны и симметричны при вызове
функций библиотеки.  Внутри себя,  конечно,  Router различает первое и
последующие обращения к bgr_init. Тот процесс, который успел обратить-
ся первым,  определяет,  скольким процессам разрешено на этот раз сов-
местно работать с графикой. Чтобы сделать это, он должен перед обраще-
нием к bgr_init присвоить число процессов (включая себя),  которые бу-
дут рисовать вместе,  внешней переменной NPROC_REQUIRED.  По умолчанию
ее значение равно 1.
     Каждый следующий процесс, выполнивший bgr_init, будет регистриро-
ваться как подключившийся к  графике.  Если  их  будет  слишком  много
(больше, чем  первый  указал  в своем NPROC_REQUIRED),  подключения не
произойдет, bgr_init вернет аварийный код ответа BGR_TOOMANY.
     Поскольку нельзя, вообще говоря, знать, кто будет первым, все ри-
сующие процессы одной программы должны указывать одно и то же значение
NPROC_REQUIRED.
     Любой процесс,  подключение которого прошло успешно, после завер-
шения bgr_init получит во внешней переменной NPROC_ACTUAL действитель-
ное число процессов,  подключения которых будет ждать сервер. Ждать он
их будет  при  каждом bgr_flbuf:  очередное копирование буфера в экран
произойдет только  тогда,  когда  этого   захотят   все   NPROC_ACTUAL
процессов. При  этом динамические прямоугольники суммируются:  берется
минимальный, объемлющий все заказанные.

2. Основные понятия для системного администратора.

2.1. Компоновка сервера-концентратора и программы пользователя с  гра-
     фической библиотекой.
     В п.  5.2 документа  router.doc  описывается,  как  собрать  сер-
вер-концентратор с  графикой,  как  собрать  автономную однопроцессную
программу пользователя с графикой и как собрать процесс  многопроцесс-
ной задачи пользователя, использующий графику.

2.2. Поддерживаемые режимы.

     #     Параметры
     0     320*200*256цветов, VGA
     1     640*400*256цветов, SVGA - VESA BIOS
     2     640*480*256цветов, SVGA - VESA BIOS
     3     800*600*256цветов, SVGA - VESA BIOS

2.3. Настройка VESA-графики.
     Для работы графики в режимах 1, 2, 3 (то есть VESA-режимах 0x100,
0x101,  0x103  соответственно)  должны быть установлены set-переменные
VESAPAGE и VESA0xnnn, где nnn - это 100, 101, 103 соответственно. Что-
бы понять,  как и для чего они устанавливаются, вспомним, как устроена
VESA-графика.
     В VESA-режимах  вся имеющаяся видеопамять представляет собой один
сплошной массив байтов,  по байту на пиксел,  причем с начала  массива
расположена обычно нулевая страница, а в отношении расположения первой
и последующих, если они есть, возможны варианты, зависящие от реализа-
ции. Память эта не находится вся в адресном пространстве IBM PC, а ад-
ресуется скользящим окном (как минимум одним),  которое программно ус-
танавливается  на требуемое место памяти.  При установке окна на конк-
ретное место видеопамяти место это указывается с точностью до  величи-
ны,  которое  называется  в VESA-документации "granularity".  Значение
этой величины для данной реализации VESA-драйвера/BIOS'а можно узнать,
запустив программу. Именно это значение в виде числа в десятичной сис-
теме счисления следует присвоить set-переменной VESAPAGE. По умолчанию
- 64к, что эквивалентно:
     
     set VESAPAGE=65536
     
     В set-переменных  VESA0xnnn для каждого режима nnn указывается (в
том же виде) смещение в байтах до начала видеостраницы номер  1,  если
она есть. Обычно страница начинается на границе сегмента. В общем слу-
чае это число потребуется подбирать экспериментально.  Оно будет зави-
сеть  как  от объема видео-ОЗУ,  так и от версии VESA-драйвера/BIOS'а.
Например,  в адаптере Trident T-9000 его следует задать для режима 100
равным 256к-4, если в адаптере 512к памяти.
     По умолчанию, то есть если set-переменная для используемого режи-
ма не задана, будет считаться, что имеется только одна страница видео-
памяти.  Обращения к функциям переключения страниц будут игнорировать-
ся,  и вывод не будет дважды буферизованным, но все равно должен рабо-
тать.
     В очень  редких случаях может получиться,  что и в режиме 0 вывод
не будет дважды буферизованным.  Это бывает,  если после запуска прог-
раммы iserver.exe на IBM PC не осталось 64к свободной памяти. Однако и
в этом случае все должно работать.