Содержание

VRAM

Видеопамять PlayStation. Объем видеопамяти составляет 1 MiB (1024 KiB). VRAM не имеет отображения в системной памяти, доступ к ней осуществляется исключительно через команды GPU.

Цветовые режимы

Текстуры и буферы хранятся в видеопамяти в одном из поддерживаемых цветовых режимов:

Для вывода на экран поддерживаются только прямые 24-битный и 16-битный режимы. Для текстур поддерживаются 16-битный, 8-битный и 4-битный.

Значение бита прозрачности в пикселе текстуры (или в сплошном цвете примитива) зависит от ситуации:

Адресация

VRAM адресуется как двумерный буфер разрешением 2048×512 байт, что эквивалентно 1024×512 пикселей в 16-битном цветовом режиме. В левом верхнем углу этого прямоугольника обычно находятся буферы кадра (вверху первичный, под ним - вторичный).

Доступ к текстурам организован постранично. Текстурная страница - это логическая область размером 256×256 16-битных пикселей. GPU использует ее при текстурировании полигонов. Независимо от цветового режима, текстурные координаты имеют диапазон 0..255, поэтому один полигон не может напрямую адресовать текстуру большего размера. Это позволяет кодировать UV-координаты вершин всего двумя байтами.

Одна и та же текстурная страница физически занимает разный объем памяти, так как ширина страницы в байтах зависит от цветового режима текстуры:

Текстуры располагаются в VRAM с учетом того, что GPU адресует память 16-битными пикселями. Позиция текстуры (или CLUT) обычно зашивается в файл TIM, где задается 16-битными координатами tx и ty, где:

Эти координаты используются для загрузки данных в видеопамять командой GP0(A0h), но для чтения их напрямую использовать нельзя. При рисовании текстурированного полигона в GP0 отправляется значение tpage, 16-битное поле, которое кодирует положение страницы и параметры ее использования:

Если при загрузке изображения известны его координаты в VRAM (tx, ty) и цветовой режим, то искомое значение tpage получается следующим образом:

uint8_t pageX = tx / 64;
uint8_t pageY = ty / 256;
uint32_t tpage = pageX | (pageY << 4) | (abr << 5) | (tp << 7);

Если на одной странице располагаются несколько текстур, дополнительно вычисляется относительная позиция текстуры на странице (px, py):

uint8_t px = (uint8_t)(tx % 64);
uint8_t py = (uint8_t)ty;

При рисовании полигонов tpage определяет, из какой страницы считывать текстуру, а px+U и px+V для вершин указывают конкретный пиксель внутри страницы.