查询SPIR-V着色器中是否存在GLSL扩展
Query existence of GLSL extension in SPIR-V shader
在常规 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 进行条件化?
In regular GLSL I can do something like this to conditionally enable a GLSL extension:
首先,不,你不能。并非每个 GLSL 的 OpenGL 扩展都公开这样的#define。例如,GL_ARB_shader_viewport_layer_array extension will you find that define to be specified to be there. By contrast, the GL_ARB_shader_group_vote extension 中的任何地方都没有指定 #define
.
其次,即使扩展提供了#define,它仍然不起作用。因为 #define 只有在您使用 #extension 指令 activate 扩展时才会公开。所以你的例子永远不会 shader_viewport_layer_array 工作。
如果您想要 extension to be conditionally present,请使用 #extension NAME : enable
。如果实现不支持扩展,您将不会得到它(您将在着色器日志文件中收到警告)。您 检测 扩展是否使用前面讨论的 #define 是活动的。
至于如何用 SPIR-V 做到这一点……你 不会 。 SPIR-V 是一种中间语言,而不是 high-level 语言。期望 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
我的问题是,如何使用 glslang 库在 SPIR-V 中实现相同的目的?我假设我需要编译同一个着色器的多个版本来实现这个目标?或者有没有一种方法可以在不为两个版本生成两个二进制文件的情况下根据扩展的存在对 SPIR-V 进行条件化?
In regular GLSL I can do something like this to conditionally enable a GLSL extension:
首先,不,你不能。并非每个 GLSL 的 OpenGL 扩展都公开这样的#define。例如,GL_ARB_shader_viewport_layer_array extension will you find that define to be specified to be there. By contrast, the GL_ARB_shader_group_vote extension 中的任何地方都没有指定 #define
.
其次,即使扩展提供了#define,它仍然不起作用。因为 #define 只有在您使用 #extension 指令 activate 扩展时才会公开。所以你的例子永远不会 shader_viewport_layer_array 工作。
如果您想要 extension to be conditionally present,请使用 #extension NAME : enable
。如果实现不支持扩展,您将不会得到它(您将在着色器日志文件中收到警告)。您 检测 扩展是否使用前面讨论的 #define 是活动的。
至于如何用 SPIR-V 做到这一点……你 不会 。 SPIR-V 是一种中间语言,而不是 high-level 语言。期望 SPIR-V 是针对特定版本的主机环境编写的,包括扩展。如果您想有条件地支持某些扩展而不是其他扩展,则必须为您打算支持的那些扩展组合生成多个 SPIR-V 着色器。
SPIR-V 没有等同于 #ifdef,同样是因为它是一种中间语言。