Vulkan报VUID-vkQueuePresentKHR-03268 semaphore无信号错误如何解决
错误原因
你代码里的Present等待信号量传值错误是直接触发这个Vulkan验证错误的原因:
- 你在提交渲染命令的
SubmitInfo结构里逻辑是正确的:等待_imageAvailableSemaphores(交换链图像可用信号量),渲染完成后触发_renderFinishedSemaphores(渲染完成信号量) - 但你构造
PresentInfoKHR的时候,错误传入了whaitSemaphores(也就是_imageAvailableSemaphores)作为Present操作的等待信号量。这个信号量在本帧vkAcquireNextImageKHR调用完成后就已经被标记为已触发,随后被渲染提交的等待操作消费,全程没有任何操作会再次触发它,所以Present操作等待这个信号量的时候就会触发验证层报错。
修复方案
把你代码里的:
presentInfo.setWaitSemaphores(whaitSemaphores);
修改为:
presentInfo.setWaitSemaphores(signalSemaphores);
Present操作需要等待渲染完成的信号量触发后,才能把渲染好的交换链图像提交到屏幕显示,这是Vulkan帧同步的标准逻辑。
额外检查项
你可以顺便确认以下逻辑是否正确,避免后续出现其他同步错误:
- 调用当前
SubmitCommandBuffer函数之前,已经正确调用vkAcquireNextImageKHR获取imageIndex,并且传入了_imageAvailableSemaphores[_currentFrame]作为获取完成的触发信号量 - 注意你代码里的变量拼写错误:
whaitSemaphores应为waitSemaphores、imgeIndexUint应为imageIndexUint,拼写错误不影响运行但会增加维护成本。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

