SPIR-V和OpenGL:切入点和流水线阶段

v440hwme  于 2022-10-18  发布在  其他
关注(0)|答案(1)|浏览(244)

OpenGL中有没有内置的方法来确定编译的spir-v着色器支持哪些入口点和着色器舞台,或者我必须使用像https://github.com/KhronosGroup/SPIRV-Reflect这样的单独的库?
编辑:我最终使用了SPIRV-Reflect:
我的ASSET管道将需要链接到程序中的所有阶段链接到单个二进制BLOB中,然后我使用

uint32_t                      GetEntryPointCount() const;
const char*                   GetEntryPointName(uint32_t index) const;
SpvReflectShaderStageFlagBits GetEntryPointShaderStage(uint32_t index) const;

枚举入口点并将相应的着色器附加到程序。

col17t5w

col17t5w1#

OpenGL只有链接程序的introspection facilities。程序链接需要首先编译着色器对象。而SPIR-V加载会生成着色器对象,这些对象会用专门化取代“编译”。SPIR-V着色器的专门化需要知道要使用的入口点。
因此,OpenGL无法查看SPIR-V模块中有哪些入口点可用。再说了,这也没什么用。Spir-V只能加载到着色器对象中,并且着色器对象是为特定着色器舞台创建的。因此,除非同一舞台有多个入口点,否则实际上只有一个入口点可以查找:其舞台与着色器对象类型匹配的入口点。
因此,OpenGL已经期望您有一些与任何特定SPIR-V模块加载操作相关联的附加信息。只需将入口点名称放在该附加信息中,或为特定着色器阶段的入口点名称建立一个约定。

相关问题