我正在学习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中使用。然而,情况似乎并非如此。
渲染完成没有问题,我得到了我想要的图像,但我关心修复验证层报告的任何不一致。
答案 0 :(得分:0)
我编写的代码基于这样的前提:队列提交等待的信号量在从vkQueueSubmit返回后没有信号。
不,你的假设是错误的。当发出信号的批量工作完成并且等待此信号量的另一批工作开始时,信号量无信号。但这种情况发生在后台,硬件上。从应用程序的角度来看,您不知道何时发生这种情况,除非您将应用程序与GPU同步(通过vkDeviceWaitIdle(),vkQueueWaitIdle()命令,或者更优选地,通过使用围栏)。
vkQueueSubmit()函数几乎立即返回。但是,您不知道硬件是否会处理批量提交的工作。它可以立即执行,也可能有一些非常大的提交仍在处理中,您的新提交必须等待它完成。你不知道什么时候发生这种情况你不能做任何假设 - 你需要执行某种形式的同步才能确定。
更重要的是 - 它可能(并且可能会)在大多数时间工作。但是可能有一个硬件,你这样做可能无法产生正确的结果。因此,最好修复验证层报告的问题。
查看Vulkan Cookbook中的两个代码示例:关于preparing a single frame of animation和synchronizing presentation of multiple frames的代码示例。
答案 1 :(得分:-1)
此答案不正确,请参阅评论
所以你说你有一个特定的VkSemaphore,你传递给vkQueueSubmit
中的VkSubmitInfo::pWaitSemaphores
,然后你用信号量做的下一件事就是将它传递给{{1} }作为vkAcquireNextImageKHR
参数?
这应该是有效的并且是预期的用法:您应该能够传递由semaphore
发信号通知的信号量并将其传递给vkAcquireNextImageKHR
以等待,然后将该信号量重用于相同的序列在下一帧。
浏览树顶的验证层代码,它看起来应该可行,并且您不应该使用该序列获得此验证错误。所以要么你正在做其他事情(请澄清!),或者验证层错误已经修复,或者我在验证层代码中遗漏了一些东西(请file a bug !)。