vkCreateShaderModule 不会失败,即使 pCode 没有指向有效的 SPIR-V 代码
vkCreateShaderModule doesn't fail, even when pCode doesn't point to valid SPIR-V code
根据文档,VkShaderModuleCreateInfo
结构
的 pCode
字段
must point to valid SPIR-V code, formatted and packed as described by the Khronos SPIR-V Specification.
现在,我在调用以下实用程序函数时犯了一个错字,无意中将 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
。为什么?
(请注意,使用生成的着色器模块的 VkPipelineShaderStageCreateInfo
对 vkCreateGraphicsPipelines
的后续调用失败。)
您使用的是 Vulkan,而不是 OpenGL。在 Vulkan 中,验证您的 SPIR-V 代码不取决于实施。 vkCreateShaderModule
的有效用法表示“pCode
必须指向有效的 SPIR-V 代码,按照
Khronos SPIR-V 规范。”与任何其他有效使用声明一样,如果您违反了它,实施将不会告诉您您已经这样做了。
你只会得到未定义的行为。
验证层会发现这个问题,发出一条消息:
SPIR-V module not valid: Invalid SPIR-V magic number.
在 vkCreateShaderModule
时间 运行 SPIR-V 验证器的验证层。
根据文档,VkShaderModuleCreateInfo
结构
pCode
字段
must point to valid SPIR-V code, formatted and packed as described by the Khronos SPIR-V Specification.
现在,我在调用以下实用程序函数时犯了一个错字,无意中将 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
。为什么?
(请注意,使用生成的着色器模块的 VkPipelineShaderStageCreateInfo
对 vkCreateGraphicsPipelines
的后续调用失败。)
您使用的是 Vulkan,而不是 OpenGL。在 Vulkan 中,验证您的 SPIR-V 代码不取决于实施。 vkCreateShaderModule
的有效用法表示“pCode
必须指向有效的 SPIR-V 代码,按照
Khronos SPIR-V 规范。”与任何其他有效使用声明一样,如果您违反了它,实施将不会告诉您您已经这样做了。
你只会得到未定义的行为。
验证层会发现这个问题,发出一条消息:
SPIR-V module not valid: Invalid SPIR-V magic number.
在 vkCreateShaderModule
时间 运行 SPIR-V 验证器的验证层。