已知验证层的vkCreateInstance()失败

时间:2018-03-22 08:23:42

标签: android vulkan

我正在进入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

  • VK_LAYER_LUNARG_parameter_validation
  • VK_LAYER_LUNARG_object_tracker
  • VK_LAYER_GOOGLE_unique_objects

有谁知道可能导致这种情况的原因?我假设如果vkEnumerateInstanceLayerProperties()知道某个图层,vkCreateInstance()也应该。尽管如此,我确实在libvulkan.so返回后立即在vkCreateInstance()中发现crash。我不确定这是VK_ERROR_LAYER_NOT_PRESENT还是结果的原因。

如果它有任何区别,则会在nVidia Shield TV上运行。

更新奇怪的是,导致崩溃的图层似乎正在发生变化。现在我可以使用VK_LAYER_LUNARG_parameter_validation,即使请求该层用于导致崩溃。

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

1 个答案:

答案 0 :(得分:0)

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

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

一般来说,这很好用。 创建VkInstanceCreateInfo的代码使用辅助方法,extensions在使用createInfo之前超出范围(即销毁)。所以vkCreateInstance最终会得到一个指向已经解除分配的内存的指针。