1

我正在编写一个简单的 Vulkan 应用程序来熟悉 API。当我调用 vkCreateGraphicsPipelines 时,我的程序将“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 的定义),这意味着着色器阶段无法编译(参见https://www .khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkCreateShaderModule.html)。当我对整个 SPIR-V 文件(使用“dd conv=swab”)进行字节交换时,也会发生完全相同的事情。

我不确定首先是什么问题,因为https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkShaderModuleCreateInfo.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;
}
4

0 回答 0