PS3 hands-on experience


кликабельно

crossposted to zeux.livejournal.com.

Как прекрасно, когда новый runtime – lean & mean. Нагромождения стейтов превратились в удобные и быстрые state objects, дорогие по разным причинам установки шейдерных констант завернули в constant buffers. Потерь устройства нет, вся память – полностью виртуализирована. Depth-текстуры – поддерживаются официально. Если текстура скажем формата A8R8G8B8, то каждый компонент можно рассматривать как unsigned int, как fixed point, как signed int, etc. Ну и конечно – отлично, когда наконец-то есть возможность генерировать геометрию прямо на GPU! Не говоря уже о легализации хака R2VB.


Все это отлично, но… Почему-то опять, как и в случае со всеми любимым языком, развитие идет в несколько странном направлении. Прежде чем делать новые фичи, надо, мне казалось, починить все старые?

Первое, что я делаю на другой платформе – пишу аллокатор видеопамяти. Мне дали кусок сырой памяти, большой кусок. Что я с ним делаю – мое личное дело, в общем-то. Откусывающий последовательные куски – для простых демок, которые целиком помещаются в память без изысков – и для per frame аллокаций, если понадобится в игре. Разбивающий на фиксированные блоки – для streamed контента. С free list и произвольным алгоритмом фиттинга – для буферов. Это всего лишь кусок памяти – почему я должен относиться к нему иначе, чем к системной?

На другой платформе у меня нет толстого и непонятного рантайма. У меня есть пушбуфер, и пачка функций для того, чтобы в него писать. Хуже – у меня есть реализация большинства функций (по крайней мере, всех часто встречающихся). Инлайн, например. Проблемы DIP cost по причине толстого рантайма меня по этому поводу не волнуют. Проблемы флаша command buffer в неожиданных местах меня волнуют еще меньше – флаш делаю я, сам. Флаш из-за переполнения – ну, очевидно, размер push buffer можно контролировать!

На другой платформе у меня нет сломанных абстракций – occlusion query, которые при попытке узнать, готов ли результат, делают флаш (я о ARB occlusion query, кому интересно – почитайте спецификации ARB occlusion query и NV occlusion query, и различия между ними; я понимаю, что это против тех, кто пишет while (!occlusion_query.has_result) Sleep(10);, но я-то тут причем?..), текстуры, внутреннее содержимое которых так сильно запрятано внутрь, что я даже не могу быстро залить текстуру в видеопамять! (загрузив ее из файла, в котором она уже swizzled, например), буферы, в которые не залить по-человечески динамические данные… Проблемы с R2VB тоже отсутствуют как класс – это просто память, это моя память, хочу – отрисую квад в эту область, хочу – буду считать, что вот этот кусок памяти – VB, а этот – IB, и буду рисовать… Про depth текстуры можно уже не говорить? :)

На другой платформе у меня нет constant buffers, которые работают не совсем понятно как, у меня нет неочевидных трейдоффов (что быстрее, читать константы из constant buffer, используя обычный HLSL синтаксис? или читать с помощью Load? Или использовать tbuffer? Или хранить константы в текстурах?), у меня нет фич, которые неюзабельны by design, потому что их включение почему-то просаживает производительность в 4 раза, у меня нет integer арифметики в шейдерах, 1-битовых текстур, массивов из текстур, и нет возможности выбирать семантики параметров произвольно.

На какой платформе я хотел бы работать?..

  • CEMEH

    Ну, PC это не фиксированная платформа, из этого все следует. Оверхед на абстракцию в чистом виде, только на этот раз не для того чтобы проще думать, а чтобы поддерживать разнообразное железо.

  • http://zeux.livejournal.com/ Zeux

    Ну, не совсем так все же – там не только оверхед на абстракцию, а непонятно что местами в DX10 – но только разве это что-то меняет? ;)

  • look4awhile

    нефига не в чистом виде
    местами кривая обстракция – типа occlusion query, которой нужен CPU
    местами – нездоровый оптимизм, типа HLSL
    +кривые руки авторов драйверов

  • Sergei_am

    А почему occlusion query, которой нужен CPU – ето плохо? Или я не понял?

  • look4awhile

    потому что аппаратно работает вот так

    рисуем occluders
    сбрасываем pixel counter
    рисуем occlusion
    пишем pixel counter по какому-то адресу X, какой задаём внешне
    включаем conditional rendering по адресу X
    если там 0, то всякий rendering становится disabled
    если там не ноль, то enabled
    рисуем geometry (но она не нарисуется, если disabled)
    выключаем conditional rendering

    CPU в таком раскладе не участвует никак
    адресов X – их очень много, т-е можно прям мешу в статус bool32 m_isVisible его писать
    вот и так

  • Sergei_am

    Да не, все понятно, predication rendering.
    Но иногда ведь охота (т.е. опционально иметь ету фичу), чтобъ CPU знало об OC, с запозданием если надо и т.д.
    Скажем когда в сцене сильнъй оклюжн и вот мъ решили не кидать всю сцену в cb, ибо она очень большая (т.е. ее никогда не видно всю).

  • CEMEH

    Боря, вот ты не любишь PC, и мне приходится опять защищать родное.
    Occlusion Query – это не кривая абстракция, просто она не Conditional Rendering. В DX10 вот уже Conditional Rendering есть, т.е. никакая кривость абстракции не мешает его сделать. Почему сразу его не было – я не знаю. Может, мы не допилили, может, IHV. Скорее второе.

    HLSL – как бы всегда опционален. Т.е. да, разумеется, abstraction penalty в нем есть. Но опциональный, что далеко не худший вариант.

    Проблема скорее в low-level фичах, шибко завязанных на внутрении детали. Их приходится экспозить в DX в более-менее универсальной манере, да еще и защищенной от misuse. Вот здесь и приходит abstraction. И пинает.

  • look4awhile

    PC не то чтобы активно не люблю, просто слегка раздражает.

    а какая в DX10 альтернатива HLSL-ю?

  • http://zeux.livejournal.com/ Zeux

    > а какая в DX10 альтернатива HLSL-ю?
    Сделать спецификацию на asm (ну, она как бы частично есть, в том асме, который показывает компилятор, но вроде не достаточно полная – вопросы declaration input-ов/output-ов, мб еще что-то), отреверсинжинирить формат шейдерных токенов (public описания нет, и он отличается от D3D9, причем вроде бы сильно), написать ассемблер.

  • look4awhile

    мне больше нравится альтернатива “не трогать” покамест
    торопиться некуда, до DX10-only игр ещё несколько лет жить можно