这是这个问题的后续问题,也是基于同样的Vulkan教程提供的代码。
下面是一个简化的示例:
// Vulkan handles defined and initialized elsewhere
VkDevice device;
VkQueue queue;
VkSempahore semaphore;
VkSwapchain swapchain;
VkCommandBuffer cmd_buffer;
// Renderer code
uint32_t image_index; // image acquisition is omitted
VkPresentInfoKHR present_info{};
present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
present_info.waitSemaphoreCount = 1;
present_info.pWaitSemaphores = &semaphore;
present_info.swapchainCount = 1;
present_info.pSwapchains = &swapchain;
present_info.pImageIndices = &image_index;
VkSubmitInfo submit_info{};
submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
// ... irrelevant code omitted
submit_info.pCommandBuffers = &cmd_buffer;
vkQueuePresentKHR(queue, &present_info);
vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
在上面的示例中,cmd_buffer
中的命令是否也必须等待直到发出semaphore
信号?
我问这个问题是因为本教程下面的评论提到:
但是,如果图形和当前队列的结果是相同的,那么
renderFinished
信号量可以保证正确的执行顺序。这是因为vkQueuePresentKHR
命令等待该信号量,并且它必须在队列开始中以后的命令开始之前开始(由于隐式排序),并且只有在从上一个帧呈现完成后才会发生。
发布于 2022-05-25 02:44:09
在上面的例子中,
cmd_buffer
中的命令是否也必须等待信号量被发出?
只有当您将信号量用作后一次提交的waitSemaphore
时,才行。
这是因为vkQueuePresentKHR命令等待该信号量,并且它必须在队列开始中以后的命令开始之前开始(由于隐式排序),并且只有在从上一个帧呈现完成后才会发生。
我不相信这是真的。
命令相对于队列中的其他命令以隐式顺序开始,但这是在逐阶段的基础上执行的。还请注意,规范的措辞是“按顺序开始”,而不是“按顺序完成”,这是一种规范花招。硬件完全可以自由地重叠和无序地执行单独的命令,这些命令在流中是顺序的,除非流包含停止执行的同步原语。
https://stackoverflow.com/questions/72369593
复制相似问题