android 已知验证层的vkCreateInstance()失败

6za6bjd0  于 2023-03-16  发布在  Android
关注(0)|答案(1)|浏览(172)

我正在Android上进行Vulkan开发,发现vkEnumerateInstanceLayerProperties()报告的一些验证层导致vkCreateInstance()返回VK_ERROR_LAYER_NOT_PRESENT
我正在使用Google的验证层example以及Vulkan-Tutorial.com的验证章节。通过反复试验,我发现当请求SDK提供的层中的 * 一些 * 时,我能够创建VkInstance,而其他层则不能。
按照上述Google指南中的设置步骤操作后,我的APK包含每个架构的7个libVkLayer_foo.so文件,vkEnumerateInstanceLayerProperties()列出了7个层,这与预期相符。但当我尝试使用以下任意层创建VkInstance时,vkCreateInstance()返回VK_ERROR_LAYER_NOT_PRESENT

  • VK_LAYER_LUNARG_参数_确认
  • VK_LAYER_LUNARG_对象跟踪器
  • VK图层GOOGLE唯一对象

有人知道是什么原因吗?我假设如果vkEnumerateInstanceLayerProperties()知道一个层,vkCreateInstance()也应该知道。尽管如此,我确实看到vkCreateInstance()返回后立即在libvulkan.so中出现crash。我不确定这是VK_ERROR_LAYER_NOT_PRESENT的原因还是结果。
如果有什么区别的话,这是在nVidia Shield电视上运行的。

更新奇怪的是,导致崩溃的图层似乎在改变。现在我可以使用VK_LAYER_LUNARG_parameter_validation,即使请求那个图层曾经导致崩溃。

澄清一下,我只在使用Android上的LunarG SDK中提供的某些验证层时遇到崩溃。我可以使用其他验证层创建VkInstance,并且我的回调函数*****会被调用。

e5nszbig

e5nszbig1#

这个问题最终变成了一个更普遍的C/C++“未定义行为”问题,这可能就是为什么“麻烦”层在某个点上发生了变化。考虑这样的代码块,其中extensionsstd::vector

VkInstanceCreateInfo createInfo = {};
...
createInfo.enabledExtensionCount = (uint32_t) extensions.size();
createInfo.ppEnabledExtensionNames = extensions.data();

但是创建VkInstanceCreateInfo的代码在helper方法中,extensions在使用createInfo之前就超出了作用域(即被销毁),所以vkCreateInstance最后得到一个指向已释放内存的指针。

相关问题