分配命令缓冲区
译者注:示例代码点击此处
命令缓冲区用于储存(记录)稍后提交给队列的命令,它们位于队列中由硬件执行处理后给我们结果。当我们创建命令池时,可以用它们来分配命令缓冲区。
怎么做...
1.获取已创建逻辑设备的句柄,并将其储存在名为logical_device的VkDevice类型变量中。
2.获取命令池的句柄并使用它们来初始化名为command_pool的VkCommandPool类型变量。
3.创建名为command_buffer_allocate_info的VkCommandBufferAllocateInfo类型变量,并为其成员分配以下值。
·sTYpe为VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO
·pNext为nullptr
·commandPool为command_pool变量
·level为VK_COMMAND_BUFFER_LEVEL_PRIMARY或VK_COMMAND_BUFFER_LEVEL_SECONDARY
·commandBufferCount为命令缓冲区个数
4.创建一个名为command_buffers的std::vector<VkCommandBuffer>类型向量。调整向量大小,以便能够保存我们想要创建的命令缓冲区的数量。
5.调用vkAllocateCommandBuffers( logical_device, &command_buffer_allocate_info, &command_buffers[0] )。第一个参数提供逻辑设备句柄,第二个参数为command_buffer_allocate_info变量的指针,最后一个参数指向command_buffers第一个元素的指针。
6.成功后,由调用返回的VK_SUCCESS值指示,所有创建好的命令缓冲区的句柄将储存在command_buffers向量中。
这个怎么运作...
命令缓冲区是从命令池分配的。这准许我们控制组中的一些属性。首先,我们只能将命令缓冲区提交给在命令池创建期间选择的族的队列。其次,由于命令池不能同时使用,应该必须为我们想要记录命令的应用程序的每个线程创建单独的命令池,以最小化同步并提高性能。
但是,命令缓冲区也有各自的属性,其中一些是我们开始记录操作时指定的,但需要在命令缓冲区分配期间选择一个非常重要的参数-我们是否要分配主要(primary)或辅助(secondary)命令缓冲区:
·主要命令缓冲区可以直接提交给队列。它们还可以执行(调用)辅助命令缓冲区。
·辅助命令缓冲区只能从主命令缓冲区执行,我们不准许提交它们。
这些参数是通过VkCommandBufferAllocateInfo类型的变量指定的,如下所示:
VkCommandBufferAllocateInfo command_buffer_allocate_info = {
VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
nullptr,
command_pool,
level,
count
};
接下来,要分配命令缓冲区,我们需要以下代码:
command_buffers.resize( count );
VkResult result = vkAllocateCommandBuffers( logical_device, &command_buffer_allocate_info, &command_buffers[0] );
if( VK_SUCCESS != result ) {
std::cout << "Could not allocate command buffers." << std::endl;
return false;
}
return true;
现在我们已经分配了命令缓冲区,可以在应用程序中使用它们。为此需要在一个或多个缓冲区记录操作,然后将它们提交到队列。