查询SPIR-V着色器中是否存在GLSL扩展

时间:2018-03-10 14:16:34

标签: glsl vulkan 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

我的问题是,如何使用glslang库在SPIR-V中实现相同的目标?我假设我需要编译同一个着色器的多个版本才能实现这个目的?或者有没有办法在存在扩展时条件化SPIR-V而不为两个版本生成两个二进制文件?

1 个答案:

答案 0 :(得分:2)

  

在常规GLSL中,我可以做类似的事情来有条件地启用GLSL扩展:

首先,不,你不能。并非GLSL的每个OpenGL扩展都暴露出这样的#define。例如,GL_ARB_shader_viewport_layer_array extension中没有任何地方可以找到要指定的定义。相比之下,GL_ARB_shader_group_vote extension确实指定了#define

其次,即使扩展名提供了#define,它仍然无效。因为只有在使用#extension指令激活扩展名时才会公开#define。所以你的例子永远不会让shader_viewport_layer_array工作。

如果您想要extension to be conditionally present,请使用#extension NAME : enable。如果实现不支持扩展,则不会得到它(您将在着色器日志文件中收到警告)。使用前面讨论的#define 检测扩展是否处于活动状态。

至于如何使用SPIR-V ...你。 SPIR-V是一种中间语言,而不是高级语言。期望SPIR-V是针对特定版本的主机环境编写的,包括扩展。如果您想要有条件地支持某些扩展而不是其他扩展,则必须为您打算支持的扩展组合生成多个SPIR-V着色器。

SPIR-V与#ifdef无关,因为它是一种中间语言。