需要被Record的Command包括将Pipeline和DescriptorSet绑定到Command Buffer的命令、修改Dynamic State、以及DrawCall相关的Command(用于图形渲染),Dispatch的命令(用于计算)、执行Secondary Command Buffer的(仅用于Primary Command Buffer)、复制Buffer和Image的Command以及其他VkCmdXXXX所有的调用如下图所示。 这样做的好处是,当...
上面每一行流程,通过使用Vulkan的Secondary Command Buffer,可以解除依赖关系,并行执行。 比如绘制UI(记录指令)和绘制Mesh(记录指令),不仅仅每个不同的绘制UI结点可以并行,绘制UI结点和绘制Mesh结点,甚至和更新UI结点数据的任务也可以并行。 按照任务流程划分1,只有不同的绘制UI结点会并行,更新结点数据,绘制UI结点和绘制...
辅助命令缓冲区(Secondary Command Buffer)是用于在Vulkan中进行渲染的一种技术。它是一种轻量级的命令缓冲区,可以在主命令缓冲区中调用,以提高渲染效率和灵活性。 辅助命令缓冲区可以包含一系列的绘制命令和其他辅助命令,如状态设置、资源绑定和管线切换等。它们可以被主命令缓冲区调用,并在渲染过程中多次重用,从而减...
次指令缓存(secondary command buffer):不能直接提交给队列,必须嵌套在主指令缓存执行中。适用于记录可重用的指令或者多线程录制指令。 指令池 一个应用程序中指令缓存的数量可能成百上千。Vulkan API 的设计是为了最大化地提升性能,指令缓存的分配通过指令池 VkCommandPool 来完成,从而降低多个指令缓存之间的资源创建...
Vulkan 刻录并提交commandbuffer的架构,更好地支持了多线程渲染。例如Unity PC端实现了用secondary commandbuffer多线程同时渲染同一场景中的物体,UE也利用Vulkan的特性,从渲染线程中抽离出了RHI线程,平均了多核负载,提升了多核效率。 因为Vulkan标准较新,且受到重视,所以在Vulkan标准定制时,直接包含了很多最新的硬件特性...
3) Vulkan 刻录并提交commandbuffer的架构,更好地支持了多线程渲染。例如Unity PC端实现了用secondary commandbuffer多线程同时渲染同一场景中的物体,UE也利用Vulkan的特性,从渲染线程中抽离出了RHI线程,平均了多核负载,提升了多核效率。 4) 因为Vulkan标准较新,且受到重视,所以在Vulkan标准定制时,直接包含了很多最新...
VkCommandBufferLevel指定Command-Buffer的级别。 有如下级别可以使用: typedef enum VkCommandBufferLevel {VK_COMMAND_BUFFER_LEVEL_PRIMARY = 0,VK_COMMAND_BUFFER_LEVEL_SECONDARY = 1,VK_COMMAND_BUFFER_LEVEL_BEGIN_RANGE = VK_COMMAND_BUFFER_LEVEL_PRIMARY,VK_COMMAND_BUFFER_LEVEL_END_RANGE = VK_COMMAND_BUF...
secondary command buffer的begin,这里涉及到vulkan的如下设计规范: secondary cmdbuffer在begin的时候就要传入它所被嵌入的renderpass 和primary cmdbuffer不一样的是,secondary cmd buffer在begin的时候需要指定它所在的renderpass,这意味着虽然primary和secondary是在各自独立的线程记录,但是renderpass这个信息是api record的...
VK_COMMAND_BUFFER_LEVEL_RANGE_SIZE = (VK_COMMAND_BUFFER_LEVEL_SECONDARY - VK_COMMAND_BUFFER_LEVEL_PRIMARY +1), VK_COMMAND_BUFFER_LEVEL_MAX_ENUM =0x7FFFFFFF} VkCommandBufferLevel;复制代码 一般来说,使用VK_COMMAND_BUFFER_LEVEL_PRIMARY就好了。
分成录制和提交的原因就是为了多线程。在vk里大家说的多线程渲染其实基本可以理解为多线程录制,多线程提交其实不太常见,也不好写,而且有更好的方案(往commandbuffer录制并不是直接就能多线程操作的,有很多限制,vk里有一个叫 secondary command buffer的东西可以直接用于多线程录制,不需要任何额外同步)。