"信号量目前不得发出信号或处于等待状态"

时间:2017-11-16 13:27:51

标签: c++ semaphore vulkan

我正在学习Vulkan。我写了一个简单的程序,在屏幕上呈现单个3D网格对象。问题是我从验证层得到数千个投诉(对于每个渲染的帧),说"DS(ERROR): object: 0x1 type: 5 location: 9900 msgCode: 373295628: vkAcquireNextImageKHR: Semaphore must not be currently signaled or in a wait state." 我编写的代码基于这样的前提:队列提交等待的信号量在从vkQueueSubmit返回后是无信号的,并准备好在下一帧的vkAcquireNextImageKHR中使用。然而,情况似乎并非如此。 渲染完成没有问题,我得到了我想要的图像,但我关心修复验证层报告的任何不一致。

2 个答案:

答案 0 :(得分:0)

  

我编写的代码基于这样的前提:队列提交等待的信号量在从vkQueueSubmit返回后没有信号。

不,你的假设是错误的。当发出信号的批量工作完成并且等待此信号量的另一批工作开始时,信号量无信号。但这种情况发生在后台,硬件上。从应用程序的角度来看,您不知道何时发生这种情况,除非您将应用程序与GPU同步(通过vkDeviceWaitIdle(),vkQueueWaitIdle()命令,或者更优选地,通过使用围栏)。

vkQueueSubmit()函数几乎立即返回。但是,您不知道硬件是否会处理批量提交的工作。它可以立即执行,也可能有一些非常大的提交仍在处理中,您的新提交必须等待它完成。你不知道什么时候发生这种情况你不能做任何假设 - 你需要执行某种形式的同步才能确定。

更重要的是 - 它可能(并且可能会)在大多数时间工作。但是可能有一个硬件,你这样做可能无法产生正确的结果。因此,最好修复验证层报告的问题。

查看Vulkan Cookbook中的两个代码示例:关于preparing a single frame of animationsynchronizing presentation of multiple frames的代码示例。

答案 1 :(得分:-1)

此答案不正确,请参阅评论

所以你说你有一个特定的VkSemaphore,你传递给vkQueueSubmit中的VkSubmitInfo::pWaitSemaphores,然后你用信号量做的下一件事就是将它传递给{{1} }作为vkAcquireNextImageKHR参数?

这应该是有效的并且是预期的用法:您应该能够传递由semaphore发信号通知的信号量并将其传递给vkAcquireNextImageKHR以等待,然后将该信号量重用于相同的序列在下一帧。

浏览树顶的验证层代码,它看起来应该可行,并且您不应该使用该序列获得此验证错误。所以要么你正在做其他事情(请澄清!),或者验证层错误已经修复,或者我在验证层代码中遗漏了一些东西(请file a bug !)。