问题描述
我正在尝试根据 vulkan-tutorial.com 上的 C++ 教程在 Rust 中编写一个三角形。我可以看到我的三角形,但我的程序在完成 drawFrame
函数 3 次后停止响应。 unsafe {
vkWaitForFences(
self.vulkan.logical_device,1,&self.vulkan.in_flight_fences[self.vulkan.current_frame as usize],VK_TRUE,18446744073709551615,// uint_max
);
}
let mut image_index = 0;
let wait_stages = VkPipelinestageFlagBits_VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
unsafe {
let result = vkAcquireNextimageKHR(
self.vulkan.logical_device,self.vulkan.swapchain,u64::MAX,self.vulkan.image_available_semaphore[self.vulkan.current_frame as usize],null_mut(),&mut image_index,);
if result != VkResult_VK_SUCCESS {
panic!("Couldn't aquire next image. Error code: {}",result);
}
}
if self.vulkan.images_in_flight[image_index as usize] != null_mut() {
unsafe {
vkWaitForFences(
self.vulkan.logical_device,&self.vulkan.images_in_flight[image_index as usize],// uint_max
);
}
}
let wait_semaphores =
[self.vulkan.image_available_semaphore[self.vulkan.current_frame as usize]];
let signal_semaphores =
[self.vulkan.render_finished_semaphore[self.vulkan.current_frame as usize]];
self.vulkan.images_in_flight[image_index as usize] =
self.vulkan.in_flight_fences[self.vulkan.current_frame as usize];
let mut submit_info: VkSubmitInfo = unsafe { core::mem::zeroed() };
submit_info.sType = VkStructureType_VK_STRUCTURE_TYPE_SUBMIT_INFO;
submit_info.waitSemaphoreCount = 1;
submit_info.pWaitSemaphores = wait_semaphores.as_ptr();
submit_info.pWaitDstStageMask = &wait_stages;
submit_info.commandBufferCount = 1;
submit_info.pCommandBuffers = &self.vulkan.command_buffers[image_index as usize];
submit_info.signalSemaphoreCount = 1;
submit_info.pSignalSemaphores = signal_semaphores.as_ptr();
unsafe {
vkResetFences(
self.vulkan.logical_device,);
}
let result = unsafe {
vkQueueSubmit(
self.vulkan.graphics_queue,&submit_info,self.vulkan.in_flight_fences[self.vulkan.current_frame as usize],)
};
if result != VkResult_VK_SUCCESS {
panic!(
"Failed to submit draw command buffer. Error code: {}",result
);
}
let mut present_info: VkPresentInfoKHR = unsafe { core::mem::zeroed() };
present_info.sType = VkStructureType_VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
present_info.waitSemaphoreCount = 1;
present_info.pWaitSemaphores = self.vulkan.render_finished_semaphore.as_ptr();
present_info.swapchainCount = 1;
present_info.pSwapchains = &self.vulkan.swapchain;
present_info.pImageIndices = &image_index;
present_info.pResults = null_mut();
unsafe {
vkQueuePresentKHR(self.vulkan.present_queue,&present_info);
}
self.vulkan.current_frame = (self.vulkan.current_frame + 1) % MAX_FRAMES_IN_FLIGHT;
函数:
UNASSIGNED-CoreValidation-DrawState-QueueForwardProgress and VUID-vkQueuePresentKHR-pWaitSemaphores-03268.
它给了我对我来说毫无意义的错误:
@setproduct-ui
我不想使用 vulkano 或其他 crate,我只想知道我做错了什么。
解决方法
在我看来,您正在等待错误的信号量。
您发出 self.vulkan.render_finished_semaphore[self.vulkan.current_frame]
信号,然后在当前等待 self.vulkan.render_finished_semaphore[0]
。