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 совершенно одинакого).
назад...