升级到1.2.162.1后:vkQueueWaitIdle == VK_ERROR_DEVICE_LOST

2024-03-22

我最近将光线追踪渲染器从 Vulkan SDK 版本 1.2.148.0 升级到 1.2.162.1。 这是必要的,因为光线追踪扩展已经结束测试版,因此现在可以与非测试版一起使用 显卡驱动程序(我的 RTX 2070 SUPER 的版本为 461.40)。它要求我对渲染器的光线追踪部分进行相当多的更改 感谢 nvidia 教程,我成功了。

不幸的是,以前可以正常工作的代码现在开始出现错误。 在许多情况下,提交单次命令会导致 vkQueueWaitIdle 失败并显示 VK_ERROR_DEVICE_LOST,从而导致验证错误,表示我正在尝试释放仍在使用的命令缓冲区。这种情况发生在多种用途中:转换图像布局(似乎是 undef 到一般)、构建加速结构、复制缓冲区但不是每次都复制(例如从暂存到设备缓冲区,之后释放暂存缓冲区也会引发错误,因为它仍在使用中,副本尚未完成)...但对于其他用途,它工作正常。我目前无法确定共同点...

最后,程序崩溃,因为呈现第一帧失败,因为它的布局未定义 - 我认为这是由前面提到的一个或多个错误引起的。

自从我上次使用它以来,有什么变化吗?这是有问题的代码(endSingleTimeCommands):

    vkEndCommandBuffer(commandBuffer);

    VkSubmitInfo submitInfo{};
    submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
    submitInfo.commandBufferCount = 1;
    submitInfo.pCommandBuffers = &commandBuffer;

    vkQueueSubmit(graphicsQueue, 1, &submitInfo, VK_NULL_HANDLE);
    switch (vkQueueWaitIdle(graphicsQueue)) {
        //debug output removed for brevity
    };

    vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);

它失败的地方之一是:

    //[fill the structs with info...]

    //function pointer grabbed via vkGetDeviceProcAddr
    vk::vkCmdBuildAccelerationStructuresKHR(cmd, 1, &buildInfo, &buildOffset);

    //[call to the above code here]

但与扩展无关的代码也会失败(有时!),例如:

    VkCommandBuffer commandBuffer = beginSingleTimeCommands();

    VkBufferCopy copyRegion{};
    copyRegion.srcOffset = 0; // Optional
    copyRegion.dstOffset = 0; // Optional
    copyRegion.size = size;
    vkCmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, 1, &copyRegion);

    endSingleTimeCommands(commandBuffer);

也许 beginSingleTimeCommands 也相关:

    VkCommandBufferAllocateInfo allocInfo{};
    allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
    allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
    allocInfo.commandPool = commandPool;
    allocInfo.commandBufferCount = 1;

    VkCommandBuffer commandBuffer;
    if (vkAllocateCommandBuffers(device, &allocInfo, &commandBuffer) != VK_SUCCESS) {
        std::cout << "beginSingleTimeCommands: could not allocate command buffer!\n";
    }

    VkCommandBufferBeginInfo beginInfo{};
    beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
    beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;

    if (vkBeginCommandBuffer(commandBuffer, &beginInfo) != VK_SUCCESS) {
        std::cout << "beginSingleTimeCommands: could not begin command buffer!\n";
    }

    return commandBuffer;

我想我收集了一些额外的信息: 我使用 nvidia 管道检查点系统在调用 vkCmdBuildAccelerationStructuresKHR 之前和之后添加一个检查点,并且两个检查点都位于 TOP_OF_PIPE。第一次调用此函数后,不再生成检查点输出,这让我相信第一次调用构建会以某种方式破坏一切。我想我会仔细检查我的 AS 大楼,如果找到任何东西我会回复你。


事实证明,实际错误可能发生在 vkQueueWaitIdle 返回 DEVICE_LOST 错误的命令缓冲区之前。我的加速结构构建代码中已经存在并将继续存在各种错误。我无法轻松调试它,因为显然验证层不会显示提供给 vkCmdBuildAccelerationStructures 的结构中是否存在细微错误,而是需要进行大量试验和错误。

我确信升级前的验证层会发现一个值得注意的例子,那就是忘记设置VkAccelerationStructureBuildGeometryInfoKHR::scratchData字段,我必须修复的最后一个错误才能最终让一切运行起来。

我的问题的答案是:不要看触发DEVICE_LOST的命令,看看你对队列做了什么before该命令,有可能会出现错误。事实上,一旦发生第一个 DEVICE_LOST 错误,(几乎?)所有后续 vkQueueWaitIdle 都会因相同的错误而失败(与 vkQueueSubmit 相同)。在诸如我的复制缓冲区代码首先失败的情况下,错误总是在队列使用中找到before那个。

我无法发布我的问题的确切解决方案,因为就像我所说的那样,原因不止一个,到目前为止我只修复了其中一些,还有一些。我认为这些细节与未来遇到我的问题的人无关,但如果我可以添加任何内容来帮助其他人,请告诉我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

升级到1.2.162.1后:vkQueueWaitIdle == VK_ERROR_DEVICE_LOST 的相关文章

  • 电话号码的正则表达式,不允许全零

    需要您的正则表达式帮助 我当前的正则表达式是 d 8 最小长度为 8 不允许包含字母 特殊字符和空格 我还想禁止全零 如 00000000 Thanks 该模式应该可以满足您的需求 0 d 8 The 0 部分是负前瞻 将阻止仅输入零 Ex
  • 在动态事件处理程序中引用“this”

    在我的 myClass 类中 我使用 Reflection Emit 为 myClass 类成员之一动态编写事件处理程序 我已经成功地做到了这一点 现在 我想修改事件处理程序以调用 myClass 类中的实例方法之一 但是 我无法弄清楚如何
  • C# 创建函数队列

    我写了一个名为 QueueManager 的类 class QueueManager Queue functionsQueue public bool IsEmpty get if functionsQueue Count 0 return
  • 起订量要求?违背了目的?

    是否需要虚拟化您想要模拟的所有属性访问器就违背了模拟的目的 我的意思是 如果我必须修改我的对象并虚拟化我想要模拟的每个访问器 我难道不能继承我的类并自己模拟它吗 你的问题非常有效 但如果你仔细想想 没有其他方法可以模拟课程 如果你采用一个接
  • 如何使用 MVVM 更新 WPF 中编辑的数据? [复制]

    这个问题在这里已经有答案了 我正在为聊天应用程序构建 UI 设计 在尝试更新所选联系人的消息时遇到问题 选择现有联系人 选择编辑选项 然后编辑其属性 例如用户名和图像 后 唯一进行的更改是联系人的用户名和图像 我仍然想更改 MessageM
  • 是否允许将类模板类型参数键入相同的名称?

    这似乎可以在 MSVC 中按预期编译甚至工作 但它是合法的 C 代码吗 它是否能保证执行此处所期望的操作 即将模板类型导出到结构体的同名用户 template
  • 在Application_AquireRequestState事件中用POST数据重写Url

    我有一个在其中注册路线的代码Application AcquireRequestState应用程序的事件 注册路由后 我会在 Http 运行时缓存中设置一个标志 这样我就不会再次执行路由注册代码 在此事件中注册路线有特定原因Applicat
  • C# 中四舍五入到偶数

    我没有看到 Math Round 的预期结果 return Math Round 99 96535789 2 MidpointRounding ToEven returning 99 97 据我了解 MidpointRounding ToE
  • 静态类变量与外部变量相同,只是具有类作用域吗?

    在我看来 静态类变量与外部变量相同 因为你只需要declare它在static int x extern int x语句 并在其他地方实际定义它 通常在 cpp 文件中 静态类变量 h file class Foo static int x
  • 找到的程序集的清单定义与程序集引用不匹配

    我试图在 C Windows 窗体应用程序 Visual Studio 2005 中运行一些单元测试 但出现以下错误 System IO FileLoadException 无法加载文件或程序集 实用程序 版本 1 2 0 200 文化 中
  • Paradox 表 - Oledb 异常:外部表不是预期的格式

    我正在使用 Oledb 从 Paradox 表中读取一些数据 我遇到的问题是 当我将代码复制到控制台应用程序时 代码可以工作 但在 WinForms 中却不行 两者都以 x86 进行调试 我实际上只是复制代码 在 WinForms 应用程序
  • 矩阵向量变换

    我正在编写一个代码来制作软件蒙皮器 骨骼 皮肤动画 并且我正处于 优化 阶段 蒙皮器工作得很好 并且在 Core 上 1 09 毫秒内对 4900 个三角形网格与 22 个骨骼进行蒙皮Duo 2 Ghz 笔记本 我需要知道的是 1 有人可以
  • 是否有像 gccxml 这样的用于生成包装器的 C 标头解析器工具?

    我需要为一种新的编程语言编写一些 C 标头包装器 并且想要类似 gccxml 的东西 但不完全依赖 gcc 以及它在 Windows 系统上带来的问题 只需要读C而不是C 只要有完整的文档记录 任何格式的输出都可以 Linux Solari
  • 您可以在一个 Windows Azure 实例上部署多个 Web 应用程序吗?

    是否可以在一个 windows azure 小型计算实例中运行一堆 Web 应用程序 我正在考虑使用 Azure 作为放置一堆处于开发和非生产状态的项目 Web 应用程序 的地方 有些实际上已经被封存了 但我想在某个地方有一个活跃的实例 我
  • 格式化货币

    在下面的示例中 逗号是小数点分隔符 我有这个 125456 89 我想要这个 125 456 89 其他示例 23456789 89 gt 23 456 789 89 Thanks 看看这个例子 double value 12345 678
  • 更改 IdentityServer4 实体框架表名称

    我正在尝试更改由 IdentityServer4 的 PersistedGrantDb 和 ConfigurationDb 创建的默认表名称 并让实体框架生成正确的 SQL 例如 而不是使用实体IdentityServer4 EntityF
  • 如何用 C 语言练习 Unix 编程?

    经过五年的专业 Java 以及较小程度上的 Python 编程并慢慢感觉到我的计算机科学教育逐渐消失 我决定要拓宽我的视野 对世界的一般用处 并做一些 对我来说 感觉更重要的事情就像我真的对机器有影响一样 我选择学习 C 和 Unix 编程
  • 系统错误 124 - SHFileOperation 的 ERROR_INVALID_LEVEL

    我在使用时遇到问题SHFileOperation SHFileOperation SHFILEOPSTRUCT https stackoverflow com questions 9191415 shfileoperation shfile
  • 允许使用什么类型的内容作为 C 预处理器宏的参数?

    老实说 我很了解 C 编程语言的语法 但对 C 预处理器的语法几乎一无所知 尽管我有时在编程实践中使用它 所以问题来了 假设我们有一个简单的宏 它扩展为空 define macro param 可以放入宏调用构造中的语法有哪些限制 调用宏时
  • 启动画面后主窗口出现在其他窗口后面

    我有一个带有启动屏幕的 Windows 窗体应用程序 当我运行该应用程序时 启动屏幕显示正常 消失并加载应用程序的主窗体 但是 当我加载主窗体时 它出现在包含该应用程序的 Windows 资源管理器目录下 这是运行启动画面然后运行主窗体的代

随机推荐

  • CodeIgniter 动态语言功能

    我是 Codeigniter 我需要为用户提供动态语言 我在标题处添加了下拉菜单 我希望允许用户在前端更改网站的语言 我尝试在一个控制器中使用以下代码更改语言 this gt config gt set item language span
  • JProgressBar 未更新

    我制作了一个非常简单的代码来在此处显示它 我有一个按钮应该显示 JDialog 来检查进度状态 我正在使用延迟调用来完成 EDT 并且我的循环不在 run 方法中 那么为什么我的酒吧没有更新吗 这是代码 import javax swing
  • RSpec 场景概要:多个测试用例

    使用 RSpec 测试一堆不同测试用例的最佳方法是什么 例如 给定字符串添加 rb https gist github com 899520 require rspec class String if method defined reve
  • Spring RMI 的替代方案是什么? (因为它已被弃用)

    Spring 似乎正在弃用它的 RMI 从 Spring Framework 5 3 开始 出于安全原因和更广泛的行业支持 现已弃用对多种远程技术的支持 支持基础设施将从 Spring Framework 的下一个主要版本中删除 但我找不到
  • PyQt - 如何导入 .qss 文件?

    如何将 qt 的样式表 qss 文件导入到应用程序 在 HTML 中我们使用 那么如何在 PyQt 中完成呢 或者我可以在哪里阅读相关内容 无法通过谷歌搜索或在 Qt 文档中找到它 qss 文件是一个简单的文本文件 如果您想将样式表应用于您
  • 使用 WCF 流上传文件,从流中进行微小读取

    我已经使用WCF的流实现了文件上传 一切都按预期进行 但是我遇到了一个问题 我分配 4kb 缓冲区来从传入流中读取数据 但 WCF 仅读取 255 字节 这是我的上传功能 public UploadResponse UploadFile F
  • 一张 Microsoft SQL 表可以有多个主键吗?

    我一直很好奇 但找不到简洁的答案 有什么帮助吗 它不能有超过一个首要的关键 但是 它的主键中可以有多于一列 它也可以有多个唯一索引 通常 唯一索引是主键 但单个表上可以有多个唯一索引 我一时想不出一个例子 但当我想到的时候我会添加它 EDI
  • 如何修复 Eclipse 警告:“建议插件 'XXX' 从 JAR 运行,指定 'unpack="false"' 属性”

    该插件确实需要解压 是的 我知道它不应该关心 但它确实关心 我只是想让这个警告消失 我该怎么做 尝试设置Bundle ClassPath在你的清单中 这个头告诉 OSGi 在你的包中哪里可以找到这些类 如果未指定 则默认值为 这意味着你的包
  • 列表框未选择所选项目

    请参阅下面的代码视觉工作室2010ListBox 上方有一个 TextBox 通过绑定 当选择某个项目时 文本框可以变大或变小 这会导致列表框移动 当列表框移动时 所选项目不是被单击的项目 所选项目是移动的ListBox 上鼠标下方的项目
  • 从不同线程读取值

    我正在用 Go 编写可以进行大量并行计算的软件 我想从工作线程收集数据 但我不太确定如何以安全的方式做到这一点 我知道我可以使用通道 但在我的场景中 它们使事情变得更加复杂 因为我必须以某种方式在主线程中同步消息 等到每个线程发送一些内容
  • R下载。文件错误无法打开URl

    temp lt tempfile download file file connect me test gz temp 该网址存在是因为我可以将其放入浏览器中 但是当我运行该代码时 出现错误 Error in download file f
  • 将 sqldf 中的整数值转换为日期时间

    我正在使用 sqldf 库返回具有不同值的数据框 并且仅返回日期列的最大值 数据框看起来像这样 NAME val1 val2 DATE A 23 7228 0 5829 11 19 2014 8 17 A 23 7228 0 5829 11
  • AngularFire2 - 如何在页面刷新后保持登录状态

    我正在将 AngularFire2 用于应用程序 并且已经获得了与 Firebase 一起使用的注册 登录功能 但是 每次刷新页面时 登录状态都会重置并且不会持续存在 尽管我觉得我错过了一些非常小的东西 但我不太找到执行此操作的功能 我可以
  • 在 FPC 下的自动化对象中使用标识符或保留字

    实际上我在 Free Pascal 下使用 OLE 自动化 但某些对象具有使用保留字作为名称的属性 因此我无法编译代码 检查这个样本 MyObj OleVariant begin MyObj CrealeOleObject AObject
  • 使用 BottomNavigationBar 根据页面更改 AppBar 标题

    我试图根据用户所在的页面更改 AppBar 标题 页面由加载不同类 页面 的 BottomNavigationBar 控制 我设法改变这一点的唯一方法是为每个页面添加一个应用栏 我认为这不是继续下去的方法 class HomePage ex
  • 如何更改 Android 中滚动条的颜色?

    当前的问题是我们的主题继承自 Theme AppCompat 它似乎有一个白色滚动条 并且在白色背景上不可见 我知道我可以使用
  • 三星 S4 上的蓝牙崩溃

    我正在运行一个带有 BLE 扫描的应用程序 一段时间后在 Samsung S4 上或者如果周围有超过 10 个信标 我会看到此错误 07 18 11 51 57 169 W bt userial 7819 userial read thre
  • 如何在 django admin 中显示我的模型的所有字段?

    此代码显示如下对象 Home Object 1 Home Object 2 但我想在我的 django 管理页面中显示所有模型字段 我该怎么做 我是 django 的初学者 这是我的第一个项目 模型 py class Home models
  • R:如何使 data.table 只读而不复制它(例如用于数据验证)

    我进行数据整理 ETL 以将新数据加载到数据库中 并希望让用户基于我现有的实现自己的数据验证功能data table包含准备好的数据的对象 如何避免用户可以更改 修改 我的数据data table在验证函数中 有意或无意 而不进行复制 因为
  • 升级到1.2.162.1后:vkQueueWaitIdle == VK_ERROR_DEVICE_LOST

    我最近将光线追踪渲染器从 Vulkan SDK 版本 1 2 148 0 升级到 1 2 162 1 这是必要的 因为光线追踪扩展已经结束测试版 因此现在可以与非测试版一起使用 显卡驱动程序 我的 RTX 2070 SUPER 的版本为 4