我开始学习Vulkan,想知道VkCreate [...]函数是否将结构体中指向的资源复制到他自己的缓冲区中。
为澄清我的问题,在这段代码中,将 SPIR 着色器加载到我自己的mkShader结构中,然后使用vkCreateShaderModule
创建着色器模块。
static VkShaderModule mkVulkanCreateShaderModule(MkVulkanContext *vc,
const char *filename)
{
VkShaderModule shaderModule;
struct mkShader *shader = mkVulkanLoadShaderBinary(filename);
VkShaderModuleCreateInfo createInfo = {0};
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
createInfo.codeSize = shader->size;
createInfo.pCode = (uint32_t *)shader->buffer;
if (vkCreateShaderModule(vc->device, &createInfo, NULL,
&shaderModule) != VK_SUCCESS) {
printf(ANSI_COLOR_RED
"Failed to create shader module\n" ANSI_COLOR_RESET);
assert(0);
exit(EXIT_FAILURE);
}
mkVulkanFreeShaderBinary(shader);
return shaderModule;
}
您可以看到,在创建着色器模块之后,我正在使用mkVulkanFreeShaderBinary
释放mkShader结构,并且没有从程序中收到任何错误。所以我的问题是这样做是否安全,或者必须保留mkShader结构直到销毁着色器模块。而且,这是否对所有VkCreate [...]功能都有效,并且该信息是否在Vulkan规范中。
答案 0 :(得分:3)
请参见Vulkan规范的Object Lifetime。
应用程序拥有的内存的所有权将通过传递给它的任何Vulkan命令立即获得。必须在命令持续时间结束时将此类内存的所有权释放回应用程序,以便应用程序可以在所有获取它的命令返回后立即更改或释放此内存。
换句话说,只要Vulkan函数调用返回,您分配的任何内容都可以自由删除。此外,一旦创建了管道,就可以随意销毁VkShaderModule
。