我正在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
,并且我的回调函数*****会被调用。
1条答案
按热度按时间e5nszbig1#
这个问题最终变成了一个更普遍的C/C++“未定义行为”问题,这可能就是为什么“麻烦”层在某个点上发生了变化。考虑这样的代码块,其中
extensions
是std::vector
:但是创建
VkInstanceCreateInfo
的代码在helper方法中,extensions
在使用createInfo
之前就超出了作用域(即被销毁),所以vkCreateInstance
最后得到一个指向已释放内存的指针。