我正在进入Android上的Vulkan开发,并发现vkEnumerateInstanceLayerProperties()
报告的某些验证层会导致vkCreateInstance()
返回VK_ERROR_LAYER_NOT_PRESENT
。
我正在使用Google的验证层example以及Vulkan-Tutorial.com的验证章节。通过反复试验,我发现在请求部分 SDK提供的图层而不是其他图层时,我可以创建VkInstance
。
按照上面Google指南中的设置步骤操作后,我的APK包含每个架构的七个libVkLayer_foo.so
个文件,vkEnumerateInstanceLayerProperties()
列出七个层,正如预期的那样。但是当我尝试使用下面的任何图层创建VkInstance
时,vkCreateInstance()
会返回VK_ERROR_LAYER_NOT_PRESENT
:
有谁知道可能导致这种情况的原因?我假设如果vkEnumerateInstanceLayerProperties()
知道某个图层,vkCreateInstance()
也应该。尽管如此,我确实在libvulkan.so
返回后立即在vkCreateInstance()
中发现crash。我不确定这是VK_ERROR_LAYER_NOT_PRESENT
还是结果的原因。
如果它有任何区别,则会在nVidia Shield TV上运行。
更新奇怪的是,导致崩溃的图层似乎正在发生变化。现在我可以使用VK_LAYER_LUNARG_parameter_validation
,即使请求该层用于导致崩溃。
只是为了澄清,当我使用Android上的LunarG SDK中提供的某些验证层时,我只会遇到崩溃。我可以使用其他验证图层创建VkInstance
,并且我的回调函数会被调用。
答案 0 :(得分:0)
问题最终成为一个更普遍的C / C ++“未定义行为”问题,这也可能解释为什么“故障”层在某一点上发生了变化。考虑一下这样的代码块,其中extensions
是std::vector
:
VkInstanceCreateInfo createInfo = {};
...
createInfo.enabledExtensionCount = (uint32_t) extensions.size();
createInfo.ppEnabledExtensionNames = extensions.data();
一般来说,这很好用。 但创建VkInstanceCreateInfo
的代码使用辅助方法,extensions
在使用createInfo
之前超出范围(即销毁)。所以vkCreateInstance
最终会得到一个指向已经解除分配的内存的指针。