GPU-ПЛАГИН

GPU плагин (также, как и все остальные плагины) представляет собой динамическую библиотеку. особого соглашения по названию DLL нет, но принято называть их так: gpuNamePlatform.dll, где Name - это имя автора, а Platform - видеосистема, например Soft, D3D или Glide. на данный момент создано уже довольно много GPU-плагинов как в программной реализации (под DirectDraw), так и в аппаратной (OpenGL, Direct3D, Glide). имхо, самым лучшим является gpuLewGlide, созданный Lewpy для 3Dfx VoodooX. для прочих карт, не поддерживающих Glide, подойдет gpuPeteD3D.

ПОИСК И НАСТРОЙКА

для поиска GPU-плагина, используятся его функции PSEgetLibType, PSEgetLibVersion и PSEgetLibName. более подробно про это см. "плагины PSEmuPro". для настройки, у плагина есть функции GPUconfigure, GPUtest и GPUabout. все они основаны (чаще всего) на диалогах, и позволяют настроить, протестировать и узнать автора настраиваемого GPU-плагина. конкретную реализацию можно посмотреть в GPU-плагине от Duddie. не знаю, насколько законно держать этот архив на моем сайте, но пока есть - качайте...

ИНИЦИАЛИЗАЦИЯ

перед началом работы, эмулятор _должен_ инициализировать GPU-плагин. для этого он вызывает функцию GPUinit. перед выходом в систему, эмулятор _может_ вырубить GPU-плагин, вызвав функцию GPUshutdown. чтобы "открыть" GPU устройство, применяется функция GPUopen. "открыть" означает создать контекст полноэкранного окна. для разных видеоAPI этот процесс протекает по разному, например для DirectDraw это создание поверхностей и переход в эксклюзивный режим, для Glide это открытие Glide-контекста и пр. и, на конец, "закрыть" GPU можно функцией GPUclose (аналогично - убить GPU окно).
зачем init+open и shutdown+close были разъедены? а для того, чтобы юзверь, нажав на ALT+TAB, мог понастраивать ядро эмулятора, и опять вернуться к игре. поэтому ядро вначале закрывает окно GPU, потом опять открывает. этот процесс занимает гораздо меньше времени, чем init и shutdown.

ОБНОВЛЕНИЕ ЭКРАНА

GPUupdateLace, по-моему, самая интересная функция. насколько быстрее, и оптимальнее будет обновлен экран, на столько-же быстрее будеть работать весь эмулятор в целом. хотя у некотрых плагинов есть поддержка FrameSkip (пропуск кадров), во время которого время на обновление экрана отдается эмуляции остального железа. обычно в плагинах используется двойная буферизация. проще всего обстоит дело с софтверными плагинами - им всего-лишь нужно сделать BLIT из BACK-буфера на FRONT-буфер. самое тяжелое положение у Glide. из-за специфических особенностей устройства GPU, полностью проэмулировать обновление экрана под Glide, очень сложно (если вообще возможно).

РАБОТА С ЖЕЛЕЗОМ GPU

как известно (если не известно, RTFM), у GPU есть два 32-битных регистра GP0(данные) и GP1(статус), а также поддержка display-листов, или, по терминологии PSX - linked packets ("связанные пакеты"). пакеты пересылаются потоком, через DMA-канал. структуру этих пакетов, команд GPU и описания регистров см. в мануале.
для доступа (чтения/записи) в регистры используются 4 функции: GPUreadData, GPUwriteData для GP0 и GPUreadStatus и GPUwriteStatus для GP1. входные и выходные параметры логичны: для записи на входе записываемое значение, для чтения на выходе, содержимое регистра.
для работы с DMA каналом есть функция GPUdmaChain. на входе у нее два параметра. первый указывает на начало эмулируемой RAM памяти PSX (массив в 2 мега), а второй адрес DMA-пакета в этом массиве. потребность в двух указателях на входе у функции, обусловлена внутренним устройством DMA-пакета, поэтому просто передать указатель на пакет будет не достаточно.
кстати, во всех плагинах пропущена одна деталь работы GPU - это счетчик пикселей, отрисованных на экране. может быть этот счетчик нигде не используется, поэтому его не эмулируют, но у реальной PSX он все-же имеется. примечание: пакеты можно передавать как через DMA (цепочкой), так и через регистр GP0 (один за одним). а так как первый способ гораздо быстрее, то практически все игры используют отрисовку только через DMA. из-за этого некотрые GPU-плагины некорректно обрабатывают записи в регистр GP0, а иногда просто игнорируют их и эмулируют только DMA-пакеты (хотя обработка пакетов что там, что там, ведется GPU совершенно одинакого).

назад...