Содержание

GPU

Графический процессор PlayStation (GPU) - это специализированный 32-битный чип от Sony, отвечающий за отрисовку графических примитивов (полигонов, прямоугольников и отрезков), а также за управление видеопамятью. Имеет 1 MiB видеопамяти (VRAM) под фреймбуфер и текстуры, 2 KiB текстурного кэша.

У GPU нет фиксированного набора разрешений. Возможные разрешения определяются стандартами PAL/NTSC и пятью доступными делителями частоты видеосигнала. Типичные разрешения имеют ширину 256, 320, 368, 384, 512 или 640 пикселей и высоту 224, 240, 256, 480 или 512 строк.

Полупрозрачность и смешивание

GPU аппаратно поддерживает четыре режима смешивания цветов (где A - цвет пикселя, который уже находится в буфере кадра, B - цвет нового рисуемого пикселя):

Альфа-канал (попиксельная полупрозрачность) не поддерживается. В текстуре можно задать лишь бит прозрачности, который либо включает смешивание, либо выключает.

Дизеринг

При включенном дизеринге GPU чередует соседние цвета для повышения визуального качества градиентов. Вся математика внутренне осуществляется в 24-битном режиме, и только результат записывается в 16-битном. Если дизеринг отключен, GPU просто отбрасывает нижние 3 бита цвета.

Текстурный кэш

GPU оснащен текстурным кэшем в 2 KiB. Для 4-битного цветового режима это 64×64 пикселя, для 8-битного - 32×64, для 16-битного - 32×32.

Кодирование команд

GPU управляется посредством команд, которые представляют собой 32-битные слова. Команда, состоящая из нескольких слов, называется пакетом (packet). Первое слово любой команды - заголовок, состоящий из 8-битного идентификатора команды (в старших битах) и 24-битного параметра (в младших битах).

Заголовок команды кодируется по следующей схеме:

За заголовком могут следовать данные, состоящие из упакованных в 32-битные слова параметров (например, координаты или цвета).

Для рисования текстурированного полигона в команду GPU отправляется значение tpage, 16-битное поле, которое кодирует положение страницы и параметры ее использования:

Отправка команд

Команды передаются через порты ввода-вывода или посредством 2-го канала DMA. При передаче через порт, переданные слова накапливаются в 64-байтном FIFO-буфере (командной очереди). GPU считывает данные из FIFO и начинает выполнение команды автоматически, как только получает минимально необходимое для нее количество слов. Если передача прервана до получения всех слов, GPU останется в состоянии ожидания данных. Отправка в GP1 команды 0x01000000 позволяет принудительно сбросить очередь, чтобы начать новый цикл передачи.

Порты ввода-вывода:

Список команд GP0

Доступ к видеопамяти

Управление

Рисование полигонов

Примечание: четырехугольники рисуются как два треугольника. Первый составляется из вершин 1, 2, 3, второй составляется из вершин 2, 3, 4. Направление вершин (winding) для GPU значения не имее, отбор видимости реализуется программно (например с помощью команды NCLIP GTE).

20h..2Ah - рисуют одноцветные полигоны:

Параметры 20h..2Ah кодируются следующим образом:

24h..2Fh - рисуют текстурированные полигоны:

Параметры 24h..2Fh кодируются следующим образом:

30h..3Ah - рисуют освещенные одноцветные полигоны:

Параметры 30h..3Ah кодируются следующим образом:

34h..3Eh - рисуют освещенные текстурированные полигоны:

Параметры 34h..3Eh кодируются следующим образом:

GP0(35h,37h,3Dh,3Fh) - незадокументированные команды, которые представляют собой то же самое, что и GP0(34h,36h,3Ch,3Eh), но игнорируют цвета вершин и рисуют простые текстурированные полигоны.

GP0(21h,23h,29h,2Bh,31h,33h,39h,3Bh) - незадокументированные команды, которые представляют собой то же самое, что и GP0(20h,22h,28h,2Ah,30h,32h,38h,3Ah).

Рисование отрезков и полилиний

Полилинии - это цепочки соединенных отрезков. Параметры для них задаются следующим образом:

Рисование прямоугольников

Эти команды рисуют прямоугольники, также известные как спрайты. Прямоугольник строго ориентирован по осям XY (поворот не поддерживается, стороны прямоугольника всегда параллельны краям экрана).

Изменение атрибутов отрисовки

Список команд GP1

((X2 - X1) / cyclesPerPixel + 2) & ~3

Важный факт: в популярной книге «Everything You Have Always Wanted to Know about the Playstation But Were Afraid to Ask» перепутаны значения младшего бита параметра для GP1(03h) - ноль указан как выключение, единица - включение.

Модели GPU

Существует, по меньшей мере, две модели GPU, старая и новая. Старая использовалась в ранних моделях консоли (SCPH-100x), новая - в более поздних. Модели отличаются незначительными деталями в реализации некоторых функций. Например, формула модуляции в старой модели:

((color & 0xf8) * (texel << 3)) >> 7

В новой:

(color * (texel << 3)) >> 7

Значение статуса после сброса в старой модели 0x14800000, в новой 0x14802000.