logo search
Литература_1 / photon_old

Режим рисования с прямым доступом

В обычном (не "напрямую") режиме, приложение отсылает запросы на прорисовку в менеджер Photon'а. Графический драйвер блокируется менеджером Photon'а.

Связь в обычном (не прямого доступа) режиме

Когда приложение входит в режим прямого доступа, оно требует, чтобы графический драйвер получал поток данных прорисовки и служебные сообщения напрямую от приложения, а не от менеджера Photon'а. Драйвер блокируется на получении данных от приложения, которое теперь ответственно за то, чтобы указывать драйверу, что делать.

Связь в режиме прямого доступа

Когда приложение входит в режим рисования с прямым доступом, приложение получает полный контроль над дисплеем, так что никакие другие приложения графическим драйвером не обслуживаются. Зона графического драйвера также больше не чувствительна к событиям рисования (так что менеджер Photon'а аннулирует все запросы других приложений к службам построения изображения этого драйвера). Другим достоинством этого режима является то, что графические услуги больше не пересылаются через пространтство событий Photon'а, что улучшает производительность. Недостатком этого режима является то, что приложения, ожидающее захвата событий рисования, не могут записать визуальное представление приложения.

В целях удобства работы создан новый тип контекста PdDirectContext_t. Этот контекст, будучи активирован, становится контекстом по умолчанию для приложения, так что в этом режиме корректно работают вызовы всех остальных функций Photon'а Pg*.

 В этом режиме начальной точкой отсчёта для всех операций рисования является верхний левый угол экрана, поскольку запросы больше не обрезаются и не преобразуются пространством событий Photon'а. Ваше приложение, если необходимо, по-прежнему может преобразовывать и обрезать события, вызывая функции PgSetTranslation() и PgSetClipping().

Следующие функции имеют дело с режимом рисования с прямым доступом:

PdCreateDirectContext()

Создать контекст режима рисования с прямым доступом

PdDirectStart()

Войти в режим рисования с прямым доступом

PdDirectStop()

Выйти из режима рисования с прямым доступом

PdGetDevices()

Получить идентификаторы областей (region IDs) для доступных в текущий момент устройств вывода изображения

PdReleaseDirectContext()

Выйти из режима рисования с прямым доступом и освободить контекст режима рисования с прямым доступом

PdSetTargetDevice()

Установить целевое устройство

PdWaitVSync()

Ожидать вертикальную синхронизацию

Вот несколько соображений, которые надо иметь в виду:

          1. Пример

Вот как получить адрес какого-либо контекста видео-памяти (включая дисплей, который можно также рассматривать как видеопамять). Если Вы создали контекст прямого доступа, вызвав функцию PdCreateDirectContext(), и затем вошли в режим прямого доступа, вызвав функцию PdDirectStart(), Ваше приложение "присваивает" графический драйвер (PgFlush() проходит непосредственно на видеодрайвер, минуя сервер Photon'а).

Вам нет необходимости находится в режиме прямого доступа, чтобы получить указатель на внеэкранную память, но надо находиться в нём, чтобы получить указатель на основной дисплей. Вот некий псевдокод:

/* Создание контекста прямого доступа */

direct_context = PdCreateDirectContext();

/* Запуск режима прямого доступа */

PdDirectStart(direct_context);

/* Получение основного дисплея */

primary_display = PdCreateOffscreenContext( 0, 0, 0, Pg_OSC_MAIN_DISPLAY);

/* Получение указателя на дисплей */

vidptr = PdGetOffscreenContextPtr(primary_display);

/* Убеждаемся, что драйвер Photon'а ничего не делает

(этого не может быть в данной точке, но мы просто убеждаемся, что

у нас нет продвинутости движка прорисовки видеокарты)

(??? it shouldn't be at this point but this is just to

be sure that we haven't gotten ahead of the video card's draw engine). */

PgWaitHWIdle();

/* Делаем то, что мы делаем в памяти */

Do_something(vidptr);

/* Выход из режима прямого доступа, и удаление контекста прямого доступа

(альтернативой может быть функция PdDirectStop(),

если мы не хотим уничтожать контекст*/

PdReleaseDirectContext(direct_mode);