В документации написано, что в шейдерах допускается использование только резидентных хендлов, так как «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?
Фикс проблем вне-экранного рендеринга я уже запилил в двигло. Сейчас хочется разобраться, почему с ним всё оки, а без него — раком.