LINUX.ORG.RU

Объясните про ARB_bindless_texture у AMD (и не только)

 , , ,


1

2

В документации написано, что в шейдерах допускается использование только резидентных хендлов, так как «Conceptually, image data being resident means that it lives within GPU-accessible memory directly», а нерезидентные хэндлы текстур, мол, не доступны ГПУ-шке напрямую. Однако на AMD Raven, AMD Carrizo, AMD Iceland (и я полагаю, что на любых поддерживаемых драйвером radeonsi) при использовании в шейдерах нет разницы является хендл резидентным или нет. За одним исключением — на AMD Raven при попытке вне-экранного рендеринга (с использованием FBO) в резидентную текстуру сцены, эту текстуру использующей (есть подозрение, что даже если эту текстуру не использовать, поведение не изменится — проверю завтра (6 октября)) случается GPU Hang. В случае, если перед рендерингом в текстуру отобрать у последней резидентность и вернуть лишь после завершения вне-экранного рендеринга, хэнга не случится.

У «зелёных» всё ещё интереснее — на GT 650M при попытке чтения в шейдерах текстуры через нерезидентный хендл, возвращается vec4(0.0). При этом всё работает корректно, если хендлы резидентные. При попытке устроить «Уроборос» — рисовать в текстуру сцену, использующую эту текстуру через резидентный хендл, она (текстура) будет мерцать (flickering). Если перед отрисовкой отбирать резидентность у хендла, фликеринг пропадает.

Вопросы к спецам 3D графики ЛОР-а — Хэнг при «Уроборосе» на Raven — это баг? Фликеринг при уроборосе на GT 650M — это баг? Является ли рендеринг сцены в текстуру с резидентным хендлом корректным поведением для программы? А использование этого хендла в процессе рендеринга сцены? Что значит резидентность хендла для radeonsi? А для NVIDIA? И в конце концов, какого чёрта происходит?

UPD: Хэнг на Raven происходит даже если хэндл текстуры цели вне-экранного рендеринга нигде не используется, а просто есть.

UPD2: Главные вопросы: Является ли рендеринг сцены в текстуру с резидентным хендлом корректным поведением для программы? А использование этого хендла в процессе рендеринга сцены? Что значит резидентность хендла для radeonsi? А для NVIDIA?

Фикс проблем вне-экранного рендеринга я уже запилил в двигло. Сейчас хочется разобраться, почему с ним всё оки, а без него — раком.

★★★★

У «зелёных» всё ещё интереснее

у нвидии много интересного

https://www.khronos.org/opengl/wiki/Common_Mistakes#Render_To_Texture
читай «Warning: NVIDIA's OpenGL driver has a known issue with using incomplete textures. » весь варнинг

пара моих «около багов»
https://www.shadertoy.com/view/lt3fR8
https://www.shadertoy.com/view/MttcW2
https://www.shadertoy.com/view/4lVcD3
https://www.shadertoy.com/view/MdVyzc

и вся секция https://www.shadertoy.com/results?query=tag=bug в твоем распоряжении

При попытке устроить «Уроборос» — рисовать в текстуру сцену, использующую эту текстуру через резидентный хендл, она (текстура) будет мерцать (flickering)

https://www.shadertoy.com/view/MdVyzc :)
https://www.shadertoy.com/view/XsdyWj (поводи мышкой)

Вопросы к спецам 3D графики ЛОР-а — Хэнг при «Уроборосе» на Raven — это баг? Фликеринг при уроборосе на GT 650M — это баг? Является ли рендеринг сцены в текстуру с резидентным хендлом корректным поведением для программы? А использование этого хендла в процессе рендеринга сцены? Что значит резидентность хендла для radeonsi? А для NVIDIA?

если работает, значит не баг, пофиксишь когда перестанет работать

я не пользовался тем о чем ты говоришь, не скажу больше гугла

И в конце концов, какого чёрта происходит?

добро пожаловать в реальный мир xD

missxu ()
Ответ на: комментарий от missxu

При попытке устроить «Уроборос» — рисовать в текстуру сцену, использующую эту текстуру через резидентный хендл, она (текстура) будет мерцать (flickering)

может быть еще вот это (если процессор Интел и win7)
https://www.shadertoy.com/view/MlGcD3 (смотри видео что у меня тут происходит(поясню, pow() не может быть <1(черного быть не может) на винде в браузере, черный вылазит из за тех эксплоитов в процессоре)

missxu ()
Ответ на: комментарий от missxu

если работает, значит не баг, пофиксишь когда перестанет работать

Так мне слать багрепорт или нет? Сегодня забирание резидентности работает на amdgpu и nvidia, но как же другие вендоры?

добро пожаловать в реальный мир xD

OpenGL боль. Пора учить Vulkan.

robus ★★★★ ()
Ответ на: комментарий от missxu

может быть еще вот это (если процессор Интел и win7)

Собрать Kawaii3D с его рендерер-плагином Misaka3D под Windows, да ещё и тестировать чего-то там я ещё не скоро осилю.

Проц Core i7 3600QM, видюшка GT 650M, ОС — мой верный арчик на портативном SSD. Драйвер NVIDIA 410.57, если это важно.

robus ★★★★ ()
Ответ на: комментарий от robus

OpenGL боль. Пора учить Vulkan.

но как же другие вендоры?

действительно какже, опенгл намного более «кросплатформенен»

missxu ()

Хэнг при «Уроборосе» на Raven — это баг?

Хэнг наверно при любом раскладе баг. Если у тебя есть четкий алгоритм как этого добиться то багрепорт будет хорошим и больше шансов что починят. Репортить в фридесктоповскую бегзиллу с на компонет radeonsi https://bugzilla.freedesktop.org/.

По поводу «Уробороса» может на ирц канале спросить? irc://chat.freenode.net#dri-devel

Behem0th ★★★★★ ()

Если что-то глючит или тормозит, значит это никто не использует, там такого полно. Используй что используют все.

anonymous ()
Ответ на: комментарий от Behem0th

Хэнг наверно при любом раскладе баг.

Т.е. хэнг в случае использования мусора в качестве хендла текстуры — тоже баг?

Usually with OpenGL, if you do something wrong, you get either an OpenGL Error or undefined behavior. With bindless textures, if you do something wrong, the GPU can crash or your program can terminate. It might even bring down the whole OS. Things to keep in mind:

  • When converting an integer handle into a sampler/image variable, the type of sampler/image must match with the handle.
  • The integer values used with handles must be actual handles returned by the handle APIs, and those handles must be resident when they are being used. So you can't perform «pointer arithmetic» or anything of the like on them; treat them as opaque values that happen to be 64-bit unsigned integers.

Даже несмотря на то, что говорит кронос (а он разрешает драйверу на*нуть целиком ОС при неправильном использовании, и в явном виде говорит, что мусор вместо хендлов ата-та)?

2 главных вопроса: «Является ли рендеринг сцены в текстуру с резидентным хендлом корректным поведением для программы? А использование этого хендла в процессе рендеринга сцены?»

robus ★★★★ ()
Ответ на: комментарий от anonymous

Ита диверсия хуанга!

Ога. Разрешившего в документации расширения грохать ОС целиком. Ведь ARB_bindless_texture лично хуанг писал.

robus ★★★★ ()
Ответ на: комментарий от anonymous

По сравнению с ARB_bindless_textures — передача текстур в шейдер через контекст тормозит. А если написать так, что тормозить не будет, будут драконовские ограничения.

robus ★★★★ ()
Ответ на: комментарий от missxu

важно есть или нет «патчей в ядре» от спектрума/прочего
без этих патчей может быть что угодно

Ядро 4.18.12. Там патчей от спектрума, ЕМНИП, нет. Зато есть патчи от spectre и meltdown :)

robus ★★★★ ()
Ответ на: комментарий от robus

По сравнению с ARB_bindless_textures — передача текстур в шейдер через контекст тормозит.

девелоперы вулкана сказали по этому поводу, на одной из лекций:

пишите все 100500 текстур в одну максимально_возможного размера
и эту текстуру уже шлите всем шейдерам (на вулкане это 16к текстуры размером даже гигабайты, помоему если не больше)

а в OpenGL иметь более 10 обращений к текстуре из шейдера-уже «перебор»

и совет OpenGL фак-а, разбивайте такие шейдеры на несколько(первый 10, второй 10, суммарно 20) будет работать быстрее чем один на 20 обращений

missxu ()
Ответ на: комментарий от Behem0th

Репортить в фридесктоповскую бегзиллу с на компонет radeonsi https://bugzilla.freedesktop.org/

Да, наверное всё-таки зарепорчу. Даже если хэнг в данном случае происходит в полном соответствии с описанием расширения, он может оказаться частью настоящего бага, который может вызывать где-нибудь в vulkan (например) хэнг при совершенно «законопослушном» поведении программы. Но просветление не достигнуто — мой фикс хэнга в Misaka3D (перед рендерингом в текстуру делать её хэндл нерезидентным) — это уродливый костыль, или именно то поведение, которое ожидается от корректной программы? Я бы решил, что костыль, но фликеринг на NVIDIA, пропавший после фикса...

robus ★★★★ ()
Ответ на: комментарий от missxu

а в OpenGL иметь более 10 обращений к текстуре из шейдера-уже «перебор»
и совет OpenGL фак-а, разбивайте такие шейдеры на несколько(первый 10, второй 10, суммарно 20) будет работать быстрее чем один на 20 обращений

Проблема в оверхеде биндинга текстур. Как говорят драйверы GPU: «И пусть весь мир подождёт — я бинжу текстуры».

robus ★★★★ ()
Ответ на: комментарий от missxu

девелоперы вулкана сказали по этому поводу, на одной из лекций: пишите все 100500 текстур в одну максимально_возможного размера и эту текстуру уже шлите всем шейдерам (на вулкане это 16к текстуры размером даже гигабайты, помоему если не больше)

Мдэ. Разные требуемые внутренние форматы — не, не слышал. Хотя их позиция понятна — быстрые текстуры хочется, тащить опасную низкоуровневую чебуету, меняющую свое поведение, в зависимости от чипа (не драйвера — чипа) и теоретически способную поставить раком целиком ОС, в публичный API — нет.

robus ★★★★ ()
Последнее исправление: robus (всего исправлений: 1)
Ответ на: комментарий от robus

Разные требуемые внутренние форматы

Не нужно так делать. Конверть заранее всё в один формат и пихай в один буфер, адресуй по смещениям в нём.

anonymous ()
Ответ на: комментарий от anonymous

Текстура, в которую рендерится HDR, текстура, в которую рендерится DepthMap источника освещения, кубический EnvMap и карта высот ландшафта к какому единому формату должны быть приведены?

robus ★★★★ ()
Ответ на: комментарий от robus

эм?

у тебя HDR/высоты/ландшафт ведь дальше шейдер обрабатывает

ну теоретически(я делал, в другой задаче) можно хоть в 1 текстуру все 4 запихнуть, кодируя каждый цвет на один канал, через GL_FLOAT

и эту текстуру/фреймбуфер таскать по всем шейдерам, и в шейдерах декодировать нужный канал в цвет

костыль еще тот конечно

но чето я сомневаюсь что у тебя все так упирается в эти 4 текстурки, этож пол фпса добавляет если их вкл/выкл(для теста)

missxu ()
Ответ на: комментарий от robus

Да, наверное всё-таки зарепорчу.

Моя логика в том что месу АМД пилит официально. На грамотно составленный багрепорт(как в твоем случае) будет дан быстрый ответ от АМД разработчика. Который и прояснит баг это или нет. Просто мне на ум не приходит более простой способ получить более простой/официальный ответ. А так считай что даже задокументировано будет.

Даже несмотря на то, что говорит кронос (а он разрешает драйверу на*нуть целиком ОС при неправильном использовании, и в явном виде говорит, что мусор вместо хендлов ата-та)?

Я не разработчик а пользователь, и с моей точки зрения не должно быть возможности программно навернуть целиком ось.

Behem0th ★★★★★ ()
Ответ на: комментарий от Behem0th

Так венда и не падает, она ресетит девайс и дальше едет. Генерировать ошибки десятками тысяч для венды норма.

anonymous ()
Ответ на: комментарий от anonymous

У вас неправильные программы от хуанга! Правильные программы амуде не роняют!

anonymous ()
Ответ на: комментарий от robus

prevent optimizing out

А разве компилер такое делает? Он же не знает, что эта функция делает, тк она внешняя из библиотеки. Выкинуть он может только код полностью находящийся в компиляемых файлах или свои builtins.

anonymous ()
Ответ на: комментарий от anonymous

А разве компилер такое делает? Он же не знает, что эта функция делает, тк она внешняя из библиотеки. Выкинуть он может только код полностью находящийся в компиляемых файлах или свои builtins.

В норме нет, но у меня на работе мс студия 2015 однажды уже «оптимизировала наружу» вызов функции с side эффектами. Так что просто на всякий случай. Да и ещё варнинг глушит.

robus ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.