validation - 销毁设备时每个对象的 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 设备上,不幸的是我无法在另一台设备上测试应用程序。应用程序中的其他一切都正常工作,我什至在运行时销毁并重新创建一些对象而不会出错,除了应用程序在退出时崩溃。
解决方案
我刚刚删除了验证层,令人惊讶的是应用程序不再崩溃,关闭序列成功结束。为什么我不早点尝试?该问题仅发生在层上,可能是由于它们在扩展数组中的顺序。
推荐阅读
- javascript - 我正在尝试向 Vue.js 添加效果,但没有发生任何事情
- yaml - 在 YAML 多行字符串的第一行保留前导空格
- sql - 在 Order by | 中使用 Case 表达式时的不同之处 SQL
- android - 从日期和时间 Android 获取时间戳
- html - 为什么图片加载不出来?
- localization - 如何使用反应路由器和 i18 直接从 url 配置本地化作为语言参数?
- html - 页面右侧的空间
- python - 为什么 pop 方法不打破这个例子中的 while 循环?
- pandas - 应用 DateFormatter 和 WeekdayLocator 后,时间序列中的条形图超出最后一个日期
- python - 将函数应用于 DataFrame 中的每个单元格并包含来自特定列的值