有几种方法可以处理Vulkan中的同步.这就是我理解的方式:
在我的情况下,我有两个命令缓冲区.我希望第二个命令缓冲区在第一个命令缓冲区之后执行.
submitInfo.pCommandBuffers = &firstCommandBuffer;
vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);
// wait for first command buffer to finish
submitInfo.pCommandBuffers = &secondCommandBuffer;
vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);
Run Code Online (Sandbox Code Playgroud)
什么样的同步最适合这个?如果我使用的vkQueueWaitIdle(queue)),是与使用栅栏相同的东西,或者我应该使用事件或信号量?
如果我同时向队列发送多个命令缓冲区:
std::vector<VkCommandBuffer> submitCmdBuffers = {
firstCommandBuffer,
secondCommandBuffer
};
submitInfo.commandBufferCount = submitCmdBuffers.size();
submitInfo.pCommandBuffers = submitCmdBuffers.data();
Run Code Online (Sandbox Code Playgroud)
还有一种方法可以在第一个和第二个之间同步吗?
Vulkan中RenderPass和Pipeline的逻辑关系是什么?
如果忽略RenderPass,我对渲染过程的理解是先将应用层准备好的顶点数据,然后将纹理数据提交给驱动,然后通过各个阶段的管道,写入Framebuffer后,就可以完成一次渲染。
那么RenderPass的职责是什么?它是为渲染每个阶段(例如格式)提供元数据的抽象,还是有其他作用?
RenderPass 和 Pipeline 是靠感觉的吗?例如,每个流水线都属于一个子通道。或者依赖项,例如流水线的最后一个输出,由 RenderPass 处理。或者是别的什么?
我不知道这是API功能(我几乎可以肯定不是)还是GPU细节,但是为什么例如vkCmdWaitEvents可以在渲染过程的内部和外部vkCmdResetEvent进行记录,而只能在外部进行记录呢?其他命令也一样。