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

在SPIR-V着色器中查询是否存在GLSL扩展,glsl,vulkan,spir-v,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中实现同样的功能?我假设我需要编译同一着色器的多个版本来实现这一点?或者有没有一种方法可以在不为两个版

在常规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条件化为一个扩展的存在

在常规GLSL中,我可以这样做,有条件地启用GLSL扩展:

#if defined(GL_ARB_shader_viewport_layer_array)
    #extension GL_ARB_shader_viewport_layer_array : enable
    // Some other stuff here
#endif
首先,不,你不能。并不是每个OpenGL扩展ot GLSL都公开这样的定义。例如,在中的任何位置都找不到要指定的define。相比之下,确实指定了一个
#define

第二,即使扩展提供了一个#define,它仍然不起作用。因为#define仅在使用#extension指令激活扩展时才公开。因此,您的示例将永远无法使着色器\视口\层\阵列正常工作

如果需要,可以使用
#扩展名:enable
。如果实现不支持扩展,您将无法获得它(您将在着色器日志文件中得到警告)。您可以使用前面讨论的#define来检测扩展是否处于活动状态

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

SPIR-V与#ifdef没有等价物,这也是因为它是一种中间语言

在常规GLSL中,我可以这样做,有条件地启用GLSL扩展:

#if defined(GL_ARB_shader_viewport_layer_array)
    #extension GL_ARB_shader_viewport_layer_array : enable
    // Some other stuff here
#endif
首先,不,你不能。并不是每个OpenGL扩展ot GLSL都公开这样的定义。例如,在中的任何位置都找不到要指定的define。相比之下,确实指定了一个
#define

第二,即使扩展提供了一个#define,它仍然不起作用。因为#define仅在使用#extension指令激活扩展时才公开。因此,您的示例将永远无法使着色器\视口\层\阵列正常工作

如果需要,可以使用
#扩展名:enable
。如果实现不支持扩展,您将无法获得它(您将在着色器日志文件中得到警告)。您可以使用前面讨论的#define来检测扩展是否处于活动状态

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


SPIR-V没有与#ifdef等价的语言,这也是因为它是一种中间语言。

很公平,感谢您提醒我,我的代码是未定义的行为(尽管实际上它在数千台客户机器上的Windows、Mac和Linux上都能工作)。我想我现在对SPIR-V的最大问题是我们有一些专门化,这只是增加了它。基本上,我现在需要生成3倍的着色器(如果我还没有生成100k版本就可以了)。这很公平,感谢大家提醒我,我的代码是未定义的行为(尽管实际上它在Windows、Mac和Linux的数千台客户机上都能工作)。我想我现在对SPIR-V的最大问题是我们有一些专门化,这只是增加了它。基本上,我现在需要生成3倍的着色器(如果我还没有生成100k版本,那就好了)。