入门调试VulkanSamples(五)——CommandBuffer
入门:调试Vulkan Samples(五)——Command Buffer
◀◀◀点击图片进入游戏————◀◀◀◀———点击图片进入游戏———庄闲游戏,百家乐游戏,庄闲和技巧
Command buffer
Command 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);
入门:调试Vulkan Samples(五)——Command Buffer
Comments
Post a Comment