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

时间:2017-12-30 01:48:45

标签: vulkan

通过文档,pCode结构

VkShaderModuleCreateInfo字段
  

必须指向有效的SPIR-V代码,格式化和打包,如Khronos SPIR-V规范所述。

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

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 个答案:

答案 0 :(得分:2)

您使用的是Vulkan,而不是OpenGL。在Vulkan中,验证SPIR-V代码无法实现。 vkCreateShaderModule的有效用法表示“pCode必须指向有效的SPIR-V代码,格式化和打包,如 Khronos SPIR-V规范。“与任何其他有效使用声明一样,如果您违反该声明,实施将不会告诉您已经这样做。

你只是得到了未定义的行为。

答案 1 :(得分:2)

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

  

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

验证层在vkCreateShaderModule时运行SPIR-V验证器。