gpt4 book ai didi

vulkan - vkAcquireNextImageKHR : Application has already acquired the maximum number of images

转载 作者:行者123 更新时间:2023-12-01 11:21:48 26 4
gpt4 key购买 nike

我已经编写了一个可以在我的机器上运行的简单三角形示例,但我收到了一个错误报告,用户无法运行该示例并收到以下验证错误。

vkAcquireNextImageKHR: Application has already acquired the maximum number of images (0x1)" thread 'main' panicked at 'called Result::unwrap() on an Err value: ErrorValidationFailedExt'

我在交换链中创建了 minImageCount + 1maxImageCount 图像。

如果你对我如何呈现图像感到好奇,你可以看到它here .和 record_submit_commandbuffer如果您对我如何提交命令缓冲区感到好奇。

用户还报告说他可以运行 SaschaWillems Vulkan examples ,所以错误很可能在我这边。

我能发现的唯一区别是 SaschaWillems Vulkan examples将创建 N 个预先记录的命令缓冲区,其中 N 是交换链中图像的数量。

VK_CHECK_RESULT(swapChain.acquireNextImage(presentCompleteSemaphore, &currentBuffer));

// Use a fence to wait until the command buffer has finished execution before using it again
VK_CHECK_RESULT(vkWaitForFences(device, 1, &waitFences[currentBuffer], VK_TRUE, UINT64_MAX));
VK_CHECK_RESULT(vkResetFences(device, 1, &waitFences[currentBuffer]));

在我调用 acquireNextImage 之后,我只是重新记录了一个新的命令缓冲区,我立即在命令缓冲区栅栏上等待,然后我调用了 queuePresent

https://www.khronos.org/registry/vulkan/specs/1.0-wsi_extensions/xhtml/vkspec.html#vkAcquireNextImageKHR

Let n be the total number of images in the swapchain, m be the value of VkSurfaceCapabilitiesKHR::minImageCount, and a be the number of presentable images that the application has currently acquired (i.e. images acquired with vkAcquireNextImageKHR, but not yet presented with vkQueuePresentKHR). vkAcquireNextImageKHR can always succeed if a ≤ n - m at the time vkAcquireNextImageKHR is called. vkAcquireNextImageKHR should not be called if a > n - m with a timeout of UINT64_MAX; in such a case, vkAcquireNextImageKHR may block indefinitely.

所以在我的例子中是 a > (m + 1) - m => a > 1 所以错误似乎表明我调用了 vkAcquireNextImageKHR 太早了。但我仍然不太清楚为什么会这样。

在我的机器上运行示例没有问题,也没有出现任何验证错误。我似乎也在做与 SaschaWillems Vulkan examples 基本相同的事情

此外,如果您想自己运行它,它需要 Rust 和 LunarG 验证层。

git clone https://github.com/MaikKlein/ash
cd examples
cargo run --bin triangle

render_loop 的 API 转储

最佳答案

这是 unique_objects 验证层中的一个错误(尚未修复)。它尚未修复,因此还没有真正的解决方案。门票:https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/issues/1670

要解决该错误,您可以:

a) 使用成功的东西(如 VK_RESULT_SUCCESS)初始化 pResults 数组值,并确保还检查 vkQueuePresentKHR() 返回的值作为这个值已经是有效的了。这将在他们修复它或您不使用验证层时起作用,但现在这些值将简单地保持初始化状态,因此不会打扰其他验证层。

b) 将 nullptr 作为 pResults 传递。这将不允许您在将来修复它时检查每个交换链的特定结果。如果你只有一个交换链,那么检查两者可能是多余的......虽然我更喜欢使用 (a) 解决方案。

关于vulkan - vkAcquireNextImageKHR : Application has already acquired the maximum number of images,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41502123/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com