【问题标题】:Vulkan: Invalid Shader Module ObjectVulkan:无效的着色器模块对象
【发布时间】:2016-10-04 03:29:37
【问题描述】:

尽管我在尝试创建管道时遇到了问题,但我已经编写了一个小型 Vulkan 测试应用程序来熟悉 Vulkan。

vkCreateGraphicsPipeline 导致验证层产生以下错误: 无效的着色器模块对象 0x8 无效的着色器模块对象 0x9

然后程序在验证层内崩溃。 我为顶点着色器和片段着色器创建了一个 VkShaderModule,并使用 glslangvalidator -V 将它们转换为 vkCreateShaderModule 没有抱怨的 SPIR-V 模块。

有什么我可能错过的吗?这些例子似乎和我做的事情完全一样。

【问题讨论】:

  • 您错过了向我们展示实际导致您引用的问题的代码。
  • 投反对票是极其不恰当的。在这种情况下,代码不相关,因为只有一种方法可以创建着色器模块并为管道指定它。由于 Vulkan API 的冗长,它也不实用。虽然错误消息本身很模糊,但它可能有一个非常具体的原因,并且毫无疑问其他人以前遇到过它并且应该确切地知道是什么情况导致它。
  • 如果这是真的,那么你基本上是假设验证层在某种程度上被破坏了。然而,如果人们根本无法创建图形管道,那么就没有人能够使用验证层。当然,人们正在使用验证层,因此从着色器模块创建图形管道不会出现一般问题。因此,除非有其他理由怀疑,否则我们必须假设您的代码有问题。所以我们需要看看你的代码到底在做什么,不管它有多冗长。
  • 没错,就是把手。我不清楚消息指的是什么,并认为可能是句柄所指的对象在某种程度上是无效的,但实际上消息所指的只是句柄本身。原来问题是我应该将 VkShaderModule 容器类的复制构造函数标记为已删除,并且该对象被在 STL 容器中执行的复制隐式销毁。
  • @atlan: "原来问题是我应该将 VkShaderModule 容器类的复制构造函数标记为已删除,并且该对象被在 STL 中执行的复制隐式销毁容器。" 也许现在您会明白为什么在提问时提供minimal reproducible example 很重要。

标签: c graphics vulkan


【解决方案1】:

VK_LAYER_LUNARG_object_tracker 验证层检测到错误消息和层崩溃行为指向无效的 Vulkan 对象句柄(例如,在使用前对象不成功 vkCreate*d 或 vkDestroyed)。

如果验证层全部启用并且按照规定的顺序进行,则它们可能不会崩溃。这可以通过仅使用VK_LAYER_LUNARG_standard_validation 元层来确保。

与任何优秀的验证器一样,错误消息对于弱小的人类来说是完全无法阅读的。
标准验证层在GitHub/KhronosGroup/Vulkan-LoaderAndValidationLayers/layers 中开源,因此如果有疑问,可以搜索给定的消息文本。通常它在core_validation.cpp,但在你的情况下它会是object_tracker.cpp。 (该消息将采用 printf 格式,例如“Invalid %s Object 0x%”,使其更难搜索)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2018-02-05
    • 2017-07-10
    相关资源
    最近更新 更多