Инструменты пользователя

Инструменты сайта


gpu

Это старая версия документа!


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 - цвет нового рисуемого пикселя):

  • Режим 0 - полупрозрачное смешивание: 50/50: 0.5 * A + 0.5 * B
  • Режим 1 - аддитивное смешивание: A + B
  • Режим 2 - субтрактивное смешивание: A - B
  • Режим 3 - четверть нового цвета плюс полный цвет фона: A + 0.25 * B

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

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

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

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

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

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

  • Биты 31..24: 8-битный идентификатор команды, в том числе:
    • Бит 28: флаг прозрачности (1 = полупрозрачный примитив, 0 = непрозрачный)
    • Бит 27: флаг количества вершин (0 = треугольник, 1 = четырехугольник)
    • Бит 26: флаг текстурирования (0 = сплошной, 1 = текстурированный)
    • Бит 25: флаг освещенности (0 = неосвещенный, 1 = освещенный)
  • Биты 23..0: 24-битный цвет (0x00RRGGBB), который используется для заливки или модуляции, в зависимости от режима текстурирования и освещенности.

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

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

  • Биты 0-3: pageX, горизонтальный индекс текстурной страницы (0-15 включительно)
  • Бит 4: pageY, вертикальный индекс текстурной страницы (0 или 1)
  • Биты 5-6: ABR, режим полупрозрачности (0, 1, 2 или 3)
  • Биты 7-8: TP, цветовой режим текстуры (0, 1, или 2)

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

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

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

  • GP0 (1F801810h; BF801810h в KSEG1): используется для команд рендеринга, изменения атрибутов отрисовки и передачи данных в VRAM. Команды на этот порт накапливаются в FIFO;
  • GP1 (1F801814h; BF801814h в KSEG1): используется для управления выводом изображения и настройки DMA. Команды на этот порт срабатывают в обход FIFO.
  • GPUREAD (1F801810h; BF801810h в KSEG1): чтение из этого порта возвращает информацию о состоянии GPU
  • GPUSTAT (1F801814h; BF801814h в KSEG1): чтение из этого порта позволяет проверить, готовы ли данные для чтения из GPUREAD (бит 27)

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

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

  • GP0(01h): сброс текстурного кэша
  • GP0(02h): быстрое заполнение прямоугольной области. Координата x позиции прямоугольника округляется в меньшую сторону до ближайшего числа, кратного 16. Ширина прямоугольника округляется в большую сторону до значения, кратного 16 пикселям. Эта команда игнорирует атрибуты отрисовки
    • Слово 1 = Идентификатор команды и цвет BGR (CCBBGGRR)
    • Слово 2 = Позиция (координаты верхнего левого угла) прямоугольника (YYYYXXXX)
    • Слово 3 = Ширина и высота прямоугольника (HHHHWWWW)
  • GP0(80h): копирование из видеопамяти в видеопамять
  • GP0(A0h): копирование из системной памяти в видеопамять через PIO/DMA
  • GP0(C0h): копирование из видеопамяти в системную память

Управление

  • GP0(03h): задает параметры видеовывода
  • GP0(1Fh): запрос прерывания (IRQ1).

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

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

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

  • GP0(20h) - одноцветный непрозрачный треугольник
  • GP0(22h) - одноцветный полупрозрачный треугольник
  • GP0(28h) - одноцветный непрозрачный четырехугольник
  • GP0(2Ah) - одноцветный полупрозрачный четырехугольник

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

  • Слово 1 = Идентификатор команды и цвет BGR (CCBBGGRR)
  • Слово 2 = Вершина 1 (YYYYXXXX)
  • Слово 3 = Вершина 2 (YYYYXXXX)
  • Слово 4 = Вершина 3 (YYYYXXXX)
  • Слово 5 = Вершина 4 (YYYYXXXX) (если требуется).

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

  • GP0(24h) - текстурированный непрозрачный треугольник, текстура модулируется цветом
  • GP0(25h) - текстурированный непрозрачный треугольник, текстура используется напрямую
  • GP0(26h) - текстурированный полупрозрачный треугольник, текстура модулируется цветом
  • GP0(27h) - текстурированный полупрозрачный треугольник, текстура используется напрямую
  • GP0(2Ch) - текстурированный непрозрачный четырехугольник, текстура модулируется цветом
  • GP0(2Dh) - текстурированный непрозрачный четырехугольник, текстура используется напрямую
  • GP0(2Eh) - текстурированный полупрозрачный четырехугольник, текстура модулируется цветом
  • GP0(2Fh) - текстурированный полупрозрачный четырехугольник, текстура используется напрямую

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

  • Слово 1 = Идентификатор команды и цвет BGR (CCBBGGRR). Цвет игнорируется для команд, которые используют текстуру напрямую без модуляции.
  • Слово 2 = Вершина 1 (YYYYXXXX)
  • Слово 3 = Палитра и текстурные координаты 1 (ClutYYXX)
  • Слово 4 = Вершина 2 (YYYYXXXX)
  • Слово 5 = tpage и текстурные координаты 2 (tpageYYXX)
  • Слово 6 = Вершина 3 (YYYYXXXX)
  • Слово 7 = Текстурные координаты 3 (0000YYXX)
  • Слово 8 = Вершина 4 (YYYYXXXX) (если требуется)
  • Слово 9 = Текстурные координаты 4 (0000YYXX) (если требуются).

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

  • GP0(30h) - освещенный одноцветный непрозрачный треугольник
  • GP0(32h) - освещенный одноцветный полупрозрачный треугольник
  • GP0(38h) - освещенный одноцветный непрозрачный четырехугольник
  • GP0(3Ah) - освещенный одноцветный полупрозрачный четырехугольник

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

  • Слово 1 = Идентификатор команды и цвет 1 (CCBBGGRR)
  • Слово 2 = Вершина 1 (YYYYXXXX)
  • Слово 3 = Цвет 2 (00BBGGRR)
  • Слово 4 = Вершина 2 (YYYYXXXX)
  • Слово 5 = Цвет 3 (00BBGGRR)
  • Слово 6 = Вершина 3 (YYYYXXXX)
  • Слово 7 = Цвет 4 (00BBGGRR) (если требуется)
  • Слово 8 = Вершина 4 (YYYYXXXX) (если требуется).

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

  • GP0(34h) - освещенный текстурированный непрозрачный треугольник
  • GP0(36h) - освещенный текстурированный полупрозрачный треугольник
  • GP0(3Ch) - освещенный текстурированный непрозрачный четырехугольник
  • GP0(3Eh) - освещенный текстурированный полупрозрачный четырехугольник

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

  • Слово 1 = Идентификатор команды и цвет BGR (CCBBGGRR)
  • Слово 2 = Вершина 1 (YYYYXXXX)
  • Слово 3 = Палитра и текстурные координаты 1 (ClutYYXX)
  • Слово 4 = Цвет 2 (00BBGGRR)
  • Слово 5 = Вершина 2 (YYYYXXXX)
  • Слово 6 = tpage и текстурные координаты 2 (tpageYYXX)
  • Слово 7 = Цвет 3 (00BBGGRR)
  • Слово 8 = Вершина 3 (YYYYXXXX)
  • Слово 9 = Текстурные координаты 3 (0000YYXX)
  • Слово 10 = Цвет 4 (00BBGGRR) (если требуется)
  • Слово 11 = Вершина 4 (YYYYXXXX) (если требуется)
  • Слово 12 = Текстурные координаты 4 (0000YYXX) (если требуются).

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).

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

  • GP0(40h) - рисует одноцветный непрозрачный отрезок
    • Слово 1 = Идентификатор команды и цвет BGR (CCBBGGRR)
    • Слово 2 = Начальная точка отрезка (YYYYXXXX)
    • Слово 3 = Конечная точка отрезка (YYYYXXXX)
  • GP0(42h) - рисует одноцветный полупрозрачный отрезок. Параметры аналогичны GP0(40h)
  • GP0(48h) - рисует одноцветную непрозрачную полилинию
  • GP0(4Ah) - рисует одноцветную полупрозрачную полилинию
  • GP0(50h) - рисует освещенный непрозрачный отрезок
    • Слово 1 = Идентификатор команды и цвет начальной точки (CCBBGGRR)
    • Слово 2 = Начальная точка отрезка (YYYYXXXX)
    • Слово 3 = Цвет конечной точки отрезка (00BBGGRR)
    • Слово 4 = Конечная точка отрезка (YYYYXXXX)
  • GP0(52h) - рисует освещенный полупрозрачный отрезок. Параметры аналогичны GP0(50h)
  • GP0(58h) - рисует освещенную непрозрачную полилинию
  • GP0(5Ah) - рисует освещенную полупрозрачную полилинию

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

  • Слово 1 = Идентификатор команды и цвет первой точки (CCBBGGRR)
  • Слово 2 = Начальная точка (YYYYXXXX)
  • Слово 3 = Цвет следующей точки (00BBGGRR) (тольуо для освещенных полилиний)
  • Слово 3 или 4 = Следующая точка (YYYYXXXX)
  • Далее слова 3 и 4 могут повторяться. Полилиния завершается командой 55555555.

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

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

  • GP0(60h..7Fh)

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

  • GP0(E1h) - задает текстурную страницу, смешивание, прозрачность
  • GP0(E2h) - задает текстурное окно
  • GP0(E3h/E4h) - задают, соответственно, верхний левый и нижний правый углы области рисования
  • GP0(E5h) - задает смещение рисования (координаты, относительно которых задаются вершины полигонов)
  • GP0(E6h) -

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

  • GP1(00h) - сброс GPU. Экран выключается. DMA выключается. Левый верхний угол экранной зоны сбрасывается в X = 0, Y = 0. Горизонтальный интервал сбрасывается в X1 = 0x200, X2 = 0x200 + 256 * 10. Вертикальный интервал сбрасывается в Y1 = 0x010, Y2 = 0x010 + 240. Видеорежим сбрасывается в 320×200 NTSC (0). Все атрибуты отрисовки GP0 обнуляются
  • GP1(01h) - сброс командной очереди
  • GP1(02h) - сбрасывает флаг IRQ (бит 24 GPUSTAT)
  • GP1(03h) - включает/выключает экран. В выключенном состоянии экран черный. Ноль в младшем бите (000000) означает включение, единица (000001) означает выключение - не наоборот!
  • GP1(04h) - задает режим работы DMA. Значения параметра:
    • 000000 - DMA выключен
    • 000001 - незадокументированное значение
    • 000002 - передача из системной памяти в видеопамять
    • 000003 - передача из видеопамяти в системную память.
  • GP1(05h) - задает левый верхний угол экранной зоны видеопамяти. Координата X пакуется в биты 0-9, координата Y - в биты 10-18. Соответственно, X ограничена диапазоном 0..1023, Y - 0..511. Биты 19-23 не используются (должны быть заполнены нулями). Эти значения обычно меняются от кадра к кадру при использовании двойной буферизации
  • GP1(06h) - задает горизонтальный интервал видеосигнала (X1, X2). X1 пакуется в биты 0-11, X2 - в биты 12-23. Единица X1/X2 - не пиксель, а такт видеогенератора. X1 обычно задается равным 608 (0x260), что соответствует первой видимой точке на стандартном телевизоре. X2 вычисляется по формуле X1 + width * cyclesPerPixel, где width - ширина кадра, cyclesPerPixel - количество тактов видеогенератора на пиксель, которое зависит от выбранного горизонтального видеорежима. Например, для ширины 320: X1 = 608, X2 = 608 + 320 * 8. Из разницы X2-X1 GPU получает количество выводимых пикселей на строку изображения, округляя до значения, кратного 4 пикселям:
((X2 - X1) / cyclesPerPixel + 2) & ~3
  • GP1(07h) - задает вертикальный интервал видеосигнала (Y1, Y2). Y1 пакуется в биты 0-9, Y2 - в биты 10-19. Биты 20-23 не используются (должны быть заполнены нулями). Y1 и Y2 - номера строк относительно центра экрана: Y1 = centerY - height / 2, Y2 = Y1 + height. Центр экрана зависит регионального стандарта: NTSC - 136 (0x88), PAL - 163 (0xA3)
  • GP1(08h) - задает параметры видеорежима. Параметры передаются в битах 0-7. Биты 8-23 не используются (должны быть заполнены нулями)
    • Биты 0-1 - младшие два бита горизонтального режима (0=256, 1=320, 2=512, 3=640)
    • Бит 2 - вертикальный режим (0=240, 1=480)
    • Бит 3 - регион (0=NTSC, 1=PAL)
    • Бит 4 - битовая глубина цвета экранной зоны (0=15bit, 1=24bit)
    • Бит 5 - режим развертки (0=прогрессивная, 1=чересстрочная)
    • Бит 6 - старший бит горизонтального режима (0=256/320/512/640, 1=368)
    • Бит 7 - флаг реверса. Если он равен 0, то изображение нормальное, если 1 - то изображение будет зеркальным по горизонтали. Игнорируется в 15-битном цветовом режиме.
  • GP1(09h) - переключает режимы видеопамяти, разрешая GPU использовать второй банк адресов. Если бит 0 равен 1, то активен режим 1 MiB, если он равен 1, то активен режим 2 MiB. PlayStation имеет только 1 MiB видеопамяти, поэтому обращения к верхнему мегабайту будут уходить в открытую шину
  • GP1(10h) - выдает информацию о GPU. После передачи этой команды результат может быть немедленно прочитан из GPUREAD
    • Биты 0-1 - нули
    • Бит 2 - текстурное окно
    • Бит 3 - верхний левый угол экранной зоны видеопамяти
    • Бит 4 - нижний правый угол экранной зоны видеопамяти
    • Бит 5 - смещение рисования
    • Биты 6-7 - нули

Важный факт: в популярной книге «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.

gpu.1792073488.txt.gz · Последнее изменение: — gecko

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC0 1.0 Universal
CC0 1.0 Universal Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki