gpt4 book ai didi

c++ - Vulkan 队列等待无法发出信号的信号量

转载 作者:行者123 更新时间:2023-12-02 10:18:23 25 4
gpt4 key购买 nike

似乎我有一段时间的无效代码,但验证层保持沉默。将我的 sdk 更新到最新版本后,我开始收到此错误:

Message ID name: VUID-vkQueuePresentKHR-pWaitSemaphores-03268
Message: [ VUID-vkQueuePresentKHR-pWaitSemaphores-03268 ] Object: 0x55b4b87478f0 (Name = Selected logical device : Type = 3) | VkQueue 0x55b4b8224020[Main queue] is waiting on VkSemaphore 0x110000000011[Render Finished Semaphore: 0] that has no way to be signaled. The Vulkan spec states: All elements of the pWaitSemaphores member of pPresentInfo must reference a semaphore signal operation that has been submitted for execution and any semaphore signal operations on which it depends (if any) must have also been submitted for execution. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueuePresentKHR-pWaitSemaphores-03268)
Severity: VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT

这发生在我的主绘制循环内,它是我代码中唯一的验证层错误。如果我从不调用负责表面呈现的代码。我没有错误。

我确定我做错的地方在这里:
void DisplayTarget::StartPass(uint target_num, bool should_clear,
VulkanImage* external_depth)
{
auto device = h_interface->GetDevice();

auto result = device.acquireNextImageKHR(
*swap_chain,
std::numeric_limits<uint64_t>::max(),
*img_available_sems[current_frame],
nullptr,
&active_image_index);

if(result != vk::Result::eSuccess)
Log::RecordLog("Failed to acquire image");
}

vk::Result DisplayTarget::EndPass()
{
auto device = h_interface->GetDevice();
auto cmd_buff = h_interface->GetCmdBuffer();
auto graphics_queue = h_interface->GetQueue();

device.waitForFences(
1,
&*in_flight_fences[current_frame],
VK_TRUE,
std::numeric_limits<uint64_t>::max());

vk::Semaphore wait_semaphores[] = {*img_available_sems[current_frame]};
vk::PipelineStageFlags wait_stages[] = {
vk::PipelineStageFlagBits::eColorAttachmentOutput};
vk::Semaphore signal_semaphores[] = {*render_finished_sems[current_frame]};
vk::SubmitInfo submit_info(
1, wait_semaphores, wait_stages, 1, &cmd_buff, 1, signal_semaphores);

device.resetFences(1, &*in_flight_fences[current_frame]);

auto result =
graphics_queue.submit(1, &submit_info, *in_flight_fences[current_frame]);
if(result != vk::Result::eSuccess)
Log::RecordLog("Failed to submit draw command buffer!");

graphics_queue.waitIdle();
device.waitIdle();

vk::SwapchainKHR swap_chains[] = {*swap_chain};
vk::PresentInfoKHR present_info = {};
present_info.waitSemaphoreCount = 1;
present_info.pWaitSemaphores = signal_semaphores;
present_info.swapchainCount = 1;
present_info.pSwapchains = swap_chains;
present_info.pImageIndices = &active_image_index;

result = graphics_queue.presentKHR(&present_info);

current_frame = (current_frame + 1) % MAX_FRAMES_IN_FLIGHT;

return result;
}

目前它们被连续调用:
display.StartPass();        
display.EndPass();

为了使事情正常进行,我尝试了将这两个函数的部分注释掉或更改调用的顺序,但是错误仍然存​​在,或者我得到了不同的验证错误。

我还尝试直接向信号量发出信号:
vk::SemaphoreSignalInfo semaphore_info = {};
semaphore_info.semaphore = *render_finished_sems[current_frame];
semaphore_info.value = 0;
device.signalSemaphore(semaphore_info);

但我所做的只是导致段错误

最佳答案

错误是操作的顺序。这是错误的:

graphics_queue.waitIdle();
device.waitIdle();

vk::SwapchainKHR swap_chains[] = {*swap_chain};
vk::PresentInfoKHR present_info = {};
present_info.waitSemaphoreCount = 1;
present_info.pWaitSemaphores = signal_semaphores;
present_info.swapchainCount = 1;
present_info.pSwapchains = swap_chains;
present_info.pImageIndices = &active_image_index;

result = graphics_queue.presentKHR(&present_info);

current_frame = (current_frame + 1) % MAX_FRAMES_IN_FLIGHT;

这是正确的用法:
vk::SwapchainKHR swap_chains[] = {*swap_chain};
vk::PresentInfoKHR present_info = {};
present_info.waitSemaphoreCount = 1;
present_info.pWaitSemaphores = signal_semaphores;
present_info.swapchainCount = 1;
present_info.pSwapchains = swap_chains;
present_info.pImageIndices = &active_image_index;

result = graphics_queue.presentKHR(&present_info);

current_frame = (current_frame + 1) % MAX_FRAMES_IN_FLIGHT;

graphics_queue.waitIdle();
device.waitIdle();

关于c++ - Vulkan 队列等待无法发出信号的信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61150202/

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