在 VS 2015 中加载调试层 (VK_ERROR_LAYER_NOT_PRESENT)

Load debug layers in VS 2015 (VK_ERROR_LAYER_NOT_PRESENT)

我目前正在尝试强制 Visual Studio 使用 Vulkan 的调试层 dll,但不知何故无法加载库。 我的步骤是:

  1. 克隆https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/master/BUILD.md
  2. 为 Visual Studio 2015 构建(发布和调试)
  3. 在我的 Vulkan 应用程序中,我将其放入环境变量(对于 x64 - 调试)(项目设置 -> 调试):VK_LAYER_PATH=F:\Projects\Vulkan-LoaderAndValidationLayers\build\layers\Debug

当我启动我的应用程序时,它会一直运行,直到它尝试创建实例,在那里它 returns VK_ERROR_LAYER_NOT_PRESENT 我可以在 Visual Studio 的输出 window 中看到dll 确实根本没有加载。如果我只是将 Vulkan 二进制文件的 "normal" 路径放在上面的路径中,它又可以正常工作了。我已经检查过是否还有 .json 文件。如果我尝试使用 LoaderAndValidationLayers 文件夹中的 Release-DLL,也会出现此问题。

我做错了什么?有谁知道如何进行这项工作吗?

编辑:我发现 VK_LAYER_LUNARG_threading 似乎是问题所在。如果我使用 VK_LAYER_LUNARG_standard_validation 它不会加载任何东西。如果我只指定手动包含的所有层(此处描述:https://vulkan.lunarg.com/app/docs/v1.0.3.1/layers)而没有 VK_LAYER_LUNARG_threading 层,它确实可以正常工作。知道为什么会这样吗?

好的,我想我找到了问题所在。但我仍然不能 100% 确定为什么会发生这种情况。 我比较了两个 VkLayer_threading.json 文件并注意到名称不同(我怀疑名称从版本 1.0.3 更改为 1.0.5)。

  • 1.0.3 ("name": "VK_LAYER_LUNARG_threading") -> 1.0.5 ("name": "VK_LAYER_GOOGLE_threading")

但即使我也在使用 Vulkan-LoaderAndValidationLayers 存储库 (https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers) 中的调试 vulkan-1.lib 加载程序库,它仍然无法加载正确的库。

目前我最强烈的猜测是,由于 Windows 的 SDK 仍在版本 1.0.3.1 上,它还在元层 (VK_LAYER_LUNARG_threading) 中使用旧名称,因此没有找到新命名的图层。我暂时编辑了 .json 文件,它再次运行。

编辑:我刚刚证实了我的猜测。在为 Windows 安装最近发布的 1.0.5 SDK 更新后,我不得不撤消上面的重命名以使其再次运行。因此,在使用最新版本的 LoaderAndValidationLayers 存储库时要小心,因为它可能包含尚未反映在可用 SDK 版本中的更改。

看起来他们稍微更改了图层的名称。

这是适合我的清单:

const char* enabledLayerNames[] = {
    "VK_LAYER_GOOGLE_threading",
    "VK_LAYER_GOOGLE_unique_objects",
    "VK_LAYER_LUNARG_api_dump",
    "VK_LAYER_LUNARG_device_limits",
    "VK_LAYER_LUNARG_draw_state",
    "VK_LAYER_LUNARG_image",
    "VK_LAYER_LUNARG_mem_tracker",
    "VK_LAYER_LUNARG_object_tracker",
    "VK_LAYER_LUNARG_param_checker",
    "VK_LAYER_LUNARG_screenshot",
    "VK_LAYER_LUNARG_swapchain",
//     "VK_LAYER_LUNARG_vktrace",
};

(我刚刚从 "C:\VulkanSDK.0.5.0\Bin\VkLayer_*.json" 个文件中提取了 "name" 个字段。)

"VK_LAYER_LUNARG_vktrace" 被评论了,因为它会在我的设备上引发错误 VK_ERROR_INITIALIZATION_FAILED ("Initialization of an object could not be completed for implementation-specific reasons")。

您可能还想检查 HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\ExplicitLayers 注册表项是否具有指向 *.json 文件的正确路径

我的环境设置:

  • GPU Nvidia GeForce GT 730M(开普勒)
  • OS: Windows 10 x64
  • 我首先安装了新的 Nvidia 驱动程序 v 364.51(勾选 "clean installation")
  • 已卸载 LunarG VulkanSDK 1.0.3 以及剩余部分(使用 Revo Uninstaller)
  • 然后安装 LunarG VulkanSDK 1.0.5

P.S。我没有编辑任何文件,也没有编辑注册表。我什至没有为 VS 2015 重新编译。它仍然以某种方式链接和工作。

P.P.S。我的物理设备报告 API 版本 1.0.4.