我什么时候可以释放传递给 vulkan vkCreateXXX 函数的资源和结构?

Bun*_*gow 5 vulkan

我开始学习 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;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我在mkVulkanFreeShaderBinary创建着色器模块之后释放了 mkShader 结构,并且我没有从我的程序中收到任何错误。所以我的问题是这样做是否安全,或者我必须保留 mkShader 结构,直到我销毁着色器模块。而且,这是否对所有 VkCreate[...] 函数都有效,并且此信息是否在 Vulkan 规范中的任何位置。

Jhe*_*ico 6

请参阅Vulkan 规范的对象生命周期

应用程序拥有的内存的所有权会立即通过任何传入它的 Vulkan 命令获取。此类内存的所有权必须在命令持续时间结束时释放回应用程序,以便应用程序可以在获取它的所有命令返回后立即更改或释放此内存。

换句话说,只要 Vulkan 函数调用返回,您分配的任何内容都可以自由删除。此外,一旦您创建了管道,您也可以随意销毁它VkShaderModule