Command bufferCommand buffer用于记录(record)GPU指令(command)。在Vulkan中,指令是通过类似于vkCmdxxx()的接口来写入到Command buffer,驱动会负责生成适配当前GPU的二进制指令内容。VkCmdSetLineWidth示意图Vulkan用command buffer池来管理command buffer对象。command buffer池可以进行更好的内存管理和效率更高的粒度控制。创建Command buffer创建command buffer需先创建command buffer池:VkCommandPoolCreateInfo cmd_pool_info = {};
cmd_pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
cmd_pool_info.pNext = NULL;
cmd_pool_info.queueFamilyIndex = info.graphics_queue_family_index;
cmd_pool_info.flags = 0;
res = vkCreateCommandPool(info.device, &cmd_pool_info, NULL, &info.cmd_pool);
Command buffer池与queue簇是一一对应的关系真人棋牌游戏,创建command buffer池需指定使用的queue簇类型。Command buffer池创建好之后真人棋牌游戏,就可以分配command buffer:VkCommandBufferAllocateInfo cmd = {};
cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
cmd.pNext = NULL;
cmd.commandPool = info.cmd_pool;
cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
cmd.commandBufferCount = 1;
res = vkAllocateCommandBuffers(info.device, &cmd, &info.cmd);Command buffer分配好之后,就可以记录GPU指令了。vkBeginCommandBuffer()用于开启Command buffer的记录状态,vkCmdxxx()用于记录指令,比如:vkCmdSetLineWidth()、vkCmdDraw(),完成记录后用vkEndCommandBuffer()关闭记录状态,变成可提交状态。具体使用后面的章节会介绍。销毁Command buffer销毁command buffer池会自动释放command buffers,手动调vkFreeCommandBuffers是一个良好的习惯:VkCommandBuffer cmd_bufs[1] = {info.cmd};
vkFreeCommandBuffers(info.device, info.cmd_pool, 1, cmd_bufs);
vkDestroyCommandPool(info.device, info.cmd_pool, NULL);