Примечание:
- (1) Компиляция на основе официальных данных и слухов
- (2) Скорее всего, наравне с DDR будет поддерживаться и DDR II.
- (3) Каждый текстурный модуль способен самостоятельно делать трилинейную выборку.
- (4) Согласно требованиям DX9, за один проход может быть использовано до 16 различных текстур с 8
предварительно вычисленными (интерполированными по поверхности треугольника) полными 4D текстурными
координатами. При этом, в пиксельном шейдере может быть сделано до 32 выборок конкретных значений
из этих текстур.
- (5) Может быть использовано до 8 текстур с предварительно вычисленными или интерполированными полными
текстурными координатами. В пиксельном шейдере может быть сделано до 16 выборок конкретных значений из
этих текстур.
- (6) Судя по всему, в железе будут реализованы возможности, превышающие требования DX для вершинных и
пиксельных шейдеров версии 2.0.
- (7) 16 скалярных плавающих процессоров объединяются по 2, 3 или 4 для обработки векторных величин. Т.е.
полные 4D векторные команды выполняются по 4 за такт, так же, как и на R300 или NV30, а скалярные
и 2D/3D векторные команды исполняются в большем числе, в зависимости от комбинации команд ждущих выполнения.
- (8) Закраска треугольников по блокам 8х8 для оптимизации кеширования и предварительного HSR на блочном
и пиксельном уровне.
- (9) Число параллельных 32 бит целочисленных процессоров для обработки пиксельных шейдеров. Процессоры
могут быть гибко переконфигурированы для поддержки того или иного формата вычислений,
например, целочисленных форматов R10G10B10A2 или R16G16B16 . Во втором случае число параллельно
обрабатываемых пикселей снизится вдвое (будут задействованы по два процессора на один пиксель). Кроме
того, есть важное ограничение - чипом может быть записано в буфер кадра (т.е. физически закрашено)
максимум 4 точки за такт. Из-за существенного числа процессоров и ограничений технологии .15 3Dlabs не
смогли поддержать формат с плавающей точкой, однако планируют сделать это в будущих чипах.
- (10) Судя по всему, реальное число полноценных текстурных блоков ниже - 16 или даже 8.
Архитектура P10
P10 обладает очень специфической архитектурой - фиксированные блоки много раз чередуются с программируемыми,
причем программируемые, как правило, организованы в виде широких массивов простых процессоров, гибко конфигурируемых
для исполнения тех или иных задач в группы.
Приведем крупномасштабную блочную схему P10:
В наличии VGA совместимое графическое ядро, два CRTC, а также специальный цифровой интерфейс для
импорта (захвата) видеоданных.
Интересной чертой, полезной для профессионального применения является способность P10 одновременно исполнять
параллельные потоки команд от разных приложений. За эту возможность отвечает командный процессор:
который не только дирижирует 3D конвейером, организуя некий графический аналог "многозадачности" (на
основе переключения контекстов), распространенной в современных CPU, но и выполняет приоритетные команды,
требующие немедленной реакции "вне очереди", такие, как переключение видеостраниц и пр.
P10 поддерживает так называемое виртуальное текстурирование, самостоятельно управляя блочным кешированием
больших текстур в локальной памяти ускорителя:
и вновь налицо четкая аналогия с современными CPU, снабженными MMU с поддержкой виртуальной памяти
на основе страниц. Здесь роль страниц играют прямоугольные блоки текстур, кешируемые в локальной памяти
ускорителя. Подкачка текстур через AGP DIME или PCI DMA осуществляется чипом автоматически, по мере
надобности. Таким образом, мы получаем не только эффективное кеширование больших наборов текстур, но
и важную для профессиональной графики возможность работать с отдельными текстурами, размер которых
может превышать объем локальной памяти ускорителя (!).
Теперь, давайте посмотрим на полную схему трехмерного графического конвейера P10, отвечающего за
построение трехмерных изображений:
Как обычно в трехмерной графике, наблюдается четкая последовательность поточного прохождения данных через функциональные блоки ускорителя.
Вначале команды попадают в вершинный процессор:
Способный, в отличие от прочих распространных ныне программируемых чипов, не только считывать, но и
записывать в память обработанные параметры вершин. Подобная гибкость позволяет запрограммировать практически
любые алгоритмы тесселяции сплайновых поверхностей или других представлений HOS и SS (Subdivision
Surfaces), включая N-Patches. Интересно, что вершинный процессор способен считывать не только значения
вершин и их атрибутов, но и значения текстур, что позволяет реализовать различные алгоритмы пертурбации и
генерации геометрии на основе текстурных карт высот, нормалей и других считываемых из текстур значений.
Характерный пример подобных алгоритмов - уже не раз описанный нами DM (Displacement Mapping). В этом
плане совместимость P10 с DX9 беспокойства не вызывает. Интересно, что в отличие от NVIDIA, MATROX и ATI,
в наличии не 4 векторных процессора, а 16 скалярных. Специальный блок (VP Manager) дирижирует этими
процессорами на основе команд вершинного шейдера, объединяя их при необходимости для векторной обработки
двух, трех или четырехмерных значений. По сравнению с общепринятыми четырьмя векторными процессорами,
подобное решение гарантирует равную или превосходящую производительность. Разумеется, при условии одинаковой
частоты и сходной производительности выполняющих атомарные операции АЛУ.
Далее полученные в результате работы массива вершинных процессоров координаты вершин и их атрибуты
отправляются на закраску. Вначале выделенные аппаратные блоки отбрасывают обратные грани и выходящие за
пределы области видимости треугольники (см. также общую схему, блоки Cull и Clip):
После отбрасывания треугольников, они попадают на установку (Setup) и разбиваются на тайлы 8х8 для
последующей растеризации. За это вновь отвечают выделенные аппаратные блоки - подобным подходом разумного
чередования программируемых и фиксированных блоков пропитан весь P10.
После разбиения на регионы (тайлы) закраска каждого тайла будет проходить по следующему сценарию:
Вначале проверяется видимость региона в целом и его отдельных пикселов, затем выполняется выборка необходимых значений
текстур, затем вычисляются результирующие значения пикселей. Давайте посмотрим на этот процесс более
подробно.
Вот так происходит раннее определение необходимости закрашивать блоки и отдельные пикселы (см. также
общую схему):
Желтым кружочком обозначена очередь тайлов (фрагментов) 8х8, направляемых на растеризацию. В
наличии специальные аппаратные блоки, которые определяют видимость - вначале каждого тайла, а затем
и отдельных его пикселов, считывая значения глубины и буфера шаблонов и проводя необходимые сравнения.
Далее, уже отдельные видимые пикселы отправляются в очередь на закраску.
Закраска выполняется параллельно для 64 пикселов, т.е. вплоть до целого блока 8х8 (!). Каждый из 64 пикселов
проходит следующий путь через фиксированные и программируемые аппаратные блоки:
Программируемыми являются плавающий процессор для генерации координат (Coordinate) и целочисленный
пиксельный процессор (Shader). Выбирающие и фильтрующие текстуры блоки Load и Filter реализованы
аппаратно и способны выполнять билинейную и трилинейную фильтрацию. Но при необходимости их
результаты могут возвращаться в процессор генерации координат, видимо, в том числе и для организации
анизотропной фильтрации или более сложных методов выборки текстур. Разумеется, имея программируемый
процессор для генерации текстурных координат, мы можем, в том числе, работать и с объемными текстурами
и с кубическими или сферическими картами среды. Напомним, что, к сожалению, пиксельный процессор является
целочисленным, и это не позволяет ему быть совместимым с пиксельными шейдерами версии 2.0 из DX9.
И наконец, после вычисления финального значения, как результата пиксельного шейдера, оно отправляется в один
из специальных программируемых конвейеров:
Которые позволяют реализовывать произвольные методы заполнения буфера кадров, в том числе и различные
методы AA и мультисамплинга, а также запись результатов рендеринга сразу в несколько буферов.
Напоследок, прежде чем приступить к тестам производительности, приведем список поддерживаемых текущими
драйверами возможностей DirectX 8:
- Размер текстур - до 2048x2048, возможны неквадратные текстуры
- Максимальная степень анизотропии - 8
- Максимальное число источников света - 16
- Максимальное число текстур за один проход - 8
- Число плоскостей отсечения - 6
- Максимальный размер спрайтов - 127
- Максимальное число примитивов за один вызов - 1073741823 (много)
- Размер вершинного буфера - 65536
- Максимальное число потоков вершин - 8
- Версия вершинных шейдеров - 1.1
- Число констант вершинного шейдера - 128
- Версия пиксельных шейдеров - 1.2
- Максимальное значение пиксельного шейдера - 8
- Режимы мултисамплинга: нет, 2, 4, 8 сэмплов
- Форматы итогового буфера:
- D3DFMT_A8R8G8B8
- D3DFMT_X8R8G8B8
- D3DFMT_R5G6B5
- D3DFMT_X1R5G5B5
- D3DFMT_A1R5G5B5
- Форматы буфера глубины:
- D3DFMT_D32
- D3DFMT_D24S8
- D3DFMT_D16
- D3DFMT_D24X8
- Форматы текстур:
- D3DFMT_A8R8G8B8
- D3DFMT_X8R8G8B8
- D3DFMT_R5G6B5
- D3DFMT_X1R5G5B5
- D3DFMT_A1R5G5B5
- D3DFMT_A4R4G4B4
- D3DFMT_A8
- D3DFMT_L8
- D3DFMT_A8L8
- D3DFMT_A4L4
- D3DFMT_V8U8
- D3DFMT_L6V5U5
- D3DFMT_X8L8V8U8
- D3DFMT_Q8W8V8U8
- D3DFMT_DXT1
- D3DFMT_DXT2
- D3DFMT_DXT3
- D3DFMT_DXT4
- D3DFMT_DXT5
- Форматы кубических текстур:
- D3DFMT_A8R8G8B8
- D3DFMT_X8R8G8B8
- D3DFMT_R5G6B5
- D3DFMT_X1R5G5B5
- D3DFMT_A1R5G5B5
- D3DFMT_A4R4G4B4
- D3DFMT_DXT1
- D3DFMT_DXT2
- D3DFMT_DXT3
- D3DFMT_DXT4
- D3DFMT_DXT5
- Форматы объемных текстур:
- D3DFMT_A8R8G8B8
- D3DFMT_X8R8G8B8
- D3DFMT_R5G6B5
- D3DFMT_X1R5G5B5
- D3DFMT_A1R5G5B5
- D3DFMT_A4R4G4B4
- D3DFMT_A8
- D3DFMT_L8
- D3DFMT_A8L8
- D3DFMT_A4L4
- D3DFMT_DXT1
- D3DFMT_DXT2
- D3DFMT_DXT3
- D3DFMT_DXT4
- D3DFMT_DXT5
- Режимы фильтрации обычных текстур:
- D3DPTFILTERCAPS_MINFPOINT
- D3DPTFILTERCAPS_MINFLINEAR
- D3DPTFILTERCAPS_MINFANISOTROPIC
- D3DPTFILTERCAPS_MIPFPOINT
- D3DPTFILTERCAPS_MIPFLINEAR
- D3DPTFILTERCAPS_MAGFPOINT
- D3DPTFILTERCAPS_MAGFLINEAR
- D3DPTFILTERCAPS_MAGFANISOTROPIC
- Режимы фильтрации кубических текстур:
- D3DPTFILTERCAPS_MINFPOINT
- D3DPTFILTERCAPS_MINFLINEAR
- D3DPTFILTERCAPS_MIPFPOINT
- D3DPTFILTERCAPS_MIPFLINEAR
- D3DPTFILTERCAPS_MAGFPOINT
- D3DPTFILTERCAPS_MAGFLINEAR
- Режимы фильтрации объемных текстур:
- D3DPTFILTERCAPS_MINFPOINT
- D3DPTFILTERCAPS_MAGFPOINT
В общем и целом - все на уровне, возможность использовать до 16 источников света и 8 текстур за проход
выглядит привлекательно. Разумеется, поддерживается полный спектр операций с буфером шаблонов и полный
набор режимов проверки глубины. Удивляет только отсутствие какой-либо (даже билинейной) фильтрации объемных
текстур, но, возможно, это вопрос драйверов. Как бы там ни было, в пределах DX8 реализованы все необходимые
базовые возможности, в том числе превышающие NV25. Ясно что с DX9 ситуация будет не столь безоблачна, хотя бы
из-за пиксельных шейдеров, однако сказать что-либо точно можно будет только с выходом DX9 драйверов
для P10.
Напоследок приведем список поддерживаемых на данный момент OpenGL расширений:
|