我正在编写一个简单的Vulkan应用程序以熟悉API。当我调用vkCreateGraphicsPipelines时,我的程序向stderr打印“ LLVM错误:无效的SPIR-V幻数”并退出。
SPIR-V规范(我认为https://www.khronos.org/registry/spir-v/specs/1.2/SPIRV.pdf,第3章与此处有关)指出,着色器模块被假定为字流,而不是字节,而我的SPIR-V文件是字节流。 。
因此我用字节交换了SPIR-V文件的前两个字,并且确实识别出了幻数,但是vkCreateGraphicsPipelines退出,错误代码为-1000012000(VK_ERROR_INVALID_SHADER_NV的定义),意味着着色器阶段无法编译(请参见{{ 3}})。当我用字节交换整个SPIR-V文件(使用“ dd conv = swab”)时,会发生完全相同的事情。
我不确定到底是什么问题,因为https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkCreateShaderModule.html指出SPIR-V代码的格式是自动确定的。如果有人可以推荐修复程序,即使它是hack,我也将不胜感激。
如果这很重要,我将使用glslangValidator生成SPIR-V。
加载着色器模块的代码:
std::vector<char> readFile(const std::string& filename) {
std::ifstream file(filename, std::ios::ate | std::ios::binary);
size_t fileSize = (size_t) file.tellg();
std::vector<char> buffer(fileSize);
file.seekg(0);
file.read(buffer.data(), fileSize);
file.close();
return buffer;
}
VkShaderModule getShadMod(VkDevice dev, const std::string shadFileName) {
std::vector<char> shader = readFile(shadFileName);
VkShaderModuleCreateInfo smci;
smci.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
smci.pNext = NULL;
smci.flags = 0;
smci.codeSize = shader.size();
smci.pCode = reinterpret_cast<uint32_t *>(shader.data());
VkShaderModule shadMod;
asr(vkCreateShaderModule(dev, &smci, NULL, &shadMod),
"create shader module error");
return shadMod;
}