入门调试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

Popular posts from this blog

听到的几个很好笑的滚球解释

布琼布拉博彩公司,布琼布拉博彩网站

捕鱼游戏怎么赚话费