1. 程式人生 > >Vulkan Cookbook 第三章 2 分配命令緩衝區

Vulkan Cookbook 第三章 2 分配命令緩衝區

分配命令緩衝區

命令緩衝區用於儲存(記錄)稍後提交給佇列的命令,它們位於佇列中由硬體執行處理後給我們結果。當我們建立命令池時,可以用它們來分配命令緩衝區。

怎麼做...

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;

現在我們已經分配了命令緩衝區,可以在應用程式中使用它們。為此需要在一個或多個緩衝區記錄操作,然後將它們提交到佇列。