Восход солнца вручную.

Проект libps3rsx цветет и пахнет. Аккуратно прикручиваю ништяки. Радуюсь разному. Под катом – отчет о проделанной работе. 

SVN хостинг любезно предоставлен сайтом ps2dev.org, адрес репо: http://svn.ps2dev.org/listing.php?repname=ps3ware&path=%2Ftrunk%2Flibps3rsx%2F&rev=0&sc=0  Сайт правильный, пацанский, не сцыт разное размещать.

Наперво нам нужны текстуры. В любой игре 90% текстур имеют формат DXT, его и надо поддержать в первую голову. Сначала ищется DXT сжималка с самой свободной лицензией. Находится squish http://www.sjbrown.co.uk/?code=squish. Интегрируется сжималка очень просто, я дамплю сырой шмат данных на диск. В том виде, в котором данные будут лежать на видеокарточке. Перед данными помещается небольшая аннотация, texture desc, оно чуть похоже получается на DDS файлы. Загрузка текстуры выглядит примерно так – мапим файл в память, делаем memcopy в видеопамять. По texture desc строим кусок командного буфера, который собственно текстуру и устанавливает. Код довольно простой, кусок командного буфера можно прекомпилировать заранее, можно генерить на SPU. Можно делать разное, хочется дать одновременно пользователю свободу и предоставить дефолтный интерфейс, который грузит и устанавливает текстуру в 3 строчки. Выглядит оно примерно так: http://www.everfall.com/paste/id.php?4a4lnm0ojoq5  ( я уже отвык от чистого С, выходит местами странно и убого ).

 Общая идеология такая – если есть ресурс, то есть два уровня. Первый уровень – это тулзы ( часто с зависимостями на вендорские библиотеки ), которые готовят из “арта” бинарный шмат и маленькую аннотацию. Низкий уровень – ядро, сама библиотека работы с RSX, голые сишные функции по конструированию командного буфера. 

Маленькое лирическое отступление, про функцию mmap. Интересно, что отмапленный файл можно читать на SPU. В cell sdk от IBM есть даже такой примерчик, который копирует из файла в файл на SPU. C помощью DMA. Ясно, что слабо применимо, но по крайней мере забавно.

Следующая задача – поддержка вершинных и индексных буферов. Тут все просто – пишется опять набор функций на C, аналоги gl*Pointer, glDrawElement. Опять-таки можно заранее прекомпилировать куски командного буфера, можно писать в командный буфер на SPU. Вместе с геометрией залил в репо и кусок высокого уровня – базовый парсер коллады.  Оно ясно, что по уму надо геометрию на SPU обрабатывать, код у меня есть, но пока проект к таким ништякам не готов.

Следующая функциональность, к которой подступал не без трепета – шейдеры. Шейдеры – это ого! Шейдеры – это надо микрокод собирать. Благо есть NV расширения про вершинные и фрагментные программы, и оно фактически отражает бинарный код, благо добрые люди из Nouveau все расхачили.

 Формальный язык задается формальной семантикой. Семантика для вершинных програм была взята отсюда http://oss.sgi.com/projects/ogl-sample/registry/NV/vertex_program.txt Это шейдеры 1.1 на самом деле, 2.0 чуть сложнее, я решил от простого идти.

По формальной семантике можно построить парсер. Я давненько yacc использовал. Живо просмотрел, что придумали за последнее время. Ничего не придумали. boost::spirit вместе с antlr живо пошли нахрен. Старый конь борозды не испортит. А если два коня ( в нашем случае yacc и lex ) – то уж совсем хорошо, попрет шо твой трактор.

Два вечера, вуаля! Шейдеры в бинарном коде тулзой генерятся. И, как обычно, низкий уровень, который грузит шейдеры и константы устанавливает. Пока вершинные шейдеры, для пиксельных надо еще чуть поработать. 

А вот такое  

!!VP1.0
DP4 o[HPOS].x,  c[0], v[OPOS];
DP4 o[HPOS].y,  c[1], v[OPOS];
DP4 o[HPOS].z,  c[2], v[OPOS];
DP4 o[HPOS].w,  c[3], v[OPOS];
MOV o[TEX0],    v[TEX0];
END

компилится на раз, загружается как http://www.everfall.com/paste/id.php?5jr7vwo324i6 и работает как легкий ветерок.

 Вот так оно и происходит примерно. Внезапно оказалось – что низкий уровень работы с видеокарточкой – он тут, совсем рядом. И с наличием тулзов и оберток этот самый низкий уровень внезапно превращается в высокий. На котором можно делать игры. В нашем случае на PS3. Под линуксом в нашем случае. А если лицензия от Сони есть – то стоит подумать, зачем 10 девкитов покупать, если можно обойтись ритейловой консолью. Экономия примерно в два джипа для начальства.

PS. Пост должен быть заботливо украшен кусками кода, но everfall висит. Вставлю попозже. - Заработал. Вставил.

  • shodan

    > Пост должен быть заботливо украшен кусками кода, но

    Типа уже давно можно вставлять инлайновые куски в тело постов.

  • IronPeter

    Андрей, инлайн не всегда рулит :). Как показывает практика.

  • http://virtul.livejournal.com virtul

    Спасибо, жжошь как всегда.

    >Экономия примерно в два джипа для начальства
    В мемориз.

  • http://www.codygain.com neteraser

    > Экономия примерно в два джипа для начальства.
    Неа, там кажись есть совсем дешевый кит, который тоже может запускать (2к или 4к вроде).

    > зачем 10 девкитов покупать, если можно обойтись ритейловой консолью
    Как про кресло. Зачем покупать aeron chair, если можно обойтись piano-табуреткой?

  • IronPeter

    Хорошо, а что этот кит еще умеет, кроме как запускать? Без подколки. У меня нет никакой информации по официальным тулам.
    Я конечно согласен, что лучше быть богатым и здоровым чем бедным и больным.
    Но линукс окружение довольно-таки удобное для отладки и для всего. Отладчики, визуальные среды разработки. А опыт показывает, что при желании ( я бы назвал это любовью к платформе ) можно выстроить себе удобный tool chain. Хоть компилировать и отлаживать на плагинах к Visual Studio.
    Но не вопро – богатым и здоровым быть сильно хорошо.

    Ну и когда я играю на фортепиано – то сижу на табуретке конечно же :).

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

    http://www.dtf.ru/news/read.php?id=48860

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

    Окружение линукс для продакшена все равно не подойдет – оно у тебя займет половину памяти (если половину), игра тупо не взлетит. Все равно надо поднимать какую-то mini os (ну или там линукс обрезать, неважно), и поднимать PC-шный тулчейн с ремоут коннекшеном.

    Хуже, мягко говоря не факт, что все (или хотя бы половина, или хотя бы одна) существующих в ps3 sdk библиотек взлетят в линукс окружении. Как бы тупо, игру с libps3rsx не выпустишь, а libgcm не взлетит. И так много с чем наверняка. В итоге получаем, что большАя часть ps3 кода дублируется – про линукс и про ps3, тем самым обратно увеличивая стоимость разработки.

    Возможно я совсем не прав, но кажется – так.

  • IronPeter

    Два джипа – оно с учетом последнего снижения цен. ( Испугались линукс-боксов, вестимо :)).

    Окружение линукс для продкшена – отстой.

    Памяти оно занимает решительно мало, если грамотно настроить. Как дебаг-ядро фактически.

    А расскажи – почему с libgcm не взлетит. Интересно. Я тот gcm в глаза не видел. Расскажи, что помешает. Я тебе на сабченелы какие хочешь классы отмаплю. За пиво.

    Дублирования кода в упор не вижу.

  • Vespertinus

    Не знаю, зачем оно надо, но очень интересно :)

  • Aktion

    Не про тебя пишут тут?)
    http://feeds.feedburner.com/~r/qj/ps3/~3/193799173/108824

  • IronPeter

    Обо мне и других ковыряльщиках тоже.

  • http://nesnausk.org ReJ

    IronPeter: тест кит (тот что дешёвый) и дебажить может теперь – если с новой прошивкой.

    Zeux: точно, а почему libgcm не взлетит? Комманд-буффер в памяти собирать, не пофиг ли под чем?

  • http://nesnausk.org ReJ

    Ой блин сотрите мой пост :) ДТФ.ру линк посмотрел, там написано

  • IronPeter

    Пацаны коммиты не откатывают!