【问题标题】:VK_IMAGE_USAGE_TRANSFER_SRC_BIT flag magically added to swapchain imagesVK_IMAGE_USAGE_TRANSFER_SRC_BIT 标志神奇地添加到交换链图像
【发布时间】:2021-11-12 16:22:39
【问题描述】:

VkImageUsageFlagBits::VK_IMAGE_USAGE_TRANSFER_SRC_BIT 是否应该自动设置为交换链图像?

我一直在查找它,我没有看到任何迹象表明该标志应该自动添加到交换链图像中。

但是,我已经在 SDK 1.2.148.1(尚未尝试其他)中测试过,在具有最新驱动程序的 NVIDIA GTX 1080ti 上,即使没有请求,也会自动添加该标志。我不确定是SDK还是驱动程序设置了它,但其中之一是。

我首先在自己的代码中对其进行了验证,然后使用 Sascha Willem 的三角形示例进行了尝试,方法是注释掉以下行: https://github.com/SaschaWillems/Vulkan/blob/master/base/VulkanSwapChain.cpp#L347

这是一张在 NVIDIA Nsight 上运行 Triangle 应用程序的图像。它不应该有标志:

enter image description here

【问题讨论】:

  • “应该是”是什么意思?如果标志可用,您可以使用它。如果可用,您链接到显示有人使用它的代码。我不确定这有什么问题。
  • "即使没有请求,该标志也会自动添加。" 你怎么知道的?你不能问VkImage 它的使用标志是什么。
  • @Nicol Bolas:我最初是通过调试在将一些现有代码转换为使用无图像帧缓冲区时遇到的问题发现的。抱怨交换链图像和帧缓冲区配置没有匹配标志的验证层。错误消息显示了交换链图像标志的值。此外,正如帖子中的图片所示,我还通过 NVIDIA Insight 确认了这一点。
  • “'supposed to be' 是什么意思?”:我在问这个自动标志设置是一个特性还是一个错误。

标签: graphics gpu render vulkan


【解决方案1】:

Vulkan 没有机制告诉您图像上的使用标志是什么,无论是否交换链。因此,您依赖于层和调试工具将这些信息提供给您。

但是,这些工具本身完全能够设置这些标志。如果调试工具希望能够向您显示交换链图像中的图像数据,则该图像必须可用作传输操作的源。所以这样的工具必须设置这些标志。任何可能涉及调试的层也是如此。

事实上,调试工具知道该标志已设置的事实证明了 Vulkan 实现 没有设置它。如果它设置了标志,那么实现之外的任何人都不会知道它。

因此,这很可能是调试层的行为。不幸的是,它在验证层看到它之前设置了这个标志。为了验证无图像帧缓冲功能的使用,验证层需要查看这些标志。

要解决此问题,您可以对已激活的图层重新排序。 ppEnabledLayerNames 是层的有序列表;如果您还没有这样做,请将验证层放在此列表的首位。如果您要在全局范围内启用图层,请查看是否可以调整这些图层的顺序。

【讨论】:

  • 我根本不同意调试工具需要破坏数据才能获取数据。 NVIDIA 可以访问他们自己的 GPU 内部——他们不需要更改用户位来探索他们自己的数据结构。也许验证层有一个错误,我不知道,但它们也不需要更改位来查看标志。他们可以在它被发送到某个地方之前拦截它。 Vulkan Configurator 的 API 转储功能显示了 TRANSFER_SRC 标志集,因此至少不是 NV Insight 这样做。
  • 我别无选择,只能解决。但是,它需要在与交换链图像关联的无图像帧缓冲区定义中启用传输标志;否则,会出现验证错误。如果 bug 得到修复,则需要删除 hack 以防止另一个验证错误。
  • 如果它是一个无图像帧缓冲区......你为什么要使用交换链图像呢?
  • 我很困惑。作为交换链一部分的图像对于作为帧缓冲区的一部分有什么影响?
  • 哦,当你说“无图像帧缓冲区”时,我以为你的意思是“我正在渲染没有任何附加图像”。我忘记了 Vulkan 1.2 的一个特性,字面意思是“无图像帧缓冲区”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多