首页 > 解决方案 > 销毁设备时每个对象的 Vulkan 验证错误,尽管它们已销毁

问题描述

在 android 本机应用程序中,当我调用时:

vkDestroyDevice( vk.device, VK_ALLOCATOR )

我有错误错误: [验证] 代码 614466292 X 对象 0xffffffffd3bcb900 尚未被销毁(...)。

但是我已经为每个对象调用了 vkDestroy(Object)。(图像、图像视图、管道等)

这是一个对象创建/销毁:

static void create_shader_module(const unsigned char* pBytes, const int count, VkShaderModule* pVkShaderMod) {
    VkShaderModuleCreateInfo desc;
    desc.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
    desc.pNext = NULL;
    desc.flags = 0;
    desc.codeSize = count;
    desc.pCode = (const uint32_t*)pBytes;          
    VK(vkCreateShaderModule(vk.device, &desc, NULL, pVkShaderMod));
}
extern unsigned char multiview_single_texture_vert_spv[];
extern int multiview_single_texture_vert_spv_size;
create_shader_module(multiview_single_texture_vert_spv, multiview_single_texture_vert_spv_size, &s_gShaderModules.single_texture_vs);

对于破坏部分:

vkDestroyShaderModule(vk.device, s_gShaderModules.single_texture_vs, NULL);

当我调用 vkDestroyShaderModule 时,vk.device 仍然处于活动状态,并且我没有收到任何错误。但是,一旦我调用 vkDestroyDevice(),就会出现错误:

OBJ 错误:对于设备 0xeb0ac330,ShaderModule 对象 0xffffffffeb0c6240 尚未销毁。规范有效使用文本指出“在设备上创建的所有子对象必须在销毁设备之前被销毁”

使用 memset(&s_gShaderModules, 0, sizeof(s_gShaderModules)) 释放结构内存;不能解决问题。

错误出现在 android 设备上,不幸的是我无法在另一台设备上测试应用程序。应用程序中的其他一切都正常工作,我什至在运行时销毁并重新创建一些对象而不会出错,除了应用程序在退出时崩溃。

标签: validationdestructorexitvulkan

解决方案


我刚刚删除了验证层,令人惊讶的是应用程序不再崩溃,关闭序列成功结束。为什么我不早点尝试?该问题仅发生在层上,可能是由于它们在扩展数组中的顺序。


推荐阅读