使用 glslang 将 GLSL 编译为 SPIR-V 时控制装饰

Control decorations when compiling GLSL to SPIR-V with glslang

SPIR-V 规范允许模块请求展平分支或使用适当指令的控制修饰展开循环。这对着色器的最终性能配置文件有重大影响。然而,与 HLSL 不同的是,标准 GLSL 没有办法表达这一点。目的是让驱动程序可以为您做出这些决定,尽管可以说只有开发人员才能拥有足够的信息来这样做。

有没有一种方法可以指定在使用 glslang 时应如何从 GLSL 编译控制操作,或者这是否留给驱动程序来做出这些决定?我们是否仍然需要手动展开循环以确保它们不会分支?

Is there a way to specify how a control operation should be compiled from GLSL when using glslang

GLSL 中没有明确的方法来请求这些东西。可能有 glslangValidator 个开关可以控制它,但即便如此,那也是一个全局设置,而不是每个循环设置。

Do we still have to manually unroll loops to be sure they won't branch?

这是唯一的方法到"be sure they won't branch"。即使有 SPIR-V 的展开装饰,那也是一个 请求 ,而不是保证。如果内部 SPIR-V 编译器不想展开该循环,那么无论您告诉它什么,它都不会展开。