Запросить наличие расширения GLSL в шейдере SPIR-V
В обычном GLSL я могу сделать что-то вроде этого, чтобы условно включить расширение GLSL:
#if defined(GL_ARB_shader_viewport_layer_array)
#extension GL_ARB_shader_viewport_layer_array : enable
// Some other stuff here
#endif
У меня вопрос, как я могу добиться того же в SPIR-V с помощью библиотеки glslang? Я предполагаю, что мне нужно будет собрать несколько версий одного и того же шейдера для достижения этой цели? Или есть способ обусловить SPIR-V существованием расширения без генерации двух двоичных файлов для двух версий?
1 ответ
В обычном GLSL я могу сделать что-то вроде этого, чтобы условно включить расширение GLSL:
Прежде всего, нет, вы не можете. Не каждое расширение OpenGL GLSL предоставляет такой #define. Например, нигде в расширении GL_ARB_shader_viewport_layer_array вы не найдете определения, которое должно быть указано, чтобы быть там. Напротив, расширение GL_ARB_shader_group_vote определяет #define
,
Во-вторых, даже если расширение предоставляет #define, это все равно не сработает. Потому что #define доступен только если вы активируете расширение с помощью директивы #extension. Таким образом, ваш пример никогда не даст работать shader_viewport_layer_array.
Если вы хотите, чтобы расширение присутствовало условно, вы используете #extension NAME : enable
, Если реализация не поддерживает расширение, вы не получите его (вы получите предупреждение в файле журнала шейдера). Вы определяете, активно ли расширение, с помощью #define, обсуждавшегося ранее.
Что касается того, как сделать это с SPIR-V... вы не делаете. SPIR-V - это промежуточный язык, а не язык высокого уровня. Ожидается, что SPIR-V написан для конкретной версии среды хоста, включая расширения. Если вы хотите условно поддерживать некоторые расширения, а не другие, вам нужно сгенерировать несколько шейдеров SPIR-V для тех комбинаций расширений, которые вы намереваетесь поддерживать.
SPIR-V не имеет эквивалента #ifdef, опять же, потому что это промежуточный язык.