代码之家  ›  专栏  ›  技术社区  ›  0xbadf00d

vkCreateShaderModule不会失败,即使pCode没有指向有效的SPIR-V代码

  •  0
  • 0xbadf00d  · 技术社区  · 6 年前

    根据文件 pCode 的字段 VkShaderModuleCreateInfo 结构

    必须指向有效的SPIR-V代码,按照Khronos SPIR-V规范进行格式化和打包。

    现在,我在以下实用程序函数的调用中输入了一个错误,并无意中提供了GLSL代码的文件名作为 shader_file_name .

    void create_shader_module(VkDevice device, std::string const& shader_file_name)
    {
        std::ifstream shader_file(shader_file_name, std::ios::binary);
    
        shader_file.seekg(0, std::ios_base::end);
        std::size_t const shader_file_size = shader_file.tellg();
    
        if (shader_file_size > 0)
        {
            assert(shader_file_size % sizeof(std::uint32_t) == 0);
    
            std::vector<char> binary(shader_file_size);
            shader_file.seekg(0, std::ios_base::beg);
            shader_file.read(binary.data(), shader_file_size);
    
            VkShaderModuleCreateInfo shader_module_create_info{};
            shader_module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
            shader_module_create_info.codeSize = shader_file_size;
            shader_module_create_info.pCode = reinterpret_cast<std::uint32_t const*>(binary.data());
    
            VkShaderModule shader_module;
            if (vkCreateShaderModule(device, &shader_module_create_info, nullptr, &shader_module) != VK_SUCCESS)
                throw std::exception("Could not create shader module");
        }
    }
    

    尽管输入错误,但代码没有抛出,即。 vkCreateShaderModule 返回 VK_SUCCESS . 为什么?

    (请注意 vkCreateGraphicsPipelines 用一个 VkPipelineShaderStageCreateInfo 使用生成的着色器模块的操作失败。)

    2 回复  |  直到 6 年前
        1
  •  3
  •   Karl Schultz    6 年前

    验证层会发现此问题,并发出以下消息:

    SPIR-V模块无效:无效的SPIR-V幻数。

    验证层在以下位置运行SPIR-V验证程序: vkCreateShaderModule 时间

        2
  •  2
  •   Nicol Bolas    6 年前

    您使用的是Vulkan,而不是OpenGL。在Vulkan中,验证SPIR-V代码并不取决于实现。的有效用法 vkCreateShaderModule “他说” pCode 必须指向有效的SPIR-V代码,按照 Khronos SPIR-V规范。“与任何其他有效的用法语句一样,如果您违反了它,实现将不会告诉您您这样做了。

    您只会得到未定义的行为。