vkCreateInstance()在验证层和VSCode上花费不合理的时间



我注意到我的Vulkan程序在创建窗口后实际响应几乎需要10秒;经过一些测试,我把原因归结为vkCreateInstance()

这里是有趣的部分:这个问题只发生在运行VSCode时-如果程序正在使用验证层(VK_EXT_debug_utils)。也就是说:

程序工作在以下条件下:

  • 它正在独立运行(没有VSCode)调试utils
  • 它正在独立运行(没有VSCode)没有调试utils
  • 它正在VSCode中运行,没有调试utils

但是程序不工作时间:

  • 它正在VSCode调试utils运行。

(这里的"工作"是指没有任何重大延迟的运行)

I am onLinuxRadeon RX 480,使用RADV(台面)司机。

<标题>

更新1看起来我在创建实例时没有使用验证层-现在我已经这样做了,并且在通过VSCode启动vkCreateInstance()时返回以下输出:

[vlk] Searching for layer manifest files
[vlk]    In following folders:
[vlk]       /home/jack/.config/vulkan/implicit_layer.d
[vlk]       /etc/xdg/vulkan/implicit_layer.d
[vlk]       /etc/vulkan/implicit_layer.d
[vlk]       /home/jack/.local/share/vulkan/implicit_layer.d
[vlk]       /usr/local/share/vulkan/implicit_layer.d
[vlk]       /usr/share/vulkan/implicit_layer.d
[vlk]    Found the following files:
[vlk]       /home/jack/.local/share/vulkan/implicit_layer.d/steamfossilize_i386.json
[vlk]       /home/jack/.local/share/vulkan/implicit_layer.d/steamoverlay_x86_64.json
[vlk]       /home/jack/.local/share/vulkan/implicit_layer.d/steamoverlay_i386.json
[vlk]       /home/jack/.local/share/vulkan/implicit_layer.d/steamfossilize_x86_64.json
[vlk]       /usr/share/vulkan/implicit_layer.d/amd_icd64.json
[vlk]       /usr/share/vulkan/implicit_layer.d/amd_icd32.json
[vlk] Found manifest file /home/jack/.local/share/vulkan/implicit_layer.d/steamfossilize_i386.json (file version "1.0.0")
[vlk] Found manifest file /home/jack/.local/share/vulkan/implicit_layer.d/steamoverlay_x86_64.json (file version "1.0.0")
[vlk] Found manifest file /home/jack/.local/share/vulkan/implicit_layer.d/steamoverlay_i386.json (file version "1.0.0")
[vlk] Found manifest file /home/jack/.local/share/vulkan/implicit_layer.d/steamfossilize_x86_64.json (file version "1.0.0")
[vlk] Found manifest file /usr/share/vulkan/implicit_layer.d/amd_icd64.json (file version "1.0.0")
[vlk] Found manifest file /usr/share/vulkan/implicit_layer.d/amd_icd32.json (file version "1.0.0")
[vlk] Searching for layer manifest files
[vlk]    In following folders:
[vlk]       /home/jack/.config/vulkan/explicit_layer.d
[vlk]       /etc/xdg/vulkan/explicit_layer.d
[vlk]       /etc/vulkan/explicit_layer.d
[vlk]       /home/jack/.local/share/vulkan/explicit_layer.d
[vlk]       /usr/local/share/vulkan/explicit_layer.d
[vlk]       /usr/share/vulkan/explicit_layer.d
[vlk]    Found the following files:
[vlk]       /etc/vulkan/explicit_layer.d/VkLayer_screenshot.json
[vlk]       /etc/vulkan/explicit_layer.d/VkLayer_monitor.json
[vlk]       /etc/vulkan/explicit_layer.d/VkLayer_api_dump.json
[vlk]       /etc/vulkan/explicit_layer.d/VkLayer_device_simulation.json
[vlk]       /usr/share/vulkan/explicit_layer.d/VkLayer_khronos_validation.json
[vlk] Found manifest file /etc/vulkan/explicit_layer.d/VkLayer_screenshot.json (file version "1.2.0")
[vlk] Found manifest file /etc/vulkan/explicit_layer.d/VkLayer_monitor.json (file version "1.0.0")
[vlk] Found manifest file /etc/vulkan/explicit_layer.d/VkLayer_api_dump.json (file version "1.2.0")
[vlk] Found manifest file /etc/vulkan/explicit_layer.d/VkLayer_device_simulation.json (file version "1.2.0")
[vlk] Found manifest file /usr/share/vulkan/explicit_layer.d/VkLayer_khronos_validation.json (file version "1.2.0")
[vlk] Searching for driver manifest files
[vlk]    In following folders:
[vlk]       /usr/share/vulkan/icd.d/radeon_icd.x86_64.json
[vlk]    Found the following files:
[vlk]       /usr/share/vulkan/icd.d/radeon_icd.x86_64.json
[vlk] Found ICD manifest file /usr/share/vulkan/icd.d/radeon_icd.x86_64.json, version "1.0.0"
[vlk] Searching for ICD drivers named /usr/lib/libvulkan_radeon.so
[vlk] Build ICD instance extension list
[vlk] Loading layer library libVkLayer_khronos_validation.so
[vlk] Insert instance layer VK_LAYER_KHRONOS_validation (libVkLayer_khronos_validation.so)
[vlk] /usr/lib32/amdvlk32.so: wrong ELF class: ELFCLASS32
[vlk] Loading layer library /usr/lib/amdvlk64.so
[vlk] Insert instance layer VK_LAYER_AMD_switchable_graphics_64 (/usr/lib/amdvlk64.so)
[vlk] Requested layer VK_LAYER_AMD_switchable_graphics_32 was wrong bit-type.
[vlk] Build ICD instance extension list

在Visual Studio Code之外的输出日志是一样的。

在深入研究了这个问题之后,我发现了一个解决方法,虽然它不能完全消除延迟,但可以将其最小化到几乎即时。大约8-9秒减少到平均大约2-3秒。虽然不完美,但比以前好了很多。

结果是GDB不管出于什么原因,导致了这次延误。也许GDB或Vulkan团队的人应该调查一下?我不知道。在任何情况下,VSCode都使用GDB来调试程序。

所以要解决这个问题:使用LLDB代替。幸运的是,我不限于出于任何原因使用GDB, LLDB似乎也是一个非常好的调试器。可能还有其他我不知道的人做得更好……在将来的某个时候,我将进一步研究它。

在我的情况下,因为我使用VSCode,这个扩展是有用的集成LLDB到启动。

最新更新